linux - arping : EPERM when run via strace

标签 linux sockets root privileges

我想弄清楚 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

更有趣的是,如果我只是将可执行文件复制到主目录并运行,我会得到同样的错误:

~/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-to-root。)观察:

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

允许特权可执行文件被 straced(或完全通过 ptrace(2) 跟踪/调试)是一个潜在的安全问题,因此当可执行文件被跟踪时,除非跟踪进程已经获得特权,否则内核在执行期间会剥离任何功能或 Set-UID。换句话说,您可以使用 sudo strace arping ... 来解决这个问题(如果您已获得授权)。

关于linux - arping : EPERM when run via strace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47137827/

相关文章:

c++ - 如果未设置clock_settime,clock_gettime() 是否有效?

c++ - 我应该如何在 UDP 中的 Boost Asio 中找到我从哪个客户端接收?

c - ARM-linux4.3.2,无法打开PF_PACKET类型的socket

centos - 如何在 CentOS 7 中删除用户的 sudo 权限?

java - 使用 JNI 授予对 Android 应用程序的 C/C++ native 端的 root 访问权限,这似乎是不可能的

java - 如何在没有 IDE 的情况下从 Sphinx4 编译和运行 HelloWorld.java 示例?

android - 解包 64 位设备的 'Non-Standard' Boot.img 问题

docker - 如何部署几个war到root tomcat?

linux - 使用 Linux 内核为用户空间工具制作系统

android - 使用 OkHttp 检查套接字是否连接或断开连接的更好方法?