一、问题描述
Linux下的"/bin/ping"文件的权限设置如下所示:
那么按照SUID位的定义,如果某个普通用户(作者使用dsl用户)执行ping命令,那么使用
ps -o args -o euser -e | grep 'ping'
命令来查看执行ping命令得到的进程的有效用户,结果应该是root
而实际的结果如下图所示:
二、原因分析
ping进程需要打开socket,这个需要root权限。但是在ping的内部实现中,一旦打开socket之后,ping进程就会把自身进程的有效用户又设置成为实际用户。
参考
ping needs root so it can open a socket in raw mode. That's literally the first thing it does when it starts up:
icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
socket_errno = errno;
That's the only thing it needs root for, so like many programs, it immediately drops its privilege level back to your normal user account:
uid = getuid();
if (setuid(uid)) {
perror("ping: setuid");
exit(-1);
}
参考文献:
[1]http://unix.stackexchange.com/questions/51874/root-owned-program-with-setuid-bit-on