Linux:如果既没有设置 SETUID 也没有设置功能,为什么我能够使用 ping?

apa*_*ato 3 linux acl file-permissions ping linux-capabilities

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

1. 验证是否没有设置 SETUID 位:

$ ll /bin/ping
-rwxr-xr-x 1 root root 72776 Jan 31 00:11 /bin/ping*
Run Code Online (Sandbox Code Playgroud)

2. 验证是否没有设置任何功能:

$ getcap /bin/ping
/bin/ping =
Run Code Online (Sandbox Code Playgroud)

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

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

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

ens*_*nsc 5

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

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

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

SOCK_RAW您在中标记的

socket(AF_NETLINK, **SOCK_RAW**|SOCK_CLOEXEC, NETLINK_ROUTE) = 5
Run Code Online (Sandbox Code Playgroud)

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