setuid ビットを使用するルート所有プログラム

setuid ビットを使用するルート所有プログラム

Ping は、ユーザー ID ビットを設定するルート所有のプログラムです。

$ ls -l `which ping`
-rwsr-xr-x 1 root root 35752 Nov  4  2011 /bin/ping

私が理解したのは、ユーザーがpingプロセスを実行すると、有効なユーザーIDが実際のユーザーID(つまり、プロセスを開始したユーザーのユーザーID)からユーザーIDのルートに変更されることです。しかし、これを試して、pingプロセスがrootとして実行されていることを確認するためにpsの出力を見ると、まだ実際のユーザー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

答え1

pingraw モードでソケットを開くにはルートが必要です。実際に起動時に最初に行われることは次のとおりです。

icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
socket_errno = errno;

これはrootアクセスを必要とする唯一のタスクであるため、多くのプログラムと同様に、特権レベルをすぐに通常のユーザーアカウントに戻します。

uid = getuid();
if (setuid(uid)) {
    perror("ping: setuid");
    exit(-1);
}

関連情報