Setuid
為什麼 ping 在沒有能力和 setuid 的情況下工作
我從這裡了解到,有兩種方法可以控制特權活動:
setuid
和capability
.但是當我在我的機器上玩耍時
ping
,它似乎可以繞過這兩種機制。首先,確認在我的機器上
/usr/bin/ping
有cap_net_raw
能力並且它使用SOCK_RAW
:$ ll /usr/bin/ping -rwxr-xr-x 1 root root 72K Jan 31 2020 /usr/bin/ping $ getcap /usr/bin/ping /usr/bin/ping = cap_net_raw+ep $ strace -e socket ping <some-ip> socket(AF_NETLINK, SOCK_RAW|SOCK_CLOEXEC, NETLINK_ROUTE) = 5
複製二進製文件將放棄該功能,但它仍然有效:
$ cp /usr/bin/ping ~ $ ll ~/ping -rwxr-xr-x 1 user user 72K Nov 4 16:54 /home/user/ping $ getcap ~/ping [empty result] $ ~/ping <some-ip> [it works]
我正在使用
Ubuntu 20.04
和5.4.0-52-generic
。
在最近的 Linux 系統上,ping 的最基本操作不需要任何特權,即發送 ICMP 回應要求消息和接收響應回顯回复消息。
Ubuntu 20.04 有兩種 ping 實現。來自iputils-ping的預設設置已安裝 setcap
CAP_NET_RAW
但適用於沒有特權的 ICMP 回顯。來自inetutils-ping的一個安裝了setuid root,但也適用於沒有特權的ICMP echo。兩者都使用 ICMP 套接字,無需特權即可:socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) = 3
無論有沒有特權,我都無法在這些實現中的任何一個上重現使用 netlink 套接字進行基本 ping。