Можно ли полностью перечислить команды ioctl в Linux?
В целях проверки исходного кода, ориентированного на безопасность, мне интересно найти (всесторонне) все команды ioctl, которые зарегистрированы в ядре Linux. Кроме того, я хотел бы классифицировать их как доступные администраторам (например, root), и какие из них доступны непривилегированным пользователям.
Я не уверен, будет ли проще читать исходный код ядра или есть какой-то способ сделать запрос в списке в пространстве пользователя. Если мне нужно искать в ядре, какие функции мне нужно искать для регистрации ioctls?
3 ответа
ioctls фактически не регистрируются в ядре, каждый тип файлового объекта имеет свой набор доступных ioctl.
Большую часть времени они реализуются с помощью оператора switch.
Итак, что вам действительно нужно сделать, это:
- Выясните, какой набор устройств / типов файлов имеет отношение к безопасности - те устройства, которые открываются только root, предположительно, не нуждаются в такой проверке на наличие root-эксплойтов.
- Определите, какие ioctls доступны.
На практике выяснить, какие ioctl доступны, нетривиально. Многие устройства имеют справочную страницу, которая перечисляет их, а другие нет, и этот список может быть неполным.
Обычно где-то есть функция с большим оператором switch. Однако существует своего рода "наследование", при котором многие устройства имеют несколько разных типов ioctl, реализованных на разных уровнях.
Один и тот же "тип" драйвера обычно реализуется на нескольких различных типах оборудования, и они часто используют довольно много кода.
Например, последовательные порты имеют свои собственные ioctl, определенные в http://lxr.linux.no/#linux+v2.6.35/drivers/serial/serial_core.c#L1107
Но у последовательных портов также потенциально могут быть определены ioctl для каждого драйвера, но, поскольку они являются ttys, они также отвечают на tty ioctl.
Он по-разному структурирован для каждой подсистемы, потому что у них разное поведение.
man ioctl_list также предоставляет список команд std ioctl с небольшой заметкой и соответствующим заголовочным файлом.
Для символьных устройств вам нужно взглянуть на их структуру file_operations. В этой структуре есть указатель на функцию ioctl, которая вызывается при вызове ioctl на этом устройстве.
Делать то, что вы хотите, будет сложно, так как каждое устройство имеет свои собственные команды ioctl.