setuid ルート C プログラムからのスクリプトの呼び出し - スクリプトはルートとして実行されません

06 以降 実行可能ファイルのビットは、実行可能ファイルが実行される有効な UID (EUID) のみを変更し、14 である実際の UID (RUID) は変更しません。 26 の制限に加えて 解釈されたスクリプト (「38 で始まるすべての実行可能ファイル」 ")、45 のようないくつかのシェル この場合、追加の安全対策として EUID を RUID に戻すため、55 の呼び出しを使用する必要があります。 スクリプトを実行する前に C コードで。

63 を参照してください 70 のページ 、 8599 、および 102 実際の有効な UID の正確なセマンティクスを学習します。

(警告 ) もちろん、これは 115 の制限について言及するのに適切なポイントです。 多くの Unix システム、シェル、およびインタープリターのスクリプトが存在するのには理由があります。それは、スクリプトが実行時の入力と環境の状態をサニタイズすることにあまり注意を払っていない場合、それらは危険であり、セキュリティのエスカレーションに悪用される可能性があるためです。 .したがって、これを行うときは十分に注意してください。スクリプトとラッパーへのアクセスをできる限り厳密に設定し、実行する予定のこの非常に特定のスクリプトのみを許可し、スクリプトを開始する前に C プログラム内の環境をクリアし、121<などの環境変数を設定します。 /コード> 必要なものを正しい順序で正確に格納し、他のユーザーが書き込み可能なディレクトリを含めないようにします。


ここで注意すべきもう 1 つの点は、ここでの制限は bash によるものであり、*nix システム自体によるものではないということです。 Bash は実際に SUID スクリプトを検証して、EUID ルートでのみ実行します。古いシェルを使用すると、箱から出してすぐに必要なものが得られることがよくあります。たとえば、sh はこの種の検証を行いません:

$ cat wrapper.c
int main(void)
{
            system("/bin/sh -c whoami");
}

$ ls -l wrapper
-rwsr-sr-x 1 root users 8887 Feb 17 14:15 wrapper
$ ./wrapper
root

バッシュの場合:

$ cat wrapper.c
int main(void)
{
            system("/bin/bash -c whoami");
}

$ ls -l wrapper
-rwsr-sr-x 1 root users 8887 Feb 17 14:18 wrapper
$ ./wrapper
skinp

それでも、Tom の答えは、SUID ルート プログラムのラッパーを作成するための一般的な方法です


スクリプトに setuid(0) を追加してコンパイルします。この後、動作するはずです。

$ cat wrapper.c 
int main(void) 
{ 
        setuid(0);
        system("/bin/bash ./should_run_as_root.sh"); 
} 
$ gcc -o wrapper wrapper.c 
$ sudo chown root wrapper 
$ sudo chmod ug+s wrapper 
$ ll wrapper 
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper 
$