Linux-Kernel
程序的 UID/GID 來自哪裡,而不是來自程序的 cred 指針?
情況
我正在大學做關於“雲安全”的講座,目前正在做一個關於虛擬機自省的項目。
我練習的目標是將某些程序的權限升級為 root 權限,我通過“借用”指向
struct cred
from的指針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
,似乎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
,顯然已經改變了。
任務沒有結構信用。他們有兩個結構信用:
* 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 中定義。)