具有 setuid 位的 root 拥有的程序

具有 setuid 位的 root 拥有的程序

Ping 是 root 拥有的一个程序,它设置了用户 ID 位。

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

据我了解,如果用户运行 ping 进程,那么有效用户 id 将从真实用户 id(即启动该进程的人的用户 id)更改为用户 id root。但是,当我尝试此操作并查看 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

答案1

ping需要 root 才能以原始模式打开套接字。这实际上是它启动时所做的第一件事:

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

这是它唯一需要root权限的事情,所以像许多程序一样,它会立即将其权限级别降回到您的普通用户帐户:

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

相关内容