前提・実現したいこと
あるプログラムをrootユーザーで実行し、プログラム中でseteuid等で一般ユーザー(例:user1)にします。
一般ユーザー(user1)が実行する別のプログラムで、上記プログラムのPIDの/proc/PID/fd/等のディレクトリ・ファイルを読み込みたいです。
/proc/PID/fd/等の所有者が、一般ユーザー(user1)になれば、実現できると思っています。
実際、ログインシェルのPIDでは、/proc/PID/以下のディレクトリ・ファイルは全て、そのユーザーが所有者でした(試したこと、に記載)。
seteuid等のシステムコール・関数とは別に、何かべつの処理が必要なのでしょうか。
発生している問題・エラーメッセージ
環境は、Fedora 32、Linux kernel 5.6 です。
$ uname -a Linux localhost.localdomain 5.6.6-300.fc32.x86_64 #1 SMP Tue Apr 21 13:44:19 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
端末1で、下記の通り実行(setresuid.cのソースコードは後述)しました。
$ sudo cat /etc/passwd | grep user1 user1:x:1234:1234::/home/user1:/bin/bash $ gcc setresuid.c $ sudo ./a.out pid: 142188 ruid 0, euid 0, suid 0 ruid 1234, euid 1234, suid 1234 sleep (この状態で放置)
端末2で、下記の通り、/proc/PID/fd/や、/proc/PID/のファイル一覧を取得したところ、次のように、ユーザーがroot(一部はuser1、なぜ???)になっており、Permission deniedとなるものがあります。
$ id uid=1234(user1) gid=1234(user1) groups=1234(user1) $ ls -l /proc/142188/fd/ ls: cannot open directory '/proc/142188/fd/': Permission denied $ ls -l /proc/142188/ ls: cannot read symbolic link '/proc/142188/cwd': Permission denied ls: cannot read symbolic link '/proc/142188/root': Permission denied ls: cannot read symbolic link '/proc/142188/exe': Permission denied total 0 -r--r--r-- 1 root root 0 May 9 21:13 arch_status dr-xr-xr-x 2 user1 root 0 May 9 21:13 attr -rw-r--r-- 1 root root 0 May 9 21:13 autogroup -r-------- 1 root root 0 May 9 21:13 auxv (snip) dr-x------ 2 root root 0 May 9 21:13 fd (snip)
該当のソースコード
c
1#define _GNU_SOURCE 2#include <unistd.h> 3#include <stdio.h> 4#include <stdlib.h> 5 6int main(void) 7{ 8 uid_t ruid, euid, suid; 9 10 printf("pid: %d\n", getpid()); 11 12 getresuid(&ruid, &euid, &suid); 13 printf("ruid %ld, euid %ld, suid %ld\n", (long)ruid, (long)euid, (long)suid); 14 15 if (setresuid(1234, 1234, 1234) < 0){ 16 perror("setresuid"); 17 exit(1); 18 } 19 20 getresuid(&ruid, &euid, &suid); 21 printf("ruid %ld, euid %ld, suid %ld\n", (long)ruid, (long)euid, (long)suid); 22 23 printf("sleep\n"); 24 sleep(3600); 25 26 return 0; 27}
試したこと
一方、suやsudoコマンドでユーザーを切り替えて起動したシェル等は、/proc/PID/の所有者がそのユーザー(例:user1)になっていました。
$ sudo su - user1 [user1@localhost ~]$ id uid=1234(user1) gid=1234(user1) groups=1234(user1) [user1@localhost ~]$ echo $$ 142257 [user1@localhost ~]$ ls -l /proc/142257/ total 0 -r--r--r-- 1 user1 user1 0 May 9 21:24 arch_status dr-xr-xr-x 2 user1 user1 0 May 9 21:24 attr -rw-r--r-- 1 user1 user1 0 May 9 21:24 autogroup -r-------- 1 user1 user1 0 May 9 21:24 auxv (snip) dr-x------ 2 user1 user1 0 May 9 21:24 fd (snip) [user1@localhost ~]$ ls -l /proc/142257/fd/ total 0 lrwx------ 1 user1 user1 64 May 9 21:35 0 -> /dev/pts/4 lrwx------ 1 user1 user1 64 May 9 21:35 1 -> /dev/pts/4 lrwx------ 1 user1 user1 64 May 9 21:35 2 -> /dev/pts/4 lrwx------ 1 user1 user1 64 May 9 21:35 255 -> /dev/pts/4 lr-x------ 1 user1 user1 64 May 9 21:35 3 -> /var/lib/sss/mc/passwd
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/09 15:33
2020/05/09 15:38
2020/05/10 02:02