我正在通过运行以下命令查看系统上具有 setuid 权限的少数文件:
sudo find / -perm -4000
Run Code Online (Sandbox Code Playgroud)
我注意到它/bin/ping
出现在列表中。
谁能解释为什么 ping 需要 setuid 权限?
Ste*_*ris 20
为了ping
工作,它需要能够创建一个原始网络套接字。这通常是特权操作。
在现代 Linux 系统上,这可以被授予“能力”
例如在 CentOS 7 上:
$ ls -l /bin/ping
-rwxr-xr-x 1 root root 62088 Nov 7 2016 /bin/ping*
$ getcap /bin/ping
/bin/ping = cap_net_admin,cap_net_raw+p
Run Code Online (Sandbox Code Playgroud)
在 Debian 9.1 (Stretch) 上:
$ getcap /bin/ping
/bin/ping = cap_net_raw+ep
Run Code Online (Sandbox Code Playgroud)
功能是一种较新的方式,可以执行更细粒度的特权升级,而无需授予 setuid 程序授予的整个“root”权限。
如果没有功能,则ping
需要 setuid root,以便创建原始网络套接字。