Linux中的ioctl命令可以完全枚举吗?

为了进行面向安全的源代码审查,我有兴趣查找(全面)所有在Linux内核中注册的ioctl命令。 另外,我想将它们分类为可由pipe理员访问(例如root),哪些可以由非特权用户访问。

我不确定读取内核源代码是否会更容易,或者有什么方法可以在用户空间中查询列表。 如果我需要查看内核,我需要寻找什么函数来注册ioctls?

ioctls实际上并没有在内核中注册,每种类型的类文件对象都有一组不同的ioctls可用。

大多数情况下,它们都是使用switch语句来实现的。

所以你真正需要做的是:

  • 找出哪些设备/文件类型是安全相关的 – 只有root可打开的设备可能不需要检查root-exploits。
  • 弄清楚什么是ioctls。

在实践中找出可用的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命令。