Pingはrootが所有するプログラムで、ユーザーIDビットが設定されています。
$ ls -l `which ping`
-rwsr-xr-x 1 root root 35752 Nov 4 2011 /bin/ping
私が理解しているように、ユーザーがpingプロセスを実行すると、有効なユーザーIDは実際のユーザーID(つまり、プロセスを開始した人のユーザーID)からユーザーIDルートに変更されます。ただし、これを試し、psの出力を調べて、pingプロセスがrootユーザーとして実行されているかどうかを確認すると、実際のユーザーIDが表示されます。
ps -e -o user,ruser,euser,cmd,args | grep ping
sashan sashan sashan ping -i 10 -c 1000 www.goog ping -i 10 -c 1000 www.google.com
ping
は、rawモードでソケットを開くことができるようにrootが必要です。それは文字通り、起動時に最初に行うことです。
icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
socket_errno = errno;
Rootが必要なのはそれだけなので、多くのプログラムと同様に、特権レベルを通常のユーザーアカウントにすぐに戻します。
uid = getuid();
if (setuid(uid)) {
perror("ping: setuid");
exit(-1);
}