如何使用capsh:我正在尝试以最小的功能运行无特权的ping


13

我正在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

我一直在做更多的研究,然后再次阅读该手册。在以下情况下,正常情况下ep功能会丢失:您从用户切换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位。

1
您是否在更高版本的上游发行版中尝试了Lekensteyn的示例?capsh从collab-maint存储库中获取信息并不会给您“最新的”信息capsh,Debian软件包仍然不支持环境功能。上游2.27可以。
史蒂芬·基特

1
@StephenKitt很高兴知道,但是最初的问题是capsh在没有环境的情况下(原先是什么)有什么用。我想念什么。它必须有用途。
ctrl-alt-

Answers:


11

能力是过程的属性。传统上有三套:

  • 允许的能力(p):在当前过程中可能被“激活”的能力。
  • 有效功能(e):在当前流程中当前可用的功能。
  • 可继承功能(i):可以继承的文件功能。

以root用户身份运行的程序始终具有完全允许的有效功能,因此“添加”更多功能不会产生明显的影响。(可继承功能集通常为空。)setcap cap_net_raw+ep ping默认情况下,对于运行此程序的任何用户,您都将启用这些功能。

不幸的是,这些功能已绑定到已执行的文件,并且在执行新的子进程之后不会保留这些功能。Linux 4.3引入了环境功能,该功能允许功能由子进程继承。(另请参见execve的()中转化的能力功能(7) 。)

在使用功能时,请注意以下陷阱:

  • 将用户从root更改为non-root时,将清除有效和允许的功能(请参阅用户ID更改对功能(7)功能的影响)。您可以使用的--keep=1选项capsh以避免清除设置。
  • 更改用户或组ID时,将清除环境功能集。解决方案:更改用户ID之后但执行子进程之前添加环境功能。
  • 如果功能已经在允许和可继承功能集中,则只能将其添加到环境功能集中。

capshlibcap 2.25中的程序尚不能修改环境功能,但是以后的版本中添加了新选项。请注意,选项顺序很重要。用法示例:

sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \
    --keep=1 --user=nobody --addamb=cap_net_raw -- \
    -c "./ping -c1 127.0.0.1"

提示:您可以--printcapsh命令行中的任何位置添加该选项,并查看其当前功能状态。

注意:该选项cap_setpcap需要--addamb一段时间。cap_setuid,cap_setgid--user


6

Lekensteyn的答案似乎是准确而完整的,但我将尝试从不同的角度提供另一种解释,以试图强调环境功能集所解决的问题。

运行时,sudo capsh --user=<some_user> --有2个引起您重新计算(并且可能会删除)功能的系统调用:

  1. setuid:根据man capabilities

SECBIT_KEEP_CAPS设置此标志允许具有一个或多个0 UID的线程在将其所有UID都切换为非零值时保留其功能。如果未设置此标志,则此类UIDswitch导致线程失去所有功能。

换句话说,在capsh上面的命令中,我们需要确保在setuid系统调用期间设置了SECBIT_KEEP_CAPS 。否则,所有功能都会丢失。这是做什么的--keep=1。所以现在命令变成sudo capsh --user=<some_user> --keep=1 --

  1. execve:如果我们使用的--keep=1选项,所有的能力集(有效的,允许的,可继承)将被保留,直到execve系统调用,但execve会导致功能被重新计算(非root用户)的欢迎,并在一个不那么明显的方式。简而言之,在添加环境功能set之前,要使某个功能在execve调用后处于线程的“允许”集中,请执行以下任一操作:

    • 该文件必须在其“允许”集中具有该功能。可以使用来完成setcap cap_net_raw+p /bin/bash。这样做使整个练习变得毫无用处,因为线程的功能集(除了边界集之外)不再起作用。
    • 文件和线程都必须在其“可继承”集中具有该功能。您可能认为这setcap cap_net_raw+i可以解决问题,但事实证明,execve当非特权用户调用该线程时,该线程的固有权限将被丢弃(我们目前感谢setuid)。因此,没有办法以非特权用户的身份满足此条件。

Linux 4.3中引入的环境功能使线程可以保留其功能,即使在setuid对非特权用户使用a之后再使用execve,也可以保留其功能,而不必依赖文件功能。


2

内核中可能存在错误/功能。进行了一些讨论:

我不知道是否进行了修复。

不要误会我的意思-当前的行为是安全的。但是它是如此安全,以至于妨碍了看起来应该起作用的事情。

编辑:根据http://man7.org/linux/man-pages/man7/capabilities.7.html,有一个新的功能集Ambient(自Linux 4.3起)。看起来这将满足需要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.