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

时间:2010-09-13 19:43:13

标签: linux linux-kernel ioctl

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

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

3 个答案:

答案 0 :(得分:5)

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

大部分时间都是使用switch语句实现的。

所以你真正需要做的是:

  • 找出哪些设备/文件类型与安全相关 - 那些只能由root打开的设备可能不需要检查root-exploit。
  • 找出可用的ioctls。

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