我最近注意到,当我在术语(Terminal,iTerm等)中运行ps
命令时,该命令由root用户运行。
machine:~ vincent$ ps ux | grep ps
vincent 2846 0,2 0,0 4277992 848 s001 S+ 2:10 0:00.00 grep ps
root 2845 0,2 0,0 4287948 1120 s001 R+ 2:10 0:00.00 ps ux
在以管理员身份和没有管理员特权的普通用户键入命令时都会发生这种情况,并且会同时影响优胜美地和High Sierra(可能还会影响许多其他系统版本)。
那是为什么?
还有其他受此行为影响的命令吗?
答案 0 :(得分:1)
我怀疑这是通过setuid权限位完成的,以便允许__proc_info()
(<sys/libproc.h>
函数使用的syscall)访问其他进程的地址空间,以便读出例如可执行文件的路径。 (它没有存储在内核中,实际上是从进程的argv[0]
中读取的;是的,这的确意味着它可以被伪造。)
您始终可以尝试制作ps
二进制文件的副本(或从源代码进行编译),删除setuid位,以非特权用户身份运行它,然后看看会发生什么。
答案 1 :(得分:0)
如果查看ps文件的权限,您会注意到SUID位为ON(请在权限标志中选中“ s”)。
ls -ltr /bin/ps
-rwsr-xr-x 1 root wheel 51280 Dec 1 2017 /bin/ps
这意味着从该文件生成的进程获得文件所有者的许可,而不是其父进程(可以是您键入命令的bash终端)的许可,并且该用户是root。
sudo
和许多其他系统命令的工作方式。