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.
Он по-разному структурирован для каждой подсистемы, поскольку у них разное поведение.