기능 및 setuid 없이 ping이 작동하는 이유

기능 및 setuid 없이 ping이 작동하는 이유

나는 그것으로부터 배웠다여기setuid권한 있는 활동을 제어하는 ​​방법에는 두 가지 가 있습니다 capability.

하지만 내 컴퓨터에서 플레이할 때 ping두 메커니즘을 모두 우회하는 것 같습니다.

먼저 내 컴퓨터 /usr/bin/pingcap_net_raw가능하고 다음을 사용하는지 확인합니다 SOCK_RAW.

$ ll /usr/bin/ping
-rwxr-xr-x 1 root root 72K Jan 31  2020 /usr/bin/ping

$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep

$ strace -e socket ping <some-ip>
socket(AF_NETLINK, SOCK_RAW|SOCK_CLOEXEC, NETLINK_ROUTE) = 5

바이너리를 복사하면 해당 기능이 제거되지만 여전히 작동합니다.

$ cp /usr/bin/ping ~

$ ll ~/ping
-rwxr-xr-x 1 user user 72K Nov  4 16:54 /home/user/ping

$ getcap ~/ping
[empty result]

$ ~/ping <some-ip>
[it works]

나는 Ubuntu 20.04및 을 사용하고 있습니다 5.4.0-52-generic.

답변1

최근 Linux 시스템에서는ping의 가장 기본적인 작업에는 권한이 필요하지 않습니다.즉, ICMP 에코 요청 메시지를 보내고 응답 에코 응답 메시지를 받는 것입니다.

Ubuntu 20.04에는 두 가지 ping 구현이 있습니다. 기본값, 시작iputils-ping, setcap이 설치되었지만 CAP_NET_RAWICMP 에코와 함께 작동하며 권한이 필요하지 않습니다. 그것은에서 오는inetutils-pingsetuid 루트를 설치했지만 권한 없이 ICMP 에코와도 작동합니다. 둘 다 ICMP 소켓을 사용하며 다음을 사용하는 데 권한이 필요하지 않습니다.

socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) = 3

권한 유무에 관계없이 이러한 구현에서 netlink 소켓을 사용하여 기본 핑을 재현할 수 없었습니다.

관련 정보