0

setuidビットを設定してPythonスクリプトを実行可能にしようとしています。ユーザー'bgmc'に属するプログラムは、ディレクトリ'/ home / bgmc'にいくつかのファイルを作成する必要がありますが、別のユーザー'client'によって呼び出されます。確かに、私はユーザー「クライアント」がプログラムによって作成されたファイルを変更することを望んでいません。c-wrapperを使用してプログラムを呼び出しました(シェルスクリプトのsetuidを参照)。

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

int main()
{
    setuid(0);
    system("/home/bgmc/myprogram.sh");
    return 0;
}

プログラムのsetuidビットをオンに設定しました。c-compiledプログラムがrootに属する場合、プログラムは正常に実行され、期待されるファイルを作成します。cでコンパイルされたプログラムのプロパティは次のとおりです。

8 -rws--x--x 1 root root 4657 Mar  2 16:25 myprogram

ただし、myprogramのユーザーグループをbgmc:bgmcに変更すると、プログラムはファイルを作成できなくなります:「アクセスが拒否されました」。行を変更しようとしました:

setuid(0);

と:

setuid(1002);

1002は'bgmc'のユーザーIDであるため(これにはコマンド "id -u bgmc"を使用しました)、これは役に立ちませんでした。

私はむしろプログラムへのrootアクセスを与えたくない。これを防ぐ方法はありますか?

4

1 に答える 1

3

あなたの質問は情報が非常に少ないのでこれについてはよくわかりませんが、所有者を変更した後にファイルのアクセス許可をリセットするのを忘れましたか?ほとんどのシステムでは、所有権を変更するとsetuidビットが自動的に削除されるため、必要に応じて自分で再追加する必要があります。

また、setuidシェルスクリプトが主要な脆弱性であることに注意してください。これが、カーネルがシェルスクリプトsetuidを直接作成することを許可しない理由です。少なくとも、次のことを行う必要があります。

  1. 呼び出すのでexecveはなく使用し、system
  2. 環境からすべてをクリアします(または新しい空の環境をに渡しますexecve)。

現在のように、プログラムを実行できる人は誰でも、環境変数を制御することによって、好きなようにプログラムを実行させることができます。

于 2012-03-02T17:07:43.663 に答える