Linux下执行ping命令创建得到的进程的有效用户不是root

一、问题描述
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

你可能感兴趣的:(Linux下执行ping命令创建得到的进程的有效用户不是root)