SETUIDを設定すると、プログラムを実行しているユーザーは許可されていないファイルにアクセスできませんか? [コピー]

SETUIDを設定すると、プログラムを実行しているユーザーは許可されていないファイルにアクセスできませんか? [コピー]

2人のユーザーがいますaceej

aceのホームディレクトリには、次の権限セットを持つシェルスクリプトであるファイルがあります(私はsetuidを使用しました)。

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

スクリプトの内容は非常に簡単で、次のようになります。

echo "`whoami`"

cat ./testPrevEsc

ところで(testPrevEsc)が所有している他のファイルを読み取ろうとすれば$1を渡せばaceできそうですcat filename。ところでわかりません、なぜですか?

setuidの私の理解は、プログラムまたはシェルが実行ユーザー(私の場合は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どのシェルを使用しても、ルート自体が所有していますが、私たちの場合はルートではありませんace。以下のもの。

#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を私たちの場合、権限のないユーザーにリセットするため、戻り値をasとnotでej取得する理由です。whoamiejace

おすすめ記事