跳转至内容

功能

来自 ArchWiki

Capabilities (POSIX 1003.1e, capabilities(7)) 提供了对超级用户权限的细粒度控制,从而避免了使用 root 用户。鼓励软件开发者用更精简的 capabilities 替换系统中具有强大 setuid 属性的二进制文件。许多软件包都利用了 capabilities,例如 fping 使用 CAP_NET_RAW。这使得普通用户可以运行 fping(如同使用 setuid 方法一样),同时又能限制 fping 潜在漏洞的安全后果。

实现

Capabilities 在 Linux 上使用 *安全* 命名空间中的 扩展属性 (xattr(7)) 来实现。主要的 Linux 文件系统 都支持扩展属性,包括 Ext2、Ext3Ext4BtrfsJFSXFS 和 Reiserfs。以下示例使用 getcap 打印 fping 的 capabilities,然后使用 getfattr 以编码形式打印相同的数据。

$ getcap /usr/bin/fping
/usr/bin/fping cap_net_raw=ep
$ getfattr --dump --match="^security\\." /usr/bin/fping
# file: usr/bin/fping
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=

有些程序会自动复制扩展属性,而其他程序则需要特殊标志。两类程序的示例都可以在 扩展属性#保留扩展属性 中找到。

Capabilities 在 Arch Linux 上通过 安装脚本 来设置,例如 fping.install

管理与维护

如果软件包的 capabilities 权限过于宽松,这将被视为一个 bug,因此这些情况应予以报告而不是在此列出。一个基本等同于 root 访问权限(CAP_SYS_ADMIN)或可以轻易授予 root 访问权限(CAP_DAC_OVERRIDE)的 capability,不被视为 bug,因为 Arch 不支持任何 MAC/RBAC 系统。

警告 许多 capabilities 允许轻易地提升权限。有关示例和解释,请参阅 Brad Spengler 的帖子 False Boundaries and Arbitrary Code Execution

受益于 Capabilities 的其他程序

以下软件包没有 setuid 属性的文件,但需要 root 权限才能运行。通过启用某些 capabilities,普通用户无需提升权限即可使用程序。

capabilities 后面的 +ep 表示 capability 的 *有效* 和 *允许* 集合,更多信息可以在 capabilities(7) § 文件 capabilities 中找到。

程序 命令 (以 root 身份运行)
Beep setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep
chvt(1) setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt
iftop(8) setcap cap_net_raw+ep /usr/bin/iftop
mii-tool(8) setcap cap_net_admin+ep /usr/bin/mii-tool
nethogs(8) setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs
wavemon(1) setcap cap_net_admin+ep /usr/bin/wavemon

一些打包好的二进制文件,例如 mtr(8),已经通过 .install 文件配置了所需的 capabilities。无需像上面那样手动添加 capabilities。

有用的命令

查找 setuid-root 文件

$ find /usr/bin /usr/lib -perm /4000 -user root

查找 setgid-root 文件

$ find /usr/bin /usr/lib -perm /2000 -group root

以临时 Capabilities 运行程序

使用 capsh(1),可以在不修改二进制文件的扩展属性的情况下,以某些特定 capabilities 运行程序。以下示例演示了如何使用 CAP_SYS_PTRACE capability 附加到使用 GDB 的进程。

$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_sys_ptrace+eip" --keep=1 --user="$USER" --addamb="cap_sys_ptrace" --shell=/usr/bin/gdb -- -p <pid>

上面对 sudo 使用 -E 参数是为了将当前用户的登录环境,*例如* PATH 变量等,传递给子进程。

一个使用 netcat 绑定到低端口的示例,在此情况下是 123。

$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_net_bind_service+eip" --keep=1 --user="$USER" --addamb="cap_net_bind_service" --shell=/usr/bin/nc -- -lvtn 123
Listening on 0.0.0.0 123

以上两个示例都只是为了说明目的,因为(在大多数系统上)您都可以将调试器附加到任何用户拥有的进程,或者以 root 用户身份打开小于 1024 的端口,而不管。然而,使用 capsh 可能会提供一些安全优势,因为 capsh --user 以指定用户身份运行,并保留所有正常的内核 capabilities(*即*,限制)。

systemd

通过使用 AmbientCapabilitiesCapabilityBoundingSet,可以为 systemd 服务分配 capabilities,这比在二进制文件上设置 capabilities 安全得多。请参阅 systemd.exec(5)

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.