いくつかのPIDと絶対ファイルパス[シンボリックリンクではなく、通常のファイル]があると仮定すると、PIDがこのファイルへの読み取りアクセス権を持っていることを確認する最も効率的な方法は何ですか?
2 に答える
私はこれを行う1つの方法しか知りません。まず、パス/proc/
+ PIDを作成して、プロセスのUIDとGIDを見つけます。たとえば/proc/4261
。次に、そのパスをstat()して、そのUIDとGIDを取得します。次に、読み取りアクセスを確認するファイルをstat()し、プロセスのUID/GIDに読み取り権限があるかどうかを確認します。
(すでに「/ proc / [PID]」パスを作成していることを前提としていますpath_to_proc
。)
struct stat buf;
// Get UID and GID of the process.
stat(path_to_proc, &buf);
uid_t proc_uid = buf.st_uid;
gid_t proc_gid = buf.st_gid;
// Get UID and GID of the file.
stat(path_to_file_you_want_to_check, &buf);
// If the process owns the file, check if it has read access.
if (proc_uid == buf.st_uid && buf.st_mode & S_IRUSR) {
// Yes, the process has read access.
}
// Check if the group of the process's UID matches the file's group
// and if so, check for read/write access.
else if (proc_gid == buf.st_gid && buf.st_mode & S_IRGRP) {
// Yes, the process has read access.
}
// The process's UID is neither the owner of the file nor does its GID
// match the file's. Check whether the file is world readable.
else if (buf.st_mode & S_IROTH) {
// Yes, the process has read access.
}
コードは完全ではないことに注意してください。プロセスのユーザーが、ユーザーのプライマリグループでなくても、実際にファイルのグループに属している可能性は処理されません。これに対処するには、getgrouplist()を使用する必要があります(つまり、最初にプロセスUIDを実際のユーザー名を含む文字列に変換してから、返されたすべてのグループをファイルのグループと比較し、一致する場合は、グループ読み取りアクセス(S_IRGRP)を確認してください。)
ファイルを開きます。それが本当に知る唯一の方法です。関係する答えでstat(2)
は、パーミッションビットを解釈し、それらをアクティブなuid/gidおよび補足グループと比較するコードを作成する必要があります。いずれにせよ、一般的なケースでは不完全です。selinuxやapparmorなどのLSMフックは、従来のUnixパーミッションモデルではキャプチャされないファイルにパーミッションモデルを実装することもできます。