Security

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

  • January 27, 2021

據我所知,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
$   

ping 是否需要在 Fedora 上打開原始套接字?還是有另一種方法可以授予它打開原始套接字的權限?

我認為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)

引用自:https://unix.stackexchange.com/questions/592911