web-dev-qa-db-ja.com

実行中のプロセスのユーザー/グループ設定を更新するにはどうすればよいですか?

初期ログイングループなどのユーザー設定を変更したり、新しいグループに追加したりするとします。これで、_su user_を実行して、これらの新しい設定を操作できます。ただし、以前に実行されていたすべてのプロセスには、以前と同じ権限が引き続き付与されます。

特定の実行中のプロセスに_/etc/passwd_と_/etc/group_を再読み込みさせて、実行中のアクティビティを終了せずに、ユーザーとグループの設定を再初期化するにはどうすればよいですか? gdbを使用してプロセスにアタッチしてprint setuid(MY_USER_ID)を実行しようとしましたが、結果は_0_(つまり成功)でしたが、プロセスは同じデータのままでした(チェック済み) bashgroupsを実行して、追加のグループが表示されているかどうかを確認します)。

5
Ruslan

非常に興味深い試み。実際には、プロセスの補足グループ(/etc/groupで定義)は setgroups システムコールによって設定されます。 CAP_SETGID特権またはrootである必要があります。

だからあなたはこのようにすることができます:

# id
uid=0(root) gid=0(root) groups=0(root)

# gdb -q id
Reading symbols from id...(no debugging symbols found)...done.
(gdb) b getgroups
Breakpoint 1 at 0x401990
(gdb) run
Starting program: /usr/bin/id 
[Thread debugging using libthread_db enabled]
Using Host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, getgroups () at ../sysdeps/unix/syscall-template.S:81
81  ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) call setgroups(5, {1, 2, 3, 4, 5})
$1 = 0
(gdb) d 1
(gdb) c
Continuing.
uid=0(root) gid=0(root) groups=0(root),1(daemon),2(bin),3(sys),4(adm),5(tty)
[Inferior 1 (process 8059) exited normally]
(gdb) 
2
yaegashi

かなり無意味な運動のようです。

ターゲットプロセスは、資格情報を切り替えるために必要なすべての権限を持っていないだけでなく、そのuid/gidがどこかに保存されてアクティブに使用されている可能性があるため、予期しない資格情報の変更によって実際に問題が発生する可能性があります。

それらの所有者を知っているさまざまなエンティティがあります-ファイル、sysvipc。

したがって、すべてのターゲットプロセスを/停止/し、すべての可能な場所を更新する必要があります。

しかし、一部のプロセスはカーネル内で中断できない方法でブロックされる可能性があります-では、何ですか?

おもちゃの目的では、プロセスの資格情報を変更するカーネルモジュールが必要になりますが、それでもブロックされたプロセスを簡単に処理することはできません。

言い換えれば、あなたは本当に何を達成しようとしているのか、そしてその理由は何ですか?