상태

상태

상태

저는 대학에서 "클라우드 보안"을 가르치고 있으며 현재 가상 머신 내부 검사에 관한 프로젝트를 진행하고 있습니다.

내 연습의 목표는 일부 프로세스의 권한을 루트로 승격시키는 것입니다. 이는 다음을 사용하여 struct credfrom 에 대한 포인터를 "빌려" 수행 됩니다.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.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프로세스가 분명히 변경된 것에서 비롯됩니다.

답변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에 정의되어 있습니다. )

관련 정보