Можно ли полностью перечислить команды ioctl в Linux? - PullRequest
3 голосов
/ 13 сентября 2010

В целях проверки исходного кода, ориентированного на безопасность, мне интересно найти (всесторонне) все команды ioctl, которые зарегистрированы в ядре Linux.Кроме того, я хотел бы классифицировать их как доступные для администраторов (например, root), и какие из них доступны для непривилегированных пользователей.

Я не уверен, будет ли легче читать исходный код ядраили если есть какой-то способ запросить список в пользовательском пространстве.Если мне нужно искать в ядре, какие функции мне нужно искать для регистрации ioctls?

Ответы [ 3 ]

5 голосов
/ 15 сентября 2010

ioctl фактически не регистрируются в ядре, каждый тип файлового объекта имеет свой набор доступных ioctl.

Большую часть времени они реализуются с помощью оператора switch.

Итак, что вам действительно нужно сделать, это:

  • Выясните, какой набор устройств / типов файлов имеет отношение к безопасности - те устройства, которые открываются только root, предположительно, не нуждаются в такой проверкедля root-эксплойтов.
  • Выясните, какие ioctl доступны.

На практике выяснить, какие ioctl доступны, нетривиально.Многие устройства имеют справочную страницу, которая перечисляет их, а другие нет, и этот список может быть неполным.

Обычно где-то есть функция с большим оператором-переключателем.Однако существует своего рода «наследование», при котором многие устройства имеют несколько разных видов ioctl, реализованных на разных уровнях.

Один и тот же «тип» драйвера обычно реализуется на нескольких разных типах оборудования, и оничасто используют довольно много кода.

Например, последовательные порты имеют свои собственные ioctl, определенные в http://lxr.linux.no/#linux+v2.6.35/drivers/serial/serial_core.c#L1107

Но последовательные порты также потенциально имеют ioctl, определенные для каждого драйвера, нопоскольку они являются ttys, они также реагируют на tty ioctls.

Он по-разному структурирован для каждой подсистемы, поскольку у них разное поведение.

2 голосов
/ 14 сентября 2010

man ioctl_list также предоставляет список команд std ioctl с небольшой заметкой и соответствующим заголовочным файлом.

1 голос
/ 13 сентября 2010

Для символьных устройств вам нужно посмотреть на их структуру file_operations . В этой структуре есть указатель на функцию ioctl, которая вызывается при вызове ioctl на этом устройстве.

Поэтому делать то, что вы хотите, будет сложно, поскольку у каждого устройства есть свои собственные команды ioctl.

...