Linux open() システムコールとフォルダ権限

Linux open() システムコールとフォルダ権限

コースがあります。ルートが所有するプロセスによって生成されます。後ろにsetguid() を作成し、 setuid() を呼び出してユーザーとして実行します。ゆう

プロセスファイルを作成してみてくださいFフォルダにF(ルートファイルシステムでは)はrootが所有し、次の権限を持ちます。

drwxrwx---    2 root     root

関数呼び出しは次のとおりです。

open(path , O_CREAT | O_RDWR , 0660);

コマンドを実行するとps -e -o cmd、uid、euid、ruid、suid、gid、egid、rgid、sgid 結果は次のとおりです。

/my/process    500   500   500   500   500   500   500   500

これはプロセスを確認します。rootでは実行できませんが、プロセスは不思議に実行されています。ゆう文書Fフォルダの下に作成されますFルートとそのグループメンバーのみを書き込むことができます。

-rw-rw---- 1 U U

だからファイルの所有者はゆう

Bashで同じことをしようとすると、期待どおりに「Permission Denied」というメッセージが表示されます。

$ touch /F/f
touch: cannot touch `/F/f': Permission denied

フォルダを設定するとF権限:

drwx------    2 root     root

その後、open()呼び出しは期待どおりに「Permission Denied」のために失敗します。

なぜそれができますか?ルートグループに書き込み権限を付与すると、そのフォルダにファイルが作成されますか?

これメモこのコマンドは、すべてのuidとgidが関連するユーザーIDに設定されていることを示します。どうすれば可能ですか?

グループメンバーシップです。そしてゆう:

$groups root
root : root

$groups U
U : U G

だからゆう持つG補助グループとして

$lid -g root
 root(uid=0)
 sync(uid=5)
 shutdown(uid=6)
 halt(uid=7)
 operator(uid=11)

$lid -g U
 U(uid=500)

$lid -g G
 U(uid=500)

これは次のことを示します。ゆうはいメンバーG

答え1

コメントに記載されている@jdwolfのように、問題は補足セットかもしれません。setgid()削除されません。

簡単なテストとして、以下はGIDとUIDを呼び出して変更した後に実行する./dropプログラムです。setregid()setreuid()nobodyid

# id
uid=0(root) gid=0(root) groups=0(root)
# ./drop
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup),0(root)

ゼログループもあります。追加setgroups(0, NULL)(前setuid())するとグループが削除されます。

# ./drop2
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)

もちろん、他のターゲットユーザーはグループに追加されません。

関連情報