情况

情况

情况

我正在大学讲授“云安全”,目前正在做一个关于虚拟机内省的项目。

我的练习目标是将某些进程的权限升级为 root 权限,这是通过“借用”指向struct credfrom的指针来完成的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/$PIDUID似乎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 中定义。)

相关内容