为什么 ping 在没有能力和 setuid 的情况下也能工作

zin*_*dle 5 setuid setcap capabilities

我从这里了解到有两种方法可以控制特权活动: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
Run Code Online (Sandbox Code Playgroud)

复制二进制文件会删除该功能,但它仍然有效:

$ 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]
Run Code Online (Sandbox Code Playgroud)

我正在使用Ubuntu 20.045.4.0-52-generic

Gil*_*il' 5

在最新的 Linux 系统上,ping 的最基本操作不需要任何权限,即发送 ICMP 回显请求消息并接收响应的回显回复消息。

Ubuntu 20.04 有两种 ping 实现。默认的iputils-ping已安装 setcap,CAP_NET_RAW但无需特权即可用于 ICMP echo。inetutils-ping中的一个安装了 setuid root,但也适用于没有特权的 ICMP echo。两者都使用 ICMP 套接字,无需特权即可使用:

socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) = 3
Run Code Online (Sandbox Code Playgroud)

我无法在这些实现中重现使用 netlink 套接字进行基本 ping,无论有或没有特权。