web-dev-qa-db-ja.com

実行中のプロセスのEUIDを変更する

Linuxで、実行中のプロセスのEUIDをコマンドラインから変更するにはどうすればよいですか(rootアクセス権がある場合)?

12
jackhab

Ifプロセスがroot-privilegesで実行の場合、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
17

独自のEUIDを変更するプロセスについて話している場合、それを行う方法はたくさんあります。

  • setuid()-副作用として、EUIDが0のプロセスで使用されるとEUIDが設定されます
  • seteuid()
  • setreuid()

プログラムの有効なUID、および保存されたUIDがあるかどうかによっては、非ルートプログラムで2つのEUID値を切り替えることができる場合があります。ルート特権プログラムでは、注意が必要です。変更を元に戻せないようにするかどうかを決定し、ジョブに適切な機能を使用する必要があります。 (rootとしてsetuid()を使用することは元に戻せません。)

別のプロセスからすでに実行されているプロセスを変更しようとしている場合、それを行う標準的な方法はありません。また、非標準的な方法がたくさんあるかどうかもわかりません。/dev/kmemにいくつかの情報を入れることができるかもしれませんが、「薄い氷」という表現が思い浮かびます。

2

これを「コマンドラインから」実行中のプロセスだけに行う方法はありません。

確かにそう言えます。唯一の「たぶん」は/ procで、私はそこで(文字通り、グーグル経由で)突っ込んで、EUIDの変更を可能にする/ proc内のすべてに関して行き止まりに遭遇しました。/proc/{pid}/statusにあるUIDとGIDの設定を知ることはできますが、少なくとも私が知る限り、/ procにあるものを使用してそれらを変更することはできません。

しかし、変更したいプロセスのソースコードを制御すれば、そのようなもの(コマンドラインからプロセスのEUIDを変更する方法)を機能させるのは簡単です。たとえばSIGUSR1のシグナルハンドラーを実装し、プロセスがそのシグナルを受信したときに必要な方法で独自のEUIDを変更することができます。次に、そのSIGUSR1シグナルを、コマンドラインから「kill」を介して、要求どおりにプロセスに送信するだけで、EUIDが変更されます。

これはあなたが考えていたものではないかもしれませんが...それはそれをどのように行うかというあなたの質問に対する答えです...そしてそれは私が考えることができる唯一の答えです。

2
pbr