Linux Setuid 具有读/写的特殊权限标志

Linux Setuid 具有读/写的特殊权限标志

是否设定值仅适用于执行文件(仅适用于可执行标志)?

它将如何影响同一文件的其他权限(读/写)!

例如:- 如果实际文件权限是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

你会发现它没有问题,因为有效权限更改为用户读取权限。

为什么会出现这种情况?我想到了几个原因。首先,任何人都不需要拥有运行可执行文件的读取权限,因为内核(加载程序)已经拥有执行任何操作的完全权限。如果您想查看可执行文件的内容,则只需具有读取权限,通常这样您就可以复制该文件。举一些可能的例子,可执行文件可能包含用户不应该看到的敏感数据(强烈建议不要这样做,但已经发生了!),或者系统正在使用它作为深度防御,以防止人们发现漏洞。

相关内容