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