对mmap/dev/mem的权限被拒绝,即使使用CAP_SYS_RAWIO,也可以作为root用户使用

对mmap/dev/mem的权限被拒绝,即使使用CAP_SYS_RAWIO,也可以作为root用户使用,io,mmap,memory-mapping,linux-capabilities,Io,Mmap,Memory Mapping,Linux Capabilities,我们有一个x86主板,它有一些GPIO,可以使用MMIO(内存映射输入/输出)访问。I/O区域位于地址0xfd6d0680及其后(仅一页) 当以root用户身份(使用sudo)执行时,程序运行良好。但是当作为普通用户执行时,对mmap()的调用失败。这在正常情况下是正常的,但据我所知,当可执行文件具有CAP_SYS_RAWIO功能时,它应该可以工作: $ ./ipc_gpio out=0 Read board name: 'MX370QD' ERROR: open '/dev/mem' fail

我们有一个x86主板,它有一些GPIO,可以使用MMIO(内存映射输入/输出)访问。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)可以工作,但是从安全角度来看,我宁愿避免走那么远

谢谢大家!


向您致意,Philipp

CAP_SYS_RAWIO
并不是您访问
/dev/mem
所需的全部。它的常规文件权限也适用。您需要
CAP\u DAC\u READ\u SEARCH
(如果您只想读而不想写),
CAP\u DAC\u OVERRIDE
,setgid
kmem
,或者在
/dev/mem
上更改权限或设置文件ACL

CAP SYS\u RAWIO
并不是访问
/dev/mem
所需的全部。它的常规文件权限也适用。你要么需要
CAP\u DAC\u READ\u SEARCH
(如果你只想读而不想写),
CAP\u DAC\u OVERRIDE
,setgid
kmem
,要么在
/dev/mem

上更改权限或设置文件ACL,
ls-l/dev/mem
说什么?
crw-r-----1根kmem,11月12日14:22/devls-l/dev/mem
说了什么?
crw-r----1root-kmem 11911月12日14:22/dev/mem
据我所知,没有什么冒犯的地方……你是以什么用户/组的身份运行你的程序的?作为第一个非特权用户(1000:1000)将是计划。临时修复程序是以setuid root身份运行它。谢谢,CAP_DAC_OVERRIDE修复了它。我一定忘了一切都只是一个文件…@PhilippBurch注意,从安全的角度来看,你的二进制文件现在有足够的权限来升级自己,如果它只是setuid root,就可以做任何事情。谢谢,CAP_DAC_OVERRIDE修复了它。我一定忘了一切都只是一个文件…@PhilippBurch注意,从安全角度来看,您的二进制文件现在有足够的权限,可以轻松地升级自身,以便在仅为setuid root时执行任何可能的操作。