情况
我正在大学讲授“云安全”,目前正在做一个关于虚拟机内省的项目。
我的练习目标是将某些进程的权限升级为 root 权限,这是通过“借用”指向struct cred
from的指针来完成的init
,使用挥发性和libvmi。基本上就像一些 Rootkit 所做的那样,但从一个虚拟机到另一个虚拟机。我可以通过提升某些进程的权限来证明此方法的效果,该进程反复尝试写入受保护的内存。就像那样:
#!/bin/bash
while true
do
echo 1 >> /etc/test
id
sleep 2
done
这会导致以下输出(当权限更改时):
# last time permission is denied
./test.sh: line 3: /etc/test: Permission denied
uid=1000(tester) gid=1000(tester)groups=1000(tester),24(cdrom),
25(floppy),29(audio),30(dip),44(video),46(plugdev),108(netdev),
111(scanner),115(bluetooth)
# tada, magic
# now I'm root
uid=0(root) gid=0(root) groups=0(root)
问题
所以我可以证明某些进程(bash
在上面的示例中)现在具有 root 权限。但是当我使用ps u
或直接通过查看过程时/proc/$PID
,UID
似乎GID
没有改变。
输出ps -A u | grep 2368
:
前:
# ...
tester 2368 0.0 0.9 23556 4552 pts/2 S+ 22:24 0:00 -bash
后:
# ...
tester 2368 0.0 0.9 23556 4552 pts/2 S+ 22:24 0:00 -bash
这里什么都没有改变。
也/proc/$PID/status
没有改变:
~# cat /proc/2368/status | grep Uid
Uid: 1000 1000 1000 1000
~# cat /proc/2368/status | grep Gid
Gid: 1000 1000 1000 1000
那么你能解释一下吗,为什么他们在那里没有改变,并且在哪里该信息来自,当它们不是从流程的 中获取时struct cred
,流程显然已被更改。
答案1
任务没有结构体cred。他们有二结构信用:
* A task has two security pointers. task->real_cred points to the objective
* context that defines that task's actual details. The objective part of this
* context is used whenever that task is acted upon.
*
* task->cred points to the subjective context that defines the details of how
* that task is going to act upon another object. This may be overridden
* temporarily to point to another security context, but normally points to the
* same context as task->real_cred.
我检查了哪一个/proc
向您展示了,但您可能可以猜到:-P。
(参见 fs/proc/,使用https://elixir.bootlin.com。 procfs“状态”文件在 fs/proc/base.c 中定义。)