5

org.apache.commons.execJavaライブラリを使用して実行可能ファイルを呼び出したい。オブジェクトはCommandLineコマンドラインインジェクションから保護しますか?たとえば、私が呼び出す場合:

String singleStringArgument = "-whatever;rm -rf ~/*"; // evil looking argument!
CommandLine cl = new CommandLine(new File(pathToExe,exeName)); 

cl.addArgument(singleStringArgument);  // oh no!

Executor exe = new DefaultExecutor();
exe.execute(cl);

意図したコマンドにrm -rf ~/*加えて実行されますか?もしそうなら、これから保護するための最良の方法は何ですか?

APIはaddArgument()「引用符を処理する」と言っていますが、このコンテキストでそれが何を意味するのかわかりません。Linuxボックスで何が起こるかを確認するためにテストケースを作成することもできますが、他のプラットフォームでも安全であることを確認したいと思います。

4

3 に答える 3

4

;シェルの機能です。コマンドラインsh -cなどを作成しないと、注入することができません。コモンズが安全であるというわけではありません。それは、脆弱性を備えたプログラムを実行していないということです。

CommonsCLIはProcessクラスをラップしています。シェルを起動するためのProcessクラスは文書化されていません。execあなたがそれを言うことの指定された引数で行うことが文書化されています。

コメントによると、オープンソースの驚異の1つは、ソースを読むことができるということです。コモンズのバージョンXの場合-CLIはあなたが好きなことをし、それに依存し、再チェックせずにアップグレードしないでください。

于 2011-06-14T00:41:31.840 に答える
1

それで、あなたはコマンド(pathToExe)を制御し、引数だけを心配していますか?コマンドをどれだけ知っていますか?別のプログラムを実行できる可能性はありますか?二次コマンドを呼び出さなくても、何か損害を与える可能性はありますか?プログラムに他の脆弱性(バッファオーバーフローなど)がありますか?

一般的な答えとして、このアプローチは、特にこれをクロスプラットフォームで機能させたい場合は、私にはふさわしくないようです。実行するコマンドがわかっていて、入力を制限できる場合は、きしむことができるかもしれませんが、本当に正当な理由がない限り、個人的にはこのアプローチを使用しません。

于 2011-06-14T01:00:36.223 に答える
0

私の提案は、可能であればプログラムを安全側でエラーにし、コマンド自体を発行するだけで、コマンドフラグメントを愚かに実行したり、エンドユーザーが発行した引数を渡したりしないことです。注射には多くのバリエーションがあります。;すでに説明したものです。バックティックを使用することもできます(バックティックでラップrm -rf ~/*すると、シェルが最初にそれを解釈します)ユーザーは、誤ってまたは意図的にエイリアスを呼び出すこともできます。うまくいかないことがあるもののリストは無限です。

于 2011-06-14T04:16:45.237 に答える