是否设定值仅适用于执行文件(仅适用于可执行标志)?
它将如何影响同一文件的其他权限(读/写)!
例如:- 如果实际文件权限是4711,非所有者用户无法读取。为什么不提升所有者权限4711并允许其他人阅读内容。
答案1
非所有者无法读取该文件,因为 setuid 和 setgid 只影响有效权限当文件被执行时;否则,将使用文件权限。这是一个可以尝试的示例程序:
自述文件.c
#include <stdio.h>
int main(int argc, char **argv) {
FILE *f;
int i;
char c;
if(argc>1) {
f=fopen(argv[1],"rb");
for(i=1; i++<100;) {
c=getc(f);
printf("%x%s", (int)c, i%50?" ":"\n");
}
fclose(f);
}
}
编译它并以您想要测试的人以外的人的身份更改其权限(我使用过root
):
# gcc -Wall -o readme readme.c
# chown root:root readme
# chmod ug+s,o-rw readme
验证权限并尝试以测试用户身份读取文件:
erik ~ $ ls -la readme
-rwsr-s--x 1 root root 8064 May 4 12:05 readme
erik ~ $ cat readme
cat: readme: Permission denied
现在尝试运行该程序并让它读取自身:
erik ~ $ ./readme readme
7f 45 4c 46 2 1 1 0 0 0 0 0 0 0 0 0 3 0 3e 0 1 0 0 0 fffffff0 5 0 0 0 0 0 0 40 0 0 0 0 0 0 0 40 18 0 0 0 0 0 0 0
0 0 0 40 0 38 0 9 0 40 0 1d 0 1c 0 6 0 0 0 4 0 0 0 40 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 fffffff8 1 0
你会发现它没有问题,因为有效权限更改为用户和读取权限。
为什么会出现这种情况?我想到了几个原因。首先,任何人都不需要拥有运行可执行文件的读取权限,因为内核(加载程序)已经拥有执行任何操作的完全权限。如果您想查看可执行文件的内容,则只需具有读取权限,通常这样您就可以复制该文件。举一些可能的例子,可执行文件可能包含用户不应该看到的敏感数据(强烈建议不要这样做,但已经发生了!),或者系统正在使用它作为深度防御,以防止人们发现漏洞。