3

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

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

4

3 回答 3

5

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

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

所以你真正需要做的是:

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

在实践中,找出可用的 ioctl 并非易事。许多设备都有列出它们的手册页,但其他设备没有,而且该列表可能不完整。

通常在某个地方有一个带有大开关语句的函数。然而,有一种“继承”,许多设备在不同级别实现了几种不同类型的 ioctl。

相同“种类”的驱动程序通常在几种不同类型的硬件中实现,并且它们通常共享相当多的代码。

例如,串口在http://lxr.linux.no/#linux+v2.6.35/drivers/serial/serial_core.c#L1107中定义了自己的 ioctl

但是串行端口也可能具有基于每个驱动程序定义的 ioctl,但由于它们是 tty,它们也响应 tty ioctl。

每个子系统的结构不同,因为它们具有不同的行为。

于 2010-09-15T05:14:25.510 回答
2

man ioctl_list 还提供了带有小注释和相关头文件的 std ioctl 命令列表。

于 2010-09-14T04:53:07.180 回答
1

对于字符设备,您需要查看它们的file_operations 结构。该结构中有一个名为 ioctl 的函数指针,当您在该设备中调用 ioctl 时会调用该函数指针。

所以做你想做的事会很困难,因为每个设备都有自己的 ioctl 命令。

于 2010-09-13T19:51:13.833 回答