실행중인 프로세스의 EUID 변경


12

Linux에서 실행중인 프로세스의 EUID를 명령 줄에서 변경하려면 어떻게해야합니까 (루트 액세스 권한이있는 경우)?

답변:


17

프로세스가 루트 권한으로 실행중인 경우 gdb를 프로세스에 첨부하고 해당 프로세스 내에서 seteuid를 호출 할 수 있습니다.

예:

[root@user-desktop ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t

[root@user-desktop ~]# gdb /bin/bash $$
GNU gdb Fedora (6.8-27.el5)
# cut copyright & license statements
This GDB was configured as "x86_64-redhat-linux-gnu"...
# cut some initialization output    
0x00000036b0a99335 in waitpid () from /lib64/libc.so.6
(gdb) call seteuid(500)
$1 = 0 
(gdb) quit
The program is running.  Quit anyway (and detach it)? (y or n) y
Detaching from program: /bin/bash, process 29017

[root@user-desktop ~]# id
uid=0(root) gid=0(root) euid=500(user) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t

3
과제를 달성하기위한 창조적 인 접근을 위해 +1 ...
quack quixote

와우 ... 네, 창의적입니다. 실제로 디버거를 사용하여 프로세스에 연결할 생각은 없었습니다. 약간의 "예상"해커를 사용하면 일부 상황에서 작동하는 "cheuid <processID> <EUID>"를 구현할 수 있습니다. 특히 나는 gdb의 실행자와 영향을받는 프로세스가 모두 루트 여야한다고 믿습니다. 그래서 이것은 제한된 유틸리티입니다. AFAIK는 gdb를 루트로 실행하고 루트가 아닌 프로세스에 연결하면 seteuid가 실패합니다. 디버거의 개인이 아닌 실행 프로세스의 개인으로 실행되기 때문입니다.
pbr

2

자체 EUID를 변경하는 프로세스에 대해 이야기하는 경우 여러 가지 방법이 있습니다.

  • setuid ()-EUID가 0 인 프로세스에서 사용될 때 부작용으로 EUID를 설정 함
  • seteuid ()
  • setreuid ()

프로그램의 유효 UID 및 저장된 UID가 있는지에 따라 비 루트 프로그램에서 두 EUID 값 사이를 전환 할 수 있습니다. 루트 권한이있는 프로그램을 사용하면주의해야합니다. 변경을 되돌릴 수 없는지 결정하고 작업에 올바른 기능을 사용해야합니다. (setuid ()를 루트로 사용하는 것은 되돌릴 수 없습니다.)

이미 별도의 프로세스에서 실행중인 프로세스를 변경하려고하면 표준 방법이 없으며 비표준 방법이 많이 있는지 잘 모르겠습니다. / dev / kmem에 정보를 담을 수는 있지만 'thin ice'라는 표현이 떠 오릅니다.


2

"명령 줄에서"실행중인 프로세스로이를 수행 할 방법이 없습니다.

나는 확실하게 말할 수있다. 유일한 "아마도"는 / proc 였고 나는 거기에서 (문자 그대로 Google을 통해) 찔 렀고 EUID를 변경할 수있는 / proc의 모든 것에 대해 막 다른 골목에 빠졌습니다. / proc / {pid} / status에 UID 및 GID 설정이 무엇인지 배울 수 있지만 적어도 내가 알 수있는 한 / proc에있는 것을 사용하여 변경할 수는 없습니다.

그러나 변경하려는 프로세스의 소스 코드를 제어하는 ​​경우 명령 줄에서 프로세스의 EUID를 변경하는 방법과 같은 작업을 쉽게 수행 할 수 있습니다. SIGUSR1에 대한 신호 처리기를 구현하고 프로세스가 자체 EUID를 변경하도록 할 수 있지만 해당 신호를 수신 할 때 필요합니다. 그런 다음 요청한대로 명령 줄에서 "kill"을 통해 SIGUSR1 신호를 보내는 프로세스를 보내면 EUID가 변경됩니다.

이것은 당신이 생각한 것이 아닐 수도 있지만, ... 어떻게 해야하는지에 대한 귀하의 질문에 대한 대답입니다 ... 그리고 그것은 내가 생각할 수있는 유일한 대답입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.