我正在学习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;
}