在没有 setuid 和功能的情况下,ping 在 Fedora 上如何工作?

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 套接字。

交叉参考细节

  • 目标版本:Fedora 31
  • 最后更新:2019-08-13
  • 跟踪器错误:# 1740809
  • 发行说明跟踪器:# 376

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)


bin*_*sta 9

Fedora 31 开始,内核参数net.ipv4.ping_group_range 已设置为涵盖所有组。

这将让操作系统上的所有用户创建ICMP Echo不使用套接字setuid的二进制文件,或具有CAP_NET_ADMINCAP_NET_RAW文件的能力。

sysctl net.ipv4.ping_group_range

net.ipv4.ping_group_range = 0   2147483647
Run Code Online (Sandbox Code Playgroud)