我使用的是 Ubuntu Linux,上面运行着 Viber 专有软件。今天我使用 Viber 保存了一个文件,然后我发现该文件已存储在文件系统中根用户作为其所有者。我进一步挖掘后发现有两个进程正在运行,一个以我的用户名运行,另一个以 root 运行。有人能解释一下用户空间中的进程是否可以以 root 身份启动另一个子进程吗?
以下是 Viber 存储的文件的权限:
mehdix@spielplatz:~/New Folder2$ ls -l
total 240
-rw-rw-r-- 1 root root 245455 Okt 9 09:50 saved_with_viber
以下是 ps 命令的结果:
mehdix@spielplatz:~$ ps axuf | grep Viber
mehdix 23857 0.0 0.0 4444 644 ? S Okt08 0:00 \_ /bin/sh /usr/share/viber/Viber.sh
root 23864 0.0 1.8 2794592 146604 ? Sl Okt08 0:17 | \_ /usr/share/viber/Viber
mehdix 26484 0.0 0.0 17432 964 pts/5 S+ 09:43 0:00 \_ grep --color=auto Viber
mehdix@spielplatz:~$
以下是“ls -l /usr/share/viber/Viber”的输出:
mehdix@spielplatz:~$ ls -l /usr/share/viber/Viber
-rwsr-sr-x 1 root root 1733113 Okt 31 2013 /usr/share/viber/Viber
以下是“/usr/share/viber/Viber.sh”的内容:
mehdix@spielplatz:~$ cat /usr/share/viber/Viber.sh
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
答案1
当然可以。包含SUID 权限位set 将在文件所有者而不是启动它的用户下运行。root 拥有的 SUID 文件将在 root 下运行。
sudo
就是这样一个程序的例子。你可以从任何用户启动它,但它将在 root 权限下运行,并可以使用 root 权限启动进一步的进程。
从输出中可以看出ls -l
,这里使用的方法如下:文件归 拥有,root
并且设置了 SUID 位(如 所示,s
而不是x
用户执行权限)。事实上,SGID 位似乎也设置了。