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是一个只能由 root 修改的文件

-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

问题是,您调用 function system(),它调用 shell /bin/sh。并且 shell/bin/sh没有设置 suid 位。这就是打印Permission denied消息的原因。

您必须用纯 C 代码编写该部分:

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

相关内容