解説:教えて那々子先生
アプリ内にOSのコマンドを呼び出して実行する処理が存在する場合、OSコマンドインジェクションの脆弱性のリスクが高まります。特に、コマンドを組み立てる際にユーザー入力値を使用している場合、ユーザーが細工した入力すると、想定しているコマンド以外の物を実行できてしまうことがあります。
例えば、アプリ内の処理でpingコマンドを実行する場合を考えてみましょう。
ping [ユーザーが入力した送信先]
というコマンドを組み立てて実行する処理があるとします。
まず正常な動作を考えてみましょう。
ユーザーが「192.0.2.1」と入力した場合、以下のコマンドが実行されることになります。
ping 192.0.2.1
では、ユーザーが「192.0.2.1 | rm hogehoge」という入力をするとどうなるでしょうか?
ping 192.0.2.1 | rm hogehoge
というコマンドが実行されます。
パイプ記号(|)は、左側のコマンドの出力を右側のコマンドの入力に引き渡すものです。したがって、左のコマンドと右のコマンドの両方が実行されることとなります。
したがって、「ping」コマンドだけでなく「rm」コマンドも実行されてしまい、「hogehoge」と言うファイルを削除する処理が実行されてしまうのです。
ping $(rm hogehoge)
$記号も禁止で
ping `rm hogehoge`
OSコマンドインジェクションは、そのアプリが実行されている権限でOSのコマンドを実行できてしまうことが問題です。特に問題になり得るのが、サーバープログラムにOSコマンドインジェクションの脆弱性が存在する場合です。
サーバープログラムの権限で任意のコマンドを実行できる状態となると、攻撃によって本来アクセスできない情報にアクセスしたり、マルウェアを設置したりすることが可能となります。情報漏えいのリスクだけでなく、第三者への攻撃の踏み台とされて攻撃者に加担する結果となってしまうケースもあります。
また、サーバープログラムだけでなく、ローカルアプリケーションでも問題は発生し得ます。例えば、キオスク端末のようにユーザーの操作を制限している端末に対して、イタズラをすることも可能となることでしょう。
