Setuid

為什麼 ping 在沒有能力和 setuid 的情況下工作

  • November 4, 2020

我從這裡了解到,有兩種方法可以控制特權活動:setuidcapability.

但是當我在我的機器上玩耍時ping,它似乎可以繞過這兩種機制。

首先,確認在我的機器上/usr/bin/pingcap_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.045.4.0-52-generic

在最近的 Linux 系統上,ping 的最基本操作不需要任何特權,即發送 ICMP 回應要求消息和接收響應回顯回复消息。

Ubuntu 20.04 有兩種 ping 實現。來自iputils-ping的預設設置已安裝 setcapCAP_NET_RAW但適用於沒有特權的 ICMP 回顯。來自inetutils-ping的一個安裝了setuid root,但也適用於沒有特權的ICMP echo。兩者都使用 ICMP 套接字,無需特權即可:

socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) = 3

無論有沒有特權,我都無法在這些實現中的任何一個上重現使用 netlink 套接字進行基本 ping。

引用自:https://unix.stackexchange.com/questions/617927