コースがあります。人ルートが所有するプロセスによって生成されます。後ろに人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()
nobody
id
# 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)
もちろん、他のターゲットユーザーはグループに追加されません。