Linux:如果既未设置 SETUID 也未设置 Capabilities,为什么我可以使用 ping?

Linux: Why am I able to use ping if neither SETUID nor Capabilities are set?

我认为我已经掌握了文件权限和功能的基础知识。 但是现在 - 那是什么?

1.确认没有设置 SETUID 位:

$ ll /bin/ping
-rwxr-xr-x 1 root root 72776 Jan 31 00:11 /bin/ping*

2。确认没有设置功能:

$ getcap /bin/ping
/bin/ping =

3。使用 ping

$ /bin/ping google.com
PING google.com(qro01s18-in-x0e.1e100.net (2607:f8b0:4012:80a::200e)) 56 data bytes
64 bytes from qro01s18-in-x0e.1e100.net (2607:f8b0:4012:80a::200e): icmp_seq=2 ttl=120 time=418 ms
64 bytes from qro01s18-in-x0e.1e100.net (2607:f8b0:4012:80a::200e): icmp_seq=3 ttl=120 time=102 ms

4.验证原始套接字是否打开:

$ strace -e socket ping google.com
socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) = 3
socket(AF_INET6, SOCK_DGRAM, IPPROTO_ICMPV6) = 4
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 5
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 5
socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 5
socket(AF_NETLINK, **SOCK_RAW**|SOCK_CLOEXEC, NETLINK_ROUTE) = 5

>> 那么到底为什么 /bin/ping 允许或能够在没有 SETUID 或 cap_net_raw 的情况下打开 SOCK_RAW? 注意:我当然不是 root 用户! 我正在使用 Linux Mint Ulyana。

创建(正常)ICMP 数据包不再需要特殊权限。您可以使用

socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) = 3
socket(AF_INET6, SOCK_DGRAM, IPPROTO_ICMPV6) = 4

套接字(来自您在 4 中的日志)。

您在

中标记的SOCK_RAW
socket(AF_NETLINK, **SOCK_RAW**|SOCK_CLOEXEC, NETLINK_ROUTE) = 5

是一个NETLINK套接字,用于检查是否可以使用IPv6(用“-4”或“-6”调用“ping”以查看区别)。这些套接字也不需要特殊权限。