mmap /dev/mem 的权限被拒绝,即使使用 CAP_SYS_RAWIO,但作为 root 工作

Permission denied for mmap /dev/mem, even with CAP_SYS_RAWIO, but works as root

我们有一个 x86 主板,它有一些可以使用 MMIO(内存映射 input/output)访问的 GPIO。 I/O 区域位于地址 0xfd6d0680 及以下地址(仅一页)。

程序在以 root 身份执行时运行良好(使用 sudo)。但是以普通用户身份执行时,对 mmap() 的调用失败。这在正常情况下是预期的,但据我所知,当可执行文件被赋予 CAP_SYS_RAWIO 能力时它应该工作:

$ ./ipc_gpio out=0
Read board name: 'MX370QD'
ERROR: open '/dev/mem' failed: Permission denied (13)
$ sudo setcap CAP_SYS_RAWIO+ep ipc_gpio
$ ./ipc_gpio out=0
Read board name: 'MX370QD'
ERROR: open '/dev/mem' failed: Permission denied (13)
$ sudo ./ipc_gpio out=0
Read board name: 'MX370QD'

$ getcap ipc_gpio
ipc_gpio = cap_sys_rawio+ep

这个地址区域是否有其他限制?还是为此目的需要另一种能力? 我想使可执行文件 setuid root(或者可能是 setgid kmem)会起作用,但从安全的角度来看,我宁愿避免走那么远。

谢谢!

此致,菲利普

CAP_SYS_RAWIO 并不是访问 /dev/mem 所需的全部内容。它的常规文件权限也适用。您需要 CAP_DAC_READ_SEARCH(如果您只想读取而不是写入)、CAP_DAC_OVERRIDE、setgid kmem,或者更改权限或在 /dev/mem 上设置文件 ACL。