5

Cでsetuidプログラムを作成しました。実行可能ファイルは次のようになります。

-r-s-r-s--- 1 root users 13073 Jun 15 21:56 server

プログラムをとして実行しuserA/users、uid/gidをに設定しようとしuserB/otherUsersます。setgid()操作が許可されていない状態で失敗します。userA効果的なgidを変更するにはotherUsersどうすればよいですか?


[編集]これが私がしたことの簡単な要約です。userAとして実行される私のCプログラムは、uidとgidをuserBに設定し、ファイルを作成します。予期しないことに、失敗したため、ファイルはグループルートに属していsetgid()ます。

[userA@node uid]$ id
uid=11945(userA) gid=544(users) groups=544(users)
[userA@node uid]$ id userB
uid=11946(userB) gid=10792(otherUsers) groups=10792(otherUsers)
[userA@node uid]$ cat uid.c 
#include <stdio.h>
#include <unistd.h>

int main() {
  setuid(11946);
  setgid(10792);

FILE *f = fopen("userB_file", "w");
fclose(f);

return 0;
}
[userA@node uid]$ ls -l uid
-r-sr-sr-x 1 root root 7130 Jun 17 14:16 uid
[userA@node uid]$ ./uid 
[userA@node uid]$ ls -l userB_file 
-rw-r--r-- 1 userB root 0 Jun 17 14:19 userB_file
4

1 に答える 1

21

setuid前に電話しているのではないかと思いますsetgid。uidをroot以外に変更するために呼び出すとすぐにsetuid、gidを任意の値に変更する許可を失います。setgid最初に呼び出してから、を呼び出す必要がありますsetuid

于 2012-06-16T11:12:31.010 に答える