我正在Debian Gnu / Linux上试验功能。
我已将/ bin / ping复制到当前工作目录。不出所料,它最初是setuid root。
然后,通过执行sudo /sbin/setcap cap_net_raw=ep ./ping
,使ping具有最少的功能(不是root),并且ping可以正常工作。
然后sudo /sbin/setcap -r ./ping
撤销该功能。现在,它无法按预期工作。
我现在尝试使用ping进行工作capsh
。
capsh
没有特权,因此我需要以超级用户身份运行它,但是然后删除超级用户,从而获得所有其他特权。
我想我也需要secure-keep-caps
,这没有记录在capsh
,而是在功能手册中。我从那里得到位数/usr/include/linux/securebits.h
。它们似乎是正确的,因为的输出--print
显示这些位是正确的。
我已经摆弄了几个小时,到目前为止,我已经有了这个。
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
但是,ping
出现错误时ping: icmp open socket: Operation not permitted
,这是当它不具有此功能时发生的。同样的--print
节目Current: =p cap_net_raw+i
,这还远远不够e
。
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
会将功能设置Current: = cap_net_raw+eip
为正确,但将我们设置为root
。
编辑1
我现在尝试了 sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
这将产生:
touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted
第一个错误是预期的,secure-noroot: yes
但第二个不是Current: = cap_net_raw+eip
编辑2
如果我放在==
之前--print
,它现在显示Current: = cap_net_raw+i
,则可以解释先前的错误,但不能解释为什么从根目录切换时我们失去功能,但是我secure-keep-caps
应该可以解决此问题。
编辑3
从我所看到的,我在调用exec时失去了有效(e)和允许(p)。这是预料之中的,但是我认为安全保持上限应该阻止它们丢失。我错过了什么吗?
编辑4
我一直在做更多的研究,然后再次阅读该手册。在以下情况下,正常情况下e
,p
功能会丢失:您从用户切换root
(或应用secure-noroot
,从而使root用户成为普通用户),可以用来替代secure-keep-caps
;当您致电时exec
,据我所知这是一个不变式。
据我所知,它正在按照手册工作。据我所知,没有任何方法可以对capsh
。据我所知,要使用功能,您需要:使用文件功能或具有不使用的功能感知程序exec
。因此,没有特权包装器。
所以,现在我的问题是我缺少什么,什么是capsh
对。
编辑5
我添加了一个关于环境的答案。也许capsh
也可以与继承的功能一起使用,但是要使它们有用,需要在可执行文件上进行设置。我看不到没有环境功能或允许继承功能,capsh怎么能做任何有用的事情。
版本:
capsh
从软件包libcap2-bin
版本1:2.22-1.2
- 在edit-3之前,我
capsh
从中获取了最新版本git://git.debian.org/collab-maint/libcap2.git
并开始使用它。 uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
用户土地是32位。
capsh
在没有环境的情况下(原先是什么)有什么用。我想念什么。它必须有用途。
capsh
从collab-maint存储库中获取信息并不会给您“最新的”信息capsh
,Debian软件包仍然不支持环境功能。上游2.27可以。