我想弄清楚arping是如何工作的,所以我用strace运行它,得到:
socket(PF_PACKET, SOCK_DGRAM, 0) = -1 EPERM (Operation not permitted)
如果我运行它没有strace它工作和arp包被发送。这怎么可能?它是如何做到用户无权做的事情的?它也没有设置setuid位:
ls -lrtah `which arping`
-rwxr-xr-x 1 root root 19K Mai 7 2014 /usr/bin/arping
更有趣的是,如果我只是将可执行文件复制到home并运行,就会得到相同的错误:
~/tmp$ sudo cp /usr/bin/arping .
~/tmp$ ./arping -I enp2s0f0 192.168.2.1
arping: socket: Operation not permitted
运行原始版本时:
~/tmp$ arping -I enp2s0f0 192.168.2.1
ARPING 192.168.2.1 from 1.2.3.4 enp2s0f0
最佳答案
arping
需要CAP_NET_RAW
特权(aka能力)才能发送它使用的低级数据包。(其他Unix版本[或较旧的Linux版本]可能将程序作为setuid安装到根目录。)请注意:
$ getcap /usr/bin/arping
/usr/bin/arping = cap_net_raw+ep
允许特权可执行文件被
strace
d(或通过ptrace(2)
跟踪/调试)是一个潜在的安全问题,因此当跟踪可执行文件时,内核会在执行过程中删除任何功能或设置uid,除非跟踪过程已经被特权化。换言之,您可以使用sudo strace arping ...
(如果您获得授权)来解决这个问题。