Linux setuidが機能しない

Linux setuidが機能しない

私はLinux suidを学んでいるので、テストするために以下を含む小さなCプログラムを書いています。

#include<stdio.h>
int main(){
system("echo 100 >> test.txt");
return 0;
}
-rwsr-xr-x 1 root root 8004 Sep 10 16:19 test

test.txtルートのみを変更できるファイルです。

-rw-r----- 1 root root 

100ユーザーアカウントを使用してテストプログラムを実行した場合は、空のファイルに追加する必要があります。しかし、結果は次のようになりました。

sh:test.txt:Permission denied

なぜ?

答え1

あなたのシナリオは私にとって完璧に動作します。

$ ls -l test*
-rwsr-xr-x 1 root  root  6776 Jan 24 17:18 test
-rw-r--r-- 1 chris chris   74 Jan 24 17:18 test.c
-rw-r----- 1 root  root     0 Jan 24 17:20 test.txt
$ ./test
ls -l test.txt
-rw-r----- 1 root root 4 Jan 24 17:21 test.txt
$ sudo cat test.txt
100

setuid実行可能ファイルを許可しないファイルシステムでプログラムをテストすることは可能ですか?コマンドを実行し、次のようにmountファイルシステムを探します。nosuid

tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec,relatime)

答え2

問題は、関数を呼び出すとsystem()シェルが呼び出されることです/bin/sh。そしてシェルは/bin/shsuidビットを設定しません。これがPermission deniedメッセージが印刷される理由です。

この部分は純粋なCコードで書く必要があります。

int main() {
  FILE *fd = fopen("test.txt", "a");
  fprintf(fd, "%s", "100");
  fclose(fd);
  return 0;
}

関連情報