13

В Linux, как я могу изменить EUID запущенного процесса из командной строки (при условии, что у меня есть root-доступ)?

3 ответа3

18

Если процесс выполняется с правами root, вы можете присоединить к нему gdb и вызвать seteuid из этого процесса.

Пример:

[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

Если вы говорите о процессе, который меняет свой собственный EUID, есть множество способов сделать это.

  • setuid() - в качестве побочного эффекта устанавливает EUID при использовании процесса с EUID 0
  • seteuid()
  • setreuid()

В зависимости от эффективного UID программы и наличия сохраненного UID, вы можете переключаться между двумя значениями EUID в программе без полномочий root. С привилегированной программой root вы должны быть осторожны - вы должны решить, должно ли изменение быть необратимым, и использовать правильную функцию для работы. (Использование setuid () в качестве root необратимо.)

Если вы пытаетесь изменить процесс, который уже выполняется из отдельного процесса, тогда не существует стандартного способа сделать это - и я не уверен, что есть много нестандартных способов. Возможно, вам удастся получить некоторую информацию в /dev /kmem, но на ум приходит выражение «тонкий лед».

2

Нет никакого способа сделать это "из командной строки" для любого запущенного процесса.

Я могу сказать это с некоторой уверенностью; единственным "возможно" был /proc, и я заглянул туда (буквально и через google) и зашел в тупик относительно всего, что в /proc позволяет изменить EUID. Вы можете узнать, какие настройки UID и GID находятся в /proc /{pid} /status - но вы не можете изменить их, используя что-либо в /proc, по крайней мере, насколько я могу судить.

Но достаточно легко заставить что-то подобное работать - способ изменить EUID процесса из командной строки - если вы контролируете исходный код процесса, который хотите изменить. Вы можете реализовать обработчик сигнала, скажем, SIGUSR1, и процесс может изменить свой собственный EUID, как вам нужно, когда он получит этот сигнал. Затем вы просто отправили бы процесс, сигнал SIGUSR1, через "kill" ... из командной строки, как вы просили ... и он изменил бы его EUID для вас.

Возможно, это не то, о чем вы думали, но ... это ответ на ваш вопрос о том, как это сделать ... и это единственный ответ, который я могу придумать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .