setuidビットがオンのルート所有プログラム


13

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

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

私が理解しているように、ユーザーがpingプロセスを実行すると、実際のユーザーID(プロセスを起動した人のユーザーID)からユーザーIDルートに変わります。ただし、これを試し、psの出力を見て、pingプロセスがルートユーザーとして実行されているかどうかを確認しても、実際のユーザー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

関連する質問はunix.stackexchange.com/questions/152595です。
JdeBP

回答:


20

pingrawモードでソケットを開くことができるようにrootが必要です。それは文字通り、起動時に最初に行うことです:

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

それがルートを必要とする唯一のことなので、多くのプログラムと同様に、通常のユーザーアカウントにすぐにその特​​権レベルを落とします。

uid = getuid();
if (setuid(uid)) {
    perror("ping: setuid");
    exit(-1);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.