Modifica EUID del processo in esecuzione


12

Su Linux, come posso cambiare l'EUID dell'esecuzione del processo dalla riga di comando (purché abbia accesso come root)?

Risposte:


17

Se il processo è in esecuzione con privilegi di root , è possibile collegare gdb al processo e chiamare seteuid dall'interno di quel processo.

Esempio:

[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 per l'approccio creativo alla realizzazione
dell'attività

Wow ... sì, è creativo. In effetti non avevo pensato di collegarmi al processo con un debugger. Con un po 'di "aspettativa" di pirateria informatica, si potrebbe implementare "cheuid <processID> <EUID>" che funzionerebbe in ALCUNE situazioni. In particolare, credo che sia l'esecutore di gdb che il processo interessato dovrebbero essere root ... quindi questo è di utilità limitata. AFAIK semplicemente eseguendo gdb come root, connettendosi a un processo non root, il seteuid fallirebbe, poiché verrà eseguito con i priv del processo di esecuzione, non con i priv del debugger.
PBR

2

Se stai parlando di un processo che modifica il proprio EUID, ci sono molti modi per farlo.

  • setuid () - come effetto collaterale imposta EUID quando utilizzato da un processo con EUID pari a 0
  • seteuid ()
  • setreuid ()

A seconda dell'UID effettivo del programma e se esiste un UID salvato, potresti essere in grado di passare tra due valori EUID in un programma non root. Con un programma con privilegi di root, devi stare attento: devi decidere se la modifica deve essere irreversibile e utilizzare la funzione corretta per il lavoro. (L'uso di setuid () come root è irreversibile.)

Se stai cercando di cambiare un processo che è già in esecuzione da un processo separato, allora non esiste un modo standard per farlo - e non sono sicuro che ci siano molti modi non standard. Potresti essere in grado di annotare alcune informazioni in / dev / kmem, ma viene in mente l'espressione "ghiaccio sottile".


2

Non c'è modo di farlo "dalla riga di comando" a qualsiasi processo in esecuzione.

Posso dirlo con una certa sicurezza; l'unico "forse" era / proc e ho cercato in giro (letteralmente e tramite google) e mi sono imbattuto in un vicolo cieco per quanto riguarda qualsiasi cosa in / proc che consente di cambiare l'EUID. Puoi IMPARARE quali sono le impostazioni UID e GID in / proc / {pid} / status - ma non puoi cambiarle usando nulla in / proc, almeno per quanto ne so.

Ma è abbastanza facile far funzionare qualcosa del genere - un modo per cambiare l'EUID di un processo, dalla riga di comando - se controlli il codice sorgente del processo che vuoi cambiare. È possibile implementare un gestore di segnali per esempio SIGUSR1 e fare in modo che il processo cambi il proprio EUID, tuttavia è necessario quando riceve quel segnale. Quindi invieresti semplicemente il processo che SIGUSR1 segnala, tramite "kill" ... dalla riga di comando, come hai chiesto ... e cambierebbe il suo EUID per te.

Questo potrebbe non essere quello a cui stavi pensando, ma ... è una risposta alla tua domanda su come farlo ... ed è l'unica risposta a cui riesco a pensare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.