Linux-Kernel

程序的 UID/GID 來自哪裡,而不是來自程序的 cred 指針?

  • June 30, 2018

情況

我正在大學做關於“雲安全”的講座,目前正在做一個關於虛擬機自省的項目。

我練習的目標是將某些程序的權限升級為 root 權限,我通過“借用”指向struct credfrom的指針init、使用可變性libvmi來實現。基本上就像一些 rootkit 一樣,但是從一個 VM 到另一個 VM。我可以通過提升某些程序的權限來證明這種方法的效果,該程序反复嘗試寫入受保護的記憶體。就像這樣:

#!/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,似乎UIDGID沒有改變。

輸出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,顯然已經改變了。

任務沒有結構信用。他們有兩個結構信用:

* 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 中定義。)

引用自:https://unix.stackexchange.com/questions/452825