capsh
是 Linux 系统中用于管理和调试进程能力(capability)的工具。能力是 Linux 内核提供的一种细粒度权限控制机制,允许进程在不使用 root 权限的情况下执行特定操作。capsh
提供了一种便捷的方式来设置、修改和验证进程的能力状态,适用于容器化环境、安全测试等场景。
capsh [OPTION]...
OPTION
:可选参数,用于设置能力状态、用户身份、调试信息等。多个选项可以组合使用,按顺序生效。选项 | 说明 |
---|---|
--print |
显示当前进程的能力状态及相关信息。 |
-- [args] |
使用 /bin/bash 执行后续参数。例如:capsh -- -c 'echo Hello' 。 |
--caps=cap-set |
设置当前进程的能力集。cap-set 是能力状态的文本表示。 |
--drop=cap-list |
从当前能力边界集中移除指定的能力。例如:--drop=cap_net_raw 。 |
--inh=cap-list |
设置当前进程的可继承能力集。 |
--user=username |
以指定用户的身份运行命令。 |
--uid=id |
强制设置当前进程的 UID。 |
--gid=id |
强制设置当前进程的 GID。 |
--groups=id-list |
设置当前进程的补充组。 |
`–keep=<0 | 1>` |
--decode=N |
解码能力向量。例如:--decode=0x0100 显示缺失的能力。 |
--supports=xxx |
验证系统是否支持某个能力。例如:--supports=cap_syslog 。 |
--chroot=path |
使用 chroot 将根目录更改为指定路径。需要 CAP_SYS_CHROOT 能力。 |
capsh --print
输出示例:
Current: = cap_net_bind_service,cap_sys_chroot+i
Bounding set =cap_net_bind_service,cap_sys_chroot
说明:显示当前进程的能力状态,包括有效集、可继承集和边界集。
capsh --drop=cap_net_raw --print
输出示例:
Current: = cap_net_bind_service,cap_sys_chroot+i
Bounding set =cap_net_bind_service,cap_sys_chroot
说明:从当前能力边界集中移除 cap_net_raw
能力,并显示更新后的状态。
capsh --user=testuser -- -c 'whoami'
输出示例:
testuser
说明:以 testuser
用户身份运行 whoami
命令,显示当前用户。
capsh --decode=0x0100
输出示例:
0x0100=cap_setpcap
说明:解码能力向量 0x0100
,显示其对应的能力名称。
capsh --supports=cap_syslog
说明:如果系统支持 cap_syslog
,命令会静默退出;否则返回状态码 1
。
capsh --caps="cap_net_bind_service=ep" -- -c 'ping -c 1 127.0.0.1'
说明:设置能力集为 cap_net_bind_service
并运行 ping
命令。
chroot
切换根目录capsh --chroot=/new/root -- -c 'ls /'
说明:将根目录切换为 /new/root
并列出根目录内容。
capsh --inh=cap_net_admin --print
输出示例:
Current: = cap_net_admin+i
Bounding set =cap_net_admin
说明:设置当前进程的可继承能力集为 cap_net_admin
,并显示更新后的状态。
capsh --uid=1000 --gid=1000 -- -c 'id'
输出示例:
uid=1000(testuser) gid=1000(testuser) groups=1000(testuser)
说明:将当前进程的 UID 和 GID 强制设置为 1000
,并运行 id
命令显示用户信息。
capsh --groups=1001,1002 -- -c 'id'
输出示例:
uid=1000(testuser) gid=1000(testuser) groups=1000(testuser),1001,1002
说明:将当前进程的补充组设置为 1001
和 1002
,并运行 id
命令显示组信息。
keep-caps
功能capsh --keep=1 --uid=1000 -- -c 'capsh --print'
说明:启用 keep-caps
功能,允许进程在 setuid
后保留能力,并显示更新后的能力状态。
exec()
行为capsh == --print
说明:再次执行 capsh
并显示能力状态,用于测试 exec()
行为。
CAP_SYS_CHROOT
能力capsh --supports=cap_sys_chroot
说明:验证系统是否支持 CAP_SYS_CHROOT
能力。
capsh --uid=1000 --gid=1000 --caps="cap_net_bind_service=ep" -- -c 'ping -c 1 127.0.0.1'
说明:以 UID 1000
和 GID 1000
的身份运行 ping
命令,并设置能力集为 cap_net_bind_service
。
capsh --drop=cap_net_raw --caps="cap_net_bind_service=ep" --print
说明:移除 cap_net_raw
能力,设置能力集为 cap_net_bind_service
,并显示调试信息。