상태
저는 대학에서 "클라우드 보안"을 가르치고 있으며 현재 가상 머신 내부 검사에 관한 프로젝트를 진행하고 있습니다.
내 연습의 목표는 일부 프로세스의 권한을 루트로 승격시키는 것입니다. 이는 다음을 사용하여 struct cred
from 에 대한 포인터를 "빌려" 수행 됩니다.init
휘발성그리고libvmi. 기본적으로 일부 루트킷과 비슷하지만 하나의 가상 머신에서 다른 가상 머신으로 이동합니다. 보호된 메모리에 쓰기를 반복적으로 시도하는 일부 프로세스의 권한을 상승시켜 이 접근 방식의 효율성을 입증할 수 있었습니다. 그렇게:
#!/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
따라서 위의 예에서 일부 프로세스가 이제 루트 권한을 가지고 있음을 증명할 수 있습니다 . 하지만 보기 프로세스를 사용하거나 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에 정의되어 있습니다. )