Modifier l'EUID du processus en cours

12

Sous Linux, comment puis-je changer l'EUID du processus en cours d'exécution à partir de la ligne de commande (à condition d'avoir un accès root)?

jackhab
la source

Réponses:

17

Si le processus s'exécute avec des privilèges root , vous pouvez attacher gdb au processus et appeler seteuid depuis ce processus.

Exemple:

[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
la source
3
+1 pour une approche créative de l'accomplissement de la tâche ...
Quack Quichotte
Wow ... oui, c'est créatif. En effet je n'avais pas pensé à m'attacher au processus avec un débogueur. Avec un peu de piratage "attendu", on pourrait implémenter "cheuid <processID> <EUID>" qui fonctionnerait pour CERTAINES situations. Plus précisément, je crois que l'exécuteur de gdb ET le processus affecté devraient être root ... c'est donc d'une utilité limitée. AFAIK exécutant juste gdb en tant que root, se connectant à un processus non root, le seteuid échouerait, car il fonctionnera avec les privilèges du processus en cours d'exécution, pas avec les privilèges du débogueur.
pbr
2

Si vous parlez d'un processus modifiant son propre EUID, il existe de nombreuses façons de procéder.

  • setuid () - comme effet secondaire définit EUID lorsqu'il est utilisé par un processus avec EUID de 0
  • seteuid ()
  • setreuid ()

Selon l'UID effectif du programme et s'il existe un UID enregistré, vous pouvez basculer entre deux valeurs EUID dans un programme non root. Avec un programme root privilégié, vous devez être prudent - vous devez décider si le changement doit être irréversible et utiliser la fonction correcte pour le travail. (L'utilisation de setuid () en tant que root est irréversible.)

Si vous essayez de modifier un processus qui s'exécute déjà à partir d'un processus distinct, il n'y a pas de moyen standard de le faire - et je ne suis pas sûr qu'il existe de nombreuses façons non standard non plus. Vous pourrez peut-être dink quelques informations dans / dev / kmem, mais l'expression «glace mince» vient à l'esprit.

Jonathan Leffler
la source
2

Il n'y a aucun moyen de faire cela "à partir de la ligne de commande" pour n'importe quel processus en cours d'exécution.

Je peux dire cela avec une certaine certitude; le seul "peut-être" était / proc et j'ai fouillé dedans (littéralement et via google) et je suis tombé dans une impasse concernant quoi que ce soit dans / proc permettant de changer l'EUID. Vous pouvez APPRENDRE quels sont les paramètres UID et GID dans / proc / {pid} / status - mais vous ne pouvez pas les changer en utilisant quoi que ce soit dans / proc, du moins pour autant que je sache.

Mais il est assez facile de faire fonctionner quelque chose comme ça - un moyen de changer l'EUID d'un processus, à partir de la ligne de commande - si vous contrôlez le code source du processus que vous souhaitez modifier. Vous pouvez implémenter un gestionnaire de signal pour, disons, SIGUSR1 et demander au processus de changer son propre EUID comme vous en avez besoin quand il reçoit ce signal. Ensuite, vous enverriez simplement le processus que le signal SIGUSR1, via "kill" ... depuis la ligne de commande, comme vous l'avez demandé ... et cela changerait son EUID pour vous.

Ce n'est peut-être pas ce à quoi vous pensiez, mais ... c'est une réponse à votre question de savoir comment le faire ... et c'est la seule réponse à laquelle je puisse penser.

pbr
la source