rootにsetuidのCプログラムからスクリプトを呼び出す - スクリプトはrootとして実行されません。
質問
私は、root(パスワードなしのsudoのか、suコマンド実行可能ではない)としてbashスクリプトを実行する必要があり、あなたは、Linuxでスクリプトをsetuidをすることができないので、私は実行からそれを呼び出すと、のそれのsetuidのことについて考えました:
$ cat wrapper.c
int main(void)
{
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
$
正しくスクリプトを実行中として - - これは動作しますが、スクリプトは「./wrapper」を実行するユーザーとして実行されます。
。なぜ?そして、どのようにこれを正しく実装するには?
ありがとうございます。
解決
実行可能でsuid
ビットのみ有効なUID(EUID)実行可能ファイルとして実行されず戻りgetuid()
実UID(RUID)、およびsuid
上の制限に加えて、任意の実行可能ファイルが始まる(スクリプトを解釈しますが変化するので「#!
」)は、この場合にはRUIDに戻っEUIDを設定します余分な安全対策としてbash
のようないくつかのシェルは、スクリプトを実行する前に、Cコードのコールsetuid(0)
を使用する必要があります。
本物と効果的なのUIDの正確な意味を学ぶためにman
、setuid
、seteuid
、およびgetuid
のgeteuid
ページを参照してください。
(の警告の)もちろん、これは多くのUnixシステム、貝殻や通訳でsuid
スクリプトに制限することを言及するために、適切なポイントである、場合、そのスクリプトである理由でありますその入力と、それが実行される環境の状態を消毒については非常に慎重ではない、彼らは危険であり、セキュリティのエスカレーションのために利用することができます。これを行うときに非常に注意してください。あなたはできるだけ厳密スクリプトやラッパーへのアクセスを設定し、唯一のあなたが実行する予定のこの非常に特定のスクリプトを許可し、スクリプトを起動する前に、あなたのCプログラム内で環境をクリアし、そのような正確に何を格納するためのPATH
などの環境変数を設定します右の順と他の人に書き込み可能な無ディレクトリに必要です。
他のヒント
ここで注意すべきもう一つは、ここでの制限はbashをしていない* nixのシステム自体からであるということです。 bashは実際にのみEUIDルートでそれらを実行にSUIDスクリプトの検証を行います。古い殻を取る場合、あなたは多くの場合、あなたが箱から出して欲しかったものでしょう。例えば、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
はbashでます:
$ 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
それでも、トムの答えは、一般的に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
$
の例は恐ろしく安全ではないと知識の2つのビットを持つ誰もがsetuidユーザーとして彼らが望む任意のプログラムを実行することができます。
あなたが最初の環境をサニタイズしない限り、シェルを介して行くことはありません、ここで示した例のほとんどは、それを実行する前に設定IFSとPATHを有することに脆弱である。
なぜsudoは実行可能ではないでしょうか?
:それは、次のような荒れ狂うセキュリティホールを回避しますbash-3.2$ cat test
#!/bin/bash
echo ima shell script durp durp
bash-3.2$ chmod +x test
bash-3.2$ ./test
heh heh
bash-3.2$
環境に適切にサニタイズされていないことが原因、この場合は例えばます:
export echo='() { builtin echo heh heh; }'
須藤、この場合、カスタムSUIDラッパーに書き込むために十分ではないであろう、おそらく他のエッジケースと落とし穴をサニタイズ。