Ant*_*ton 12 security setuid capabilities
据我所知,ping需要创建一个原始套接字(需要 root 访问权限或cap_net_raw功能)。
根据我的理解,最近几年的趋势是删除setuid二进制文件并用功能替换它们。
但是,当我查看pingFedora 32上的二进制文件时,它看起来没有任何内容:
$ ls -la $(which ping)
-rwxr-xr-x. 1 root root 82960 May 18 10:26 /usr/bin/ping
$ sudo getcap -v $(which ping)
/usr/bin/ping
$
Run Code Online (Sandbox Code Playgroud)
ping 是否需要在 Fedora 上打开原始套接字?还是有另一种方法可以授予它打开原始套接字的权限?
roa*_*ima 14
我认为https://fedoraproject.org/wiki/Changes/EnableSysctlPingGroupRange 可以回答您的问题:
启用 Linux 内核的 net.ipv4.ping_group_range 参数以覆盖所有组。这将允许操作系统上的所有用户在不使用 setuid 二进制文件或具有 CAP_NET_ADMIN 和 CAP_NET_RAW 文件功能的情况下创建 ICMP Echo 套接字。
交叉参考细节
该sysctl的文件写入,
ping_group_range - 2 个整数
将
ICMP_PROTO数据报套接字限制为组范围内的用户。默认值为“1 0”,意思是没有人(甚至不是 root)可以创建 ping 套接字。将其设置为“100 100”将授予单个组的权限。“0 4294967295”将为全世界启用它,“100 4294967295”将为用户启用它,但不是守护进程。
一个较旧的代码示例演示了此功能的使用,并特别显示了使用IPPROTO_ICMP标志创建套接字以标识它将用于原始 ICMP
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)
Run Code Online (Sandbox Code Playgroud)
从Fedora 31 开始,内核参数net.ipv4.ping_group_range 已设置为涵盖所有组。
这将让操作系统上的所有用户创建ICMP Echo不使用套接字setuid的二进制文件,或具有CAP_NET_ADMIN和CAP_NET_RAW文件的能力。
sysctl net.ipv4.ping_group_range
net.ipv4.ping_group_range = 0 2147483647
Run Code Online (Sandbox Code Playgroud)