Command Injectionとは、アプリケーションの動作を悪用して、デバイス上で実行中のプログラムと同じ権限でオペレーティングシステム上のコマンドを実行することです。これはOWASPフレームワークのトップテンの脆弱性の一つとして挙げられています。また、攻撃者がシステム自体への直接的なアクセスを得ることなく、アプリケーションに攻撃者が提供するペイロードのシーケンスを実行させることができるため、"Remote Code Execution" (RCE) とも呼ばれます。
この脆弱性は、PHP、Python、NodeJSなどのプログラミング言語で頻繁に使用される関数を使用して、データを転送し、マシンのオペレーティングシステム上でシステムコールを行うために存在します。例として、入力フィールドからの入力を取得し、ファイル内のエントリを検索する場合が挙げられます。
攻撃者は、このプログラムの脆弱性を利用して、自分のコマンドを実行させることができます。
あるWebアプリケーションがあり、ユーザーはIPアドレスを入力すると、サーバーがそのIPアドレスに対してpingを実行し、結果をユーザーに返します。
攻撃者はこの機能を悪用して、次のような入力をすることができます:
127.0.0.1 & cat /etc/passwd
Command Injectionは、以下の2つの方法のいずれかで検出できることが多いです:
Blind Command Injection: ペイロードをテストする際、アプリケーションから直接の出力はなく、攻撃者はペイロードが成功したかどうかを発見するためにアプリケーションの動作を分析する必要があります。
Verbose Command Injection: ペイロードをテストした後、攻撃者はプログラムから即座に応答を受け取ります。
この脆弱性を回避する方法はいくつかありますが、プログラム言語で有害な関数やライブラリを使用することから、ユーザー入力に依存せずに入力をフィルタリングすることまで、さまざまな方法が考えられます。
- ユーザー入力の検証: ユーザーからの入力を信頼せず、特定のパターンや値にのみ一致する入力のみを受け入れるようにします。
- ホワイトリスト方式: 期待される入力のホワイトリストを作成し、それ以外の入力を拒否します。
- 外部コマンドの使用を避ける: 可能であれば、外部システムコマンドの実行を避け、代わりにプログラム言語の組み込み関数やライブラリを使用します。
- エスケープ処理: システムコマンドを実行する前に、ユーザー入力を適切にエスケープ処理します。
- 最小権限の原則: アプリケーションが実行されるアカウントの権限を最小限に保ち、不要な権限を持たせないようにします。
- セキュリティライブラリの使用: コマンドインジェクションを防ぐためのセキュリティライブラリやフレームワークを使用します。
- 環境変数の制限: システムの環境変数を制限し、攻撃者がこれを利用してコマンドを実行するのを防ぎます。
- 入力長の制限: ユーザーからの入力の長さを制限し、大量のコマンドやペイロードの挿入を防ぎます。