為什麼桌面版 Linux 運行 ping 程序,不需要 root 許可權?

ping程序需要使用SOCK_RAW來構建包,按理這是需要root許可權才能運行的程序,但是沒有哪個發行版需要root許可權來進行ping,這是如何做到的?


我覺著是這樣吧:

sunus@ubuntu:/bin$ ls -l ping

-rwsr-xr-x 1 root root 34716 2010-07-28 01:44 ping

我的linux發行版是ubuntu,ping程序的執行許可權中的set-user-ID(suid,左數第四個)位默認是被置位的,即該程序默認是以所有者許可權運行的,對於ping,所有者為root。所以普通用戶 不需要sudo也可以運行該程序。

sunus@ubuntu:/bin$ sudo chmod -s ping

sunus@ubuntu:/bin$ ping http://www.baidu.com

ping: icmp open socket: Operation not permitted

這是把suid位取消後的情況,需要root許可權了:)


「若文件的所有者是超級用戶,而且設置了該文件的設置用戶位(suid),然後該程序由一個進程執行時,則該進程具有超級用戶特權。」 ——《APUE》


可以設置 CAP_NET_RAW. 需要 root 許可權那是多年前的事了。

另:Linux-3.0 之後應該是不需要特權了:

http://kernelnewbies.org/Linux_3.0#head-c5bcc118ee946645132a834a716ef0d7d05b282e

"... the patch makes it possible to implement setuid-less and CAP_NET_RAW-less /bin/ping. Initially this functionality was written for Linux 2.4.32 ..."


SOCK_RAW是需要ROOT許可權的,但是ping有suid標識,因此可以執行。

關於suid的知識,可以看 http://en.wikipedia.org/wiki/Setuid


@李小天分析得很對,ping 確實是設置了 sid 位,所以是以 root 許可權執行。


一般來說,Ping 不會給系統造成什麼安全上的隱患,也不涉及更改系統設置,只是用來測試網路連通性而已。

同理,Windows下CMD中執行ping同樣不需要管理員許可權。

---------

感謝@李小天,受教了……知其然更要知其所以然,謝謝!


在ubuntu下面是需要setuid的,但是在最新的archlinux下面是不需要setuid的。只需要設置

net_raw相關的cap許可權即可

ls /bin/ping -lh

-rwxr-xr-x 1 root root 60K Feb 11 2017 /bin/ping

getcap /bin/ping

/bin/ping = cap_net_raw+ep


系統不是按照內部所調用的API來劃分許可權的。你這麼說malloc也是很危險的。


排名最高的答案是正解,用suid臨時為該進程獲取root許可權,如果ping有bug沒能在進程結束正確的drop許可權,會造成安全問題。


推薦閱讀:

RHEL比起ubuntuserver,suse技術上強大多少?
如何理解互斥鎖和信號量,以及他們在系統編程中是如何配合使用的?
Linux進程間如何傳遞文件描述符?
linux下隱藏自己的文件和進程是如何做到的?
如何理解Linux中的OOM(Out Of Memory Killer)機制?

TAG:操作系統 | 編程 | Linux | Ubuntu | C編程語言 |