Ändern Sie die EUID des laufenden Prozesses

13

Wie kann ich unter Linux die EUID des ausgeführten Prozesses über die Befehlszeile ändern (vorausgesetzt, ich habe Root-Zugriff)?

Jackhab
quelle

Antworten:

18

Wenn der Prozess mit Root-Rechten ausgeführt wird , können Sie gdb an den Prozess anhängen und seteuid von diesem Prozess aus aufrufen.

Beispiel:

[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
quelle
3
+1 für kreative Herangehensweise an die Erfüllung der Aufgabe ...
Quack Quijote
Wow ... ja, das ist kreativ. In der Tat hatte ich nicht daran gedacht, mich mit einem Debugger an den Prozess zu binden. Mit ein bisschen "Expect" -Hackery könnte man "cheuid <processID> <EUID>" implementieren, das in einigen Situationen funktionieren würde. Insbesondere glaube ich, dass sowohl der Ausführende von gdb als auch der betroffene Prozess root sein müssten ... daher ist dies von begrenztem Nutzen. Wenn AFAIK nur gdb als root ausführt und eine Verbindung zu einem Nicht-Root-Prozess herstellt, schlägt die seteuid fehl, da sie mit den Rechten des ausführenden Prozesses und nicht mit den Rechten des Debuggers ausgeführt wird.
pbr
3

Wenn Sie über einen Prozess sprechen, der seine eigene EUID ändert, gibt es eine Reihe von Möglichkeiten, dies zu tun.

  • setuid () - Als Nebeneffekt wird die EUID festgelegt, wenn sie von einem Prozess mit der EUID 0 verwendet wird
  • seteuid ()
  • setreuid ()

Abhängig von der effektiven UID des Programms und davon, ob eine gespeicherte UID vorhanden ist, können Sie in einem Nicht-Root-Programm möglicherweise zwischen zwei EUID-Werten wechseln. Bei einem Root-privilegierten Programm müssen Sie vorsichtig sein - Sie müssen entscheiden, ob die Änderung irreversibel sein soll, und die richtige Funktion für den Job verwenden. (Die Verwendung von setuid () als root ist irreversibel.)

Wenn Sie versuchen, einen Prozess zu ändern, der bereits von einem separaten Prozess ausgeführt wird, gibt es keine Standardmethode - und ich bin mir auch nicht sicher, ob es viele nicht standardmäßige Methoden gibt. Sie könnten in der Lage sein, einige Informationen in / dev / kmem abzuspeichern, aber der Ausdruck "dünnes Eis" kommt Ihnen in den Sinn.

Jonathan Leffler
quelle
2

Es gibt keine Möglichkeit, dies "von der Kommandozeile aus" für jeden laufenden Prozess zu tun.

Ich kann das mit einiger Gewissheit sagen; Das einzige "Vielleicht" war / proc und ich habe mich dort umgesehen (buchstäblich und über Google) und bin in eine Sackgasse geraten, was irgendetwas in / proc betrifft, das das Ändern der EUID ermöglicht. Sie können die UID- und GID-Einstellungen in / proc / {pid} / status LERNEN - aber Sie können sie mit / proc nicht ändern, zumindest soweit ich das beurteilen kann.

Es ist jedoch einfach genug, so etwas zum Laufen zu bringen - eine Möglichkeit, die EUID eines Prozesses über die Befehlszeile zu ändern -, wenn Sie den Quellcode des Prozesses steuern, den Sie ändern möchten. Sie können einen Signal-Handler für SIGUSR1 implementieren und den Prozess seine eigene EUID ändern lassen, je nachdem, wann er dieses Signal empfängt. Dann würden Sie einfach den Prozess, den SIGUSR1 signalisiert, über "kill" ... von der Kommandozeile aus senden, wie Sie gefragt haben ... und die EUID für Sie ändern.

Das ist vielleicht nicht das, woran Sie gedacht haben, aber ... es ist eine Antwort auf Ihre Frage, wie es geht ... und es ist die einzige Antwort, die mir einfällt.

pbr
quelle