3

重複の可能性:
C、C++ から Linux でシステム コマンドを発行する

Linux プログラミングで system() 呼び出しを使用するのは良くないというテキストを目にしましたが、その本当の理由は何だろうか? より多くのメモリとおそらくより多くの CPU を消費するはずです。これら以外に、どのような理由が考えられるでしょうか。

たとえば、私のプログラム/Linux システムでハッカーができることsystem("echo 1 > file");を使用する代わりに入力した場合はどうなりますか? fopen(), fwrite()セキュリティ上の問題により、 system() はお勧めできません。しかし、system() 呼び出しを使用したという理由だけで、どのようにして Linux システムをハッキングできるのでしょうか? system() を使用すると何が悪くなるかを誰かが具体的に説明できれば幸いです。

4

3 に答える 3

7

文字通り使用system("echo 1 > file");することはセキュリティリスクではなく、必要のない別のプロセスを不必要に実行するだけです。

プログラムで文字列を作成し、それをで使用すると、リスクが発生しますsystem()次に、1つのコマンドを作成していると思っていたシェルコマンドインジェクションのリスクがありますが、悪意のあるユーザーが慎重に作成された入力を提供することでプログラムを破壊し、コマンドが予期しないことを実行します。

于 2012-07-09T13:12:09.840 に答える
4

問題は、システムに渡された文字列が信頼できるソースから安全であると信頼していることです。次のようなものがあるとします。

char *command = null;
//Read command from external source;
system(command);

コマンドが安全で、「rm -fr ~/*」のような厄介なことをしないと信頼できますか? fopen を使用しても、ハッカーが /etc/passwd などのファイル名を渡して不要なものを読み取る可能性があるため、必要な安全にはなりません。外界とのインターフェイスをプログラムする最終的な行。これは、外部ユーザーができることに対する検証と制限を入れる場所です。

于 2012-07-09T13:18:54.403 に答える
1

System(3)は別のプロセスを開始し、コマンド インタープリター ("/bin/sh -c") を実行してコマンドを実行します。プログラムが SUID または SGID ビットで実行されている場合、これは問題になる可能性があります。シェルの動作は、多くの環境変数によって制御されており、これらの変数のいくつかは、コマンド インタープリターの制御を取得するために使用できます。この状況は、SUID または SGID シェル スクリプトの実行に似ています。

于 2012-07-09T13:22:25.663 に答える