コマンド注入攻撃 (コマンドチュウニュウコウゲキ) とは | 意味や読み方など丁寧でわかりやすい用語解説
コマンド注入攻撃 (コマンドチュウニュウコウゲキ) の読み方
日本語表記
コマンド注入攻撃 (コマンドチュウニュウコウゲキ)
英語表記
command injection (コマンドインジェクション)
コマンド注入攻撃 (コマンドチュウニュウコウゲキ) の意味や用語解説
コマンド注入攻撃(Command Injection)は、Webアプリケーションなどのプログラムが持つ脆弱性の一つである。この攻撃は、外部からの入力値を適切に処理しないまま、サーバーのオペレーティングシステム(OS)上でコマンドを実行する機能に渡してしまうことで発生する。攻撃者はこの脆弱性を悪用し、アプリケーション開発者が意図しない不正なOSコマンドを注入して実行させる。その結果、サーバー内の情報を窃取されたり、データを改ざん・破壊されたり、最悪の場合にはサーバーを完全に乗っ取られたりするなど、極めて深刻な被害を引き起こす可能性がある。SQLインジェクションがデータベース(SQL)に対する攻撃であるのに対し、コマンド注入攻撃はOSそのものに対する攻撃であり、成功した場合の影響範囲がより広範に及ぶことが多い。 この攻撃の具体的な発生メカニズムを理解するために、あるWebアプリケーションの機能を例に挙げる。このアプリケーションには、ユーザーが入力したファイル名を受け取り、そのファイルの詳細情報を表示する機能があると仮定する。内部では、受け取ったファイル名を引数として、Linuxの`ls -l`コマンドを実行している。例えば、ユーザーが「report.pdf」と入力すると、サーバー内部では`ls -l report.pdf`というコマンドが生成され、実行される。これは正常な動作である。しかし、ここで攻撃者が入力値として「report.pdf; rm -rf /」という文字列を送信したケースを考える。アプリケーションがこの入力値を何ら検証せずにそのままコマンドに連結すると、サーバー内部で実行されるコマンドは`ls -l report.pdf; rm -rf /`となる。シェルのコマンドラインでは、セミコロン(;)は複数のコマンドを連続して実行するための区切り文字として解釈される。そのため、まず`ls -l report.pdf`が実行され、続いて`rm -rf /`という、ルートディレクトリ以下の全ファイルを強制的に削除する極めて危険なコマンドが実行されてしまう。このように、セミコロン(;)やパイプ(|)、アンド(&)といった、シェルで特別な意味を持つメタ文字を悪用することで、攻撃者は任意のコマンドを注入することが可能となる。他の例としては、`cat /etc/passwd`のようなコマンドを注入してパスワードファイルを盗み見たり、`wget`や`curl`コマンドを使って外部から不正なプログラムをダウンロードさせ、実行させることでマルウェアに感染させたり、サーバーを外部への攻撃の踏み台として悪用したりすることも考えられる。 コマンド注入攻撃による被害は多岐にわたる。最も代表的なものは、サーバー内に保存されている機密情報の漏洩である。設定ファイル、顧客情報、ソースコードなどが外部に流出する可能性がある。また、前述の例のように、ファイルやディレクトリを不正に操作されることによるデータの改ざんや破壊も深刻な脅威である。さらに、攻撃者がバックドアを設置することで、いつでもサーバーに侵入できる状態を作り出し、サーバーを完全に制御下に置くことも可能となる。一度乗っ取られたサーバーは、他のシステムへの攻撃の起点として利用されたり、迷惑メールの大量送信やDDoS攻撃の踏み台にされたりする可能性があり、被害は自組織内にとどまらない。 この脆弱性を防ぐための対策は、システム開発において不可欠である。最も根本的かつ確実な対策は、外部からの入力値を用いてOSコマンドを生成し、実行するような実装を避けることである。多くのプログラミング言語には、ファイル操作やプロセス管理など、OSコマンドで実現したい処理を代替する安全なライブラリやAPIが用意されている。可能な限りこれらの標準機能を利用し、シェルを介したコマンド実行そのものを実装しないことが推奨される。やむを得ずOSコマンドを実行する必要がある場合でも、いくつかの重要な対策を講じなければならない。第一に、外部からの入力値をOSコマンドの引数として渡す前に、厳密な検証(バリデーション)を行うことである。例えば、入力値が特定のパターン(英数字のみ、特定のファイル拡張子のみなど)に合致するかをチェックし、許容された文字以外はすべて拒否するホワイトリスト方式が有効である。第二に、シェルが特別に解釈するメタ文字を無害化するエスケープ処理を徹底することである。しかし、エスケープすべき文字は多岐にわたり、OSやシェルの種類によっても異なるため、完全な実装は非常に難しい。そのため、第三の対策として、引数を安全にコマンドへ渡すための専用APIを利用することが強く推奨される。多くの言語では、コマンドと引数をそれぞれ別の文字列(または配列)として渡し、シェルを介さずに直接プロセスを起動する機能が提供されている。この方法を用いれば、引数として渡された文字列がコマンドの一部として解釈されることを防げるため、コマンド注入攻撃を原理的に防止できる。最後に、ウェブサーバーなどのアプリケーションを実行するユーザーアカウントの権限を必要最小限に留める「最小権限の原則」を適用することも重要である。これにより、万が一攻撃が成功した場合でも、実行されるコマンドの権限が制限され、被害を局所化できる可能性が高まる。 コマンド注入攻撃は、単純な実装ミスから壊滅的な被害につながる非常に危険な脆弱性である。システムエンジニアは、外部からの入力を扱う処理を実装する際には常にこの攻撃のリスクを念頭に置き、安全な実装方法を徹底することが求められる。