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