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*
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”以查看差异)。这些类型的套接字也不需要特殊权限。