为了进行面向安全的源代码审查,我有兴趣查找(全面)所有在Linux内核中注册的ioctl命令。 另外,我想将它们分类为可由pipe理员访问(例如root),哪些可以由非特权用户访问。
我不确定读取内核源代码是否会更容易,或者有什么方法可以在用户空间中查询列表。 如果我需要查看内核,我需要寻找什么函数来注册ioctls?
ioctls实际上并没有在内核中注册,每种类型的类文件对象都有一组不同的ioctls可用。
大多数情况下,它们都是使用switch语句来实现的。
所以你真正需要做的是:
在实践中找出可用的ioctls是不平凡的。 许多设备都有一个列出它们的手册页,但其他设备却没有,列表可能不完整。
通常有一个功能在某个地方有一个大的switch-statement。 然而,有一种“继承”,即许多设备在不同层次上实现了几种不同的逻辑。
通常在几种不同类型的硬件中实现相同的“种类”的驱动程序,并且它们通常共享相当多的代码。
例如,串口在http://lxr.linux.no/#linux+v2.6.35/drivers/serial/serial_core.c#L1107中定义了自己的ioctl
但串行端口也可能在每个驱动程序的基础上定义ioctl,但由于它们是ttys,它们也会响应tty ioctls。
每个子系统都有不同的结构,因为它们有不同的行为。
man ioctl_list还给出了带有小注释和相关头文件的std ioctl命令列表。
对于字符设备,你需要看看他们的file_operations结构 。 在该结构中有一个名为ioctl的函数指针,当您在该设备中调用ioctl时会调用它。
所以做你想要的将是很难的,因为每个设备都有它自己的ioctl命令。