Zmień identyfikator EUID uruchomionego procesu

12

W systemie Linux, jak mogę zmienić identyfikator EUID uruchomionego procesu z wiersza poleceń (pod warunkiem, że mam dostęp do konta root)?

jackhab
źródło

Odpowiedzi:

17

Jeśli proces działa z uprawnieniami roota , możesz dołączyć gdb do procesu i wywołać seteuid z tego procesu.

Przykład:

[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
Kjetil Jørgensen
źródło
3
+1 za kreatywne podejście do realizacji zadania ...
quack quoteote
Wow ... tak, to kreatywne. Rzeczywiście nie myślałem o dołączeniu do procesu za pomocą debuggera. Przy odrobinie hakowania „oczekuj” można zaimplementować „cheuid <processID> <EUID>”, który działałby w NIEKTÓRYCH sytuacjach. W szczególności uważam, że zarówno wykonawca gdb ORAZ proces, którego to dotyczy, musiałby być rootem ... więc ma to ograniczoną użyteczność. AFAIK po prostu uruchamia gdb jako root, łącząc się z procesem innym niż root, seteuid nie powiedzie się, ponieważ będzie działał z sekwencjami procesu wykonawczego, a nie sekcjami debuggera.
pbr
2

Jeśli mówisz o procesie zmiany własnego identyfikatora EUID, istnieje wiele sposobów, aby to zrobić.

  • setuid () - jako efekt uboczny ustawia EUID, gdy jest używany przez proces z EUID równym 0
  • seteuid ()
  • setreuid ()

W zależności od efektywnego UID programu i od tego, czy istnieje zapisany UID, możesz być w stanie przełączać się między dwiema wartościami EUID w programie innym niż root. Korzystając z programu uprzywilejowanego do rootowania, musisz zachować ostrożność - musisz zdecydować, czy zmiana powinna być nieodwracalna, i użyć poprawnej funkcji dla zadania. (Używanie setuid () jako root jest nieodwracalne).

Jeśli próbujesz zmienić proces, który już działa z oddzielnego procesu, nie ma standardowego sposobu na zrobienie tego - i nie jestem pewien, czy istnieje wiele niestandardowych sposobów. Możesz być w stanie wrzucić trochę informacji do / dev / kmem, ale przychodzi mi na myśl wyrażenie „cienki lód”.

Jonathan Leffler
źródło
2

Nie ma możliwości zrobienia tego „z wiersza poleceń” do dowolnego uruchomionego procesu.

Mogę to powiedzieć z pewną pewnością; jedynym „być może” był / proc, a ja się tam przeszukiwałem (dosłownie i przez Google) i wpadłem w ślepy zaułek na wszystko w / proc pozwalające na zmianę EUID. Możesz DOWIEDZ SIĘ, jakie są ustawienia UID i GID w / proc / {pid} / status - ale nie możesz ich zmienić za pomocą czegokolwiek w / proc, przynajmniej o ile wiem.

Ale wystarczy, aby coś takiego działało - sposób na zmianę identyfikatora EUID procesu z wiersza poleceń - jeśli kontrolujesz kod źródłowy procesu, który chcesz zmienić. Możesz zaimplementować procedurę obsługi sygnału dla powiedzmy SIGUSR1 i zlecić procesowi zmianę własnego identyfikatora EUID, jednak potrzebujesz go, gdy odbierze ten sygnał. Następnie wystarczy wysłać proces, który sygnalizuje SIGUSR1, za pomocą polecenia „kill” ... z wiersza polecenia, tak jak prosiłeś ... i zmieni on dla ciebie swój identyfikator EUID.

Być może nie o tym myślałeś, ale ... to odpowiedź na twoje pytanie, jak to zrobić ... i to jedyna odpowiedź, jaką mogę wymyślić.

pbr
źródło