可以用ps 命令看。
ps elf | grep root
$ ps -elf | grep root
4 S root 1 0 0 80 0 - 6046 - 08:54 ? 00:00:02 /sbin/init
1 S root 2 0 0 80 0 - 0 - 08:54 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 - 08:54 ? 00:00:00 [ksoftirqd/0]
列出的是有root权限的进程。
也可以查看 proc 信息
$ cat /proc/2036/status | grep -E "(^uid|^gid)" -i
Uid: 0 0 0 0
Gid: 0 0 0 0
Uid 这一行前两个0分别为real user id和effective user id.
当一个user执行一个进程的时候,这个进程的权限就是执行它的 user或者group的权限,称之为 effective user id.
但如果可执行文件的SUID设置了,那进程的effective user id就等于这个可执行文件 owner的 UID.
进程的real user id就是发起这个进程的user的 ID。
举个例子:
$ ls -l 300
-rwxrwxr-x 1 root root 8464 Jul 16 00:44 300
文件 300 onwer是 root,但是当前登录到系统的 user id 是100. 这时执行 300:
$ ./300 &
[1] 29885
p$ cat /proc/29885/status | grep -E -i "(^uid)"
Uid: 1000 1000 1000 1000
可以看到 effective usr id 是当前的 user id,而不是文件的 owner.
设置SUID:
$ sudo chmod u+s 300
$ ls -l 300
-rwsrwxr-x 1 root root 8464 Jul 16 00:44 300
$ cat /proc/$(pidof 300)/status | grep -E -i "(^uid)"
Uid: 1000 0 0 0
可以看到此时real effective user id变成了 root.