Closed3

ping と capability

Hidekazu KarinoHidekazu Karino

Linux の capability を調べているとよく ping が例に出てくる
ping を実行するには raw socket を開く必要があり,raw socket を開く許可を与える必要がある
root 権限で CAP_NET_RAW capability を付与するとこの許可を与えることができて ping できると説明されている
しかし Amazon Linux 2023 で試してみると特に権限を与えなくても ping できる
これはなぜかを調べていく

$ ls -l `which ping`
-rwxr-xr-x. 1 root root 95272 Nov  3 16:59 /usr/bin/ping
$ cp /usr/bin/ping ./myping
$ ls -l ./myping
-rwxr-xr-x. 1 ec2-user ec2-user 95272 Feb 22 06:52 ./myping
$ ./myping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
^C
--- 10.0.0.1 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2058ms
Hidekazu KarinoHidekazu Karino

同じような質問[1][2]がいくつか見つかりここに答えが書いている
今回の場合[3] にある net.ipv4.ping_group_range カーネルパラメータで ICMP ソケットの操作を指定された範囲のグループに許可しているのが理由

カーネルパラメータを確認すると全ユーザーに許可されている

$ sysctl net.ipv4.ping_group_range
$ net.ipv4.ping_group_range = 0   2147483647

[1] https://unix.stackexchange.com/questions/617927/why-ping-works-without-capability-and-setuid
[2] https://unix.stackexchange.com/questions/592911/how-does-ping-work-on-fedora-without-setuid-and-capabilities

脚注
  1. 1 ↩︎

  2. 2 ↩︎

  3. 2 ↩︎

Hidekazu KarinoHidekazu Karino

カーネルパラメータを変更してどうなるか見てみる

#  /etc/sysctl.conf を変更
$ vim  /etc/sysctl.conf
net.ipv4.ping_group_range = 1   0
# カーネルパラメータを反映
$ sysctl -p
net.ipv4.ping_group_range = 1   0
# ping できない
$ ping -v 10.0.0.1
ping: socket: Operation not permitted
ping: socket: Operation not permitted
# root なら ping できる
$ sudo ping -v 10.0.0.1                                                                                                    
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
^C
--- 10.0.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1059ms
# ping のバイナリをコピーして capability を付与する
$ cp /usr/bin/ping ./myping
$ sudo setcap 'cap_net_raw+p' ./myping
# capability が付与されているので非 root でも ping できる
$ ./myping -v 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
^C
--- 10.0.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1053ms

$ getcap ./myping
./myping cap_net_raw=p
このスクラップは3ヶ月前にクローズされました