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 프로세스가 루트로 실행되고 있는지 확인하기 위해 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

ping원시 모드에서 소켓을 열려면 루트가 필요합니다. 실제로 시작 시 가장 먼저 수행되는 작업은 다음과 같습니다.

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

이는 루트 액세스가 필요한 유일한 작업이므로 많은 프로그램과 마찬가지로 권한 수준을 즉시 일반 사용자 계정으로 되돌립니다.

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

관련 정보