Runtime.exec()を使用して実行可能ファイルを実行しています。私は調査を行ってきましたが、これをアプリケーションで使用するとセキュリティ上の懸念がある可能性があることがわかりました。Runtime.exec()を使用して実行可能ファイルを実行するときにセキュリティ上の懸念はありますか?
2 に答える
@Jeanne Boyarsky:Runtime.exec()が最初にシェル(Windowsの場合はcmd.exe、Linuxの場合はsh / bash / csh / ksh)を生成して実行しない限り、Runtime.exec()に前述の方法で挿入できないようです。指図。これについて説明している良いリンクがあります。
私はこれをテストするための小さなプログラムを書きました。ユーザー入力としてコマンドを受け取ります。したがって、「pwd」(Linuxシステム)と入力すると、現在のディレクトリがシステムコンソールに出力されます。これは完全に機能します。
ただし、Linuxで許可されているpwd; idなどの2つのコマンドを実行しようとすると、すぐに例外がスローされます。スローされる例外は次のとおりです。
javax.faces.el.EvaluationException:java.io.IOException:プログラム "pwd; ls"を実行できません:error = 2、そのようなファイルまたはディレクトリはありません
とは言っても、これが問題になる状況もあります。次のようなコードがある場合:
プロセスproc=runtime.exec(cmd);
...ユーザーはsh-cpwd; idの入力を提供できるため、シェルが実行され、その中でコマンドがチェーンされます。
つまり、手伝うことができれば、Runtime.exec()を使用しないのが最善です。使用する必要がある場合は、すべてのユーザー入力を正規化し、特定の文字とコマンドのみを許可するようにしてください。
安全なコードを書く方法についての良い読み物がここにあります。
私が考えることができる最大のものはコマンドインジェクションです。実行されるものをホワイトリストに登録して、Runtime.execを介して誰かが「rm/」を実行できないようにします。これを実現するには、想像以上に多くの方法があります。たとえば、「ディレクトリ」名が「foo; rm-r;ls」として渡された場合はどうなりますか。
もう1つは、これがWebアプリケーションの場合、アプリケーションのアクセス許可(したがって、Runtime.exec()コマンドラインは、Webページにアクセスする人が持っているものと同じではないということです。つまり、その人はあなたのTomcatまたはデータベースへのデータの挿入または...