如果设置了 SETUID,执行程序的用户是否无法访问不允许的文件?

如果设置了 SETUID,执行程序的用户是否无法访问不允许的文件?

我有两个用户,第一个是ace,第二个是ej

ace 在其主目录中有一个文件,它是一个 shell 脚本,具有以下权限集(我使用了 setuid )

-rwsr--r-x 1 ace ace 15 Jan 20 05:18 /home/ace/myshellscript

脚本的内容很简单,列出如下

echo "`whoami`"

cat ./testPrevEsc

但是如果我尝试读取 (testPrevEsc) 拥有的另一个文件,ace我认为我可以通过传入cat filename$1 来完成,我认为我应该能够做到这一点,无论为其他人设置的权限如何,只要楼主能看懂,但我看不懂,为什么?

我对 setuid 的理解是,程序或 shell 是由所有者执行的,而不是执行用户(在我的例子中是 ej ),那么为什么我不能读取文件并仍然获取 whoai 作为ej而不是ace?另一方面,做的sudo whoami很好,它给你root权限,而不是你正在运行的用户,我想我在这里遗漏了一些东西。

答案1

发生这种情况是因为 bash 解释器没有,setuid它仍然使用用户的 uid 运行ej,并且为了执行类似的操作,您将必须更改解释器的 uid。

以下视频可能会有所帮助 -https://youtu.be/iv5gflNM7rc?si=o-Ren0ow-nmojgAk

上面的视频方法只有在我们同意获取 的权限时才有效root,因为/usr/bin/bash无论您使用什么 shell,它都将由 root 本身拥有,但在我们的例子中ace不是 root,所以方法是通过 ac 程序,例如下列的。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    printf("euid is set to %u\n", geteuid());
    FILE* f = fopen("/home/ace/testPrevEsc", "r");
    if(!f){
        perror("File open failed");
        return 1;
    }else{
        int c;
        while ((c =fgetc(f)) != EOF)
        {
           putchar(c);
        }

        fclose(f);
    }

    return 0;
}

因为调用system会将有效用户 ID 设置回在我们的例子中没有权限的用户,这ej就是为什么我们得到whoami的返回值是 asej和 not ace

相关内容