Ändern Sie die EUID des laufenden Prozesses

13365
jackhab

Wie kann ich unter Linux die EUID des laufenden Prozesses von der Befehlszeile aus ändern (vorausgesetzt, ich habe Root-Zugriff)?

13

3 Antworten auf die Frage

18
Kjetil Jørgensen

Wenn der Prozess mit Root-Berechtigungen ausgeführt wird, können Sie gdb an den Prozess anhängen und seteuid innerhalb dieses Prozesses 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 
+1 für den kreativen Ansatz zur Erreichung der Aufgabe ... quack quixote vor 14 Jahren 3
Wow ... ja, das ist kreativ. In der Tat hatte ich nicht daran gedacht, mich mit einem Debugger an den Prozess anzuschließen. Mit etwas "erwarten" Hacker kann man "cheuid" implementieren "Das würde in einigen Situationen funktionieren. Insbesondere glaube ich, dass sowohl der Ausführende von gdb als auch der betroffene Prozess root sein müssten. Dies ist von begrenztem Nutzen. AFAIK führt gdb einfach als root aus und stellt eine Verbindung zu einem Nicht-Root her Wenn dies geschieht, schlägt das Seteuid fehl, da es mit den Privilegien des ausführenden Prozesses und nicht mit den Privilegien des Debuggers ausgeführt wird. pbr vor 14 Jahren 0
3
Jonathan Leffler

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

  • setuid () - legt als Nebeneffekt die EUID fest, 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 möglicherweise in einem Nicht-Root-Programm 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 nicht umkehrbar.)

Wenn Sie versuchen, einen Prozess zu ändern, der bereits von einem separaten Prozess ausgeführt wird, gibt es keine Standardmethode - und ich bin nicht sicher, ob es auch viele nicht standardmäßige Methoden gibt. Möglicherweise können Sie einige Informationen in / dev / kmem finden, aber der Ausdruck "dünnes Eis" fällt mir ein.

2
pbr

Es gibt keine Möglichkeit, dies "von der Kommandozeile" zu einem laufenden Prozess zu tun.

Ich kann das mit einiger Sicherheit sagen. Das einzige "Vielleicht" war / proc und ich stöberte dort herum (buchstäblich und über Google) und stieß in einer Sackgasse in Bezug auf alles in / proc, das die Änderung der EUID zuließ. Sie können in / proc / / status die UID- und GID-Einstellungen kennenlernen. Sie können sie jedoch nicht mit Hilfe von / proc ändern, zumindest soweit ich das beurteilen kann.

Aber es ist leicht genug, um so etwas zu erreichen - eine Möglichkeit, die EUID eines Prozesses von der Kommandozeile aus zu ändern - wenn Sie den Quellcode des Prozesses steuern, den Sie ändern möchten. Sie können einen Signal-Handler implementieren, z. B. SIGUSR1, und den Prozess dazu veranlassen, seine eigene EUID zu ändern, unabhängig davon, wann Sie dieses Signal empfangen. Dann würden Sie den Prozess, den SIGUSR1 signalisiert, einfach über "kill" senden ... von der Befehlszeile aus, wie Sie gefragt haben ... und es würde 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.