コマンドインジェクション こまんどいんじぇくしょん
簡単に言うとこんな感じ!
Webサービスの入力フォームに「こっそり命令文」を混ぜ込んで、サーバーのOSを乗っ取ろうとする攻撃だよ!「名前を入力してね」という欄に悪意あるシステムコマンドを紛れ込ませると、サーバーが素直に実行してしまうことがあるんだ。ファイルを全部消されたり、情報を丸ごと盗まれたりする超危険な攻撃ってこと!
コマンドインジェクションとは
コマンドインジェクション(Command Injection)とは、Webアプリケーションやシステムがユーザーからの入力値を適切に検証・サニタイズ(無害化)せずにOSのコマンドとして実行してしまう脆弱性、およびその脆弱性を突く攻撃手法のことです。「インジェクション(injection)」は「注入」という意味で、正規の処理の流れに悪意あるコマンドを「注入」するイメージです。
攻撃者がこの脆弱性を悪用すると、サーバーのオペレーティングシステム(OS)上で任意のコマンドを実行できてしまいます。その結果、個人情報や機密ファイルの窃取、サーバーの設定変更、マルウェアのインストール、さらにはシステム全体の乗っ取りまで至る可能性があり、セキュリティ上の脅威としては最高クラスに位置づけられます。
コマンドインジェクションは、OWASP(オワスプ:Webセキュリティの国際標準を定める団体)が公開する「OWASP Top 10」においても、長年にわたって上位にランクインし続けている重大な脆弱性カテゴリです。特に社内システムや発注したWebサービスに外部入力を受け付ける機能がある場合は、開発会社に対して対策状況を必ず確認すべき項目です。
攻撃の仕組みと構造
コマンドインジェクションがどのように起きるか、具体的な流れで見てみましょう。
攻撃が成立する典型的な流れ
| ステップ | 正常なリクエスト | 攻撃リクエスト |
|---|---|---|
| ① ユーザー入力 | 192.168.1.1 | 192.168.1.1; rm -rf / |
| ② サーバーの処理 | ping 192.168.1.1 | ping 192.168.1.1; rm -rf / |
| ③ OS側の実行 | pingコマンドを実行 | pingを実行した後、全ファイルを削除 |
| ④ 結果 | 正常なレスポンス | サーバーが破壊される |
攻撃で使われる主なメタ文字(特殊記号)
シェル(OSの命令受付窓口)には、複数のコマンドをつなげるための特殊記号が存在します。攻撃者はこれを悪用します。
| メタ文字 | 意味 | 例 |
|---|---|---|
; | 前のコマンドの後に続けて実行 | cmd1; cmd2 |
&& | 前が成功したら次を実行 | cmd1 && cmd2 |
|| | 前が失敗したら次を実行 | cmd1 || cmd2 |
| | 前の出力を次の入力に渡す | cmd1 | cmd2 |
` | バッククォート内のコマンドを実行 | `cmd` |
$() | コマンド置換 | $(cmd) |
コマンドインジェクションの種類
┌─────────────────────────────────────────────┐
│ コマンドインジェクションの種類 │
├──────────────────┬──────────────────────────┤
│ インバンド型 │ 攻撃結果がそのまま画面に │
│(直接確認できる) │ 表示されるタイプ │
├──────────────────┼──────────────────────────┤
│ ブラインド型 │ 結果は表示されないが、 │
│(間接的に確認) │ 時間差や別経路で確認する │
└──────────────────┴──────────────────────────┘
ブラインド型は画面に何も表示されないため「対策済み」と誤解されやすいですが、攻撃者は処理時間の差(タイムベース)や外部サーバーへのアクセス(アウトオブバンド)を使って、こっそり情報を盗み出します。
覚え方:「注射器で毒を注入」
「インジェクション=注射・注入」と覚えましょう。正規の注射器(入力フォーム)を使って、体(サーバー)に毒(悪意あるコマンド)を注入するイメージです。注射器自体は普通のものでも、中身が毒なら大問題、というわけです。
歴史と背景
- 1990年代後半:CGI(Common Gateway Interface)を使ったWebアプリケーションが普及し始め、シェルコマンドを呼び出す処理が増加。コマンドインジェクションの脆弱性が初めて注目される
- 2001年前後:セキュリティ研究者がコマンドインジェクションの危険性を体系的に報告。Webサーバーへの攻撃事例が世界中で報告される
- 2003年:OWASPが「OWASP Top 10」の初版を公開。インジェクション攻撃全般が最重要脆弱性として掲載される
- 2010年代:スマートフォンアプリやIoT機器の普及により、対象範囲がWebだけでなく組み込みシステムにまで拡大
- 2017年:OWASP Top 10 2017版で「インジェクション」が第1位に
- 2021年:OWASP Top 10 2021版でも「インジェクション」は第3位を維持(SQL・コマンド・LDAPなどを含む広義カテゴリとして)
- 現在:クラウド環境やコンテナ技術の普及で影響範囲がさらに拡大。発注側もセキュリティ要件として対策を明示することが求められる時代に
コマンドインジェクション vs 類似攻撃の比較
コマンドインジェクションは「インジェクション攻撃」の一種ですが、よく混同される攻撃と違いを押さえておきましょう。
主な対策方法
コマンドインジェクション対策として、開発会社に確認・要求すべき点を整理します。
| 対策 | 内容 | 重要度 |
|---|---|---|
| OSコマンド呼び出しを避ける | そもそもシェルを経由せず、言語標準のライブラリを使う設計にする | ◎ 最優先 |
| 入力値のホワイトリスト検証 | 許可する文字・形式だけを受け付け、それ以外は拒否する | ◎ 最優先 |
| エスケープ処理 | シェルのメタ文字を無害化してからコマンドに渡す | ○ 重要 |
| 最小権限の原則 | アプリの実行ユーザーに必要最小限の権限だけを与える | ○ 重要 |
| WAF(Web Application Firewall)の導入 | 既知の攻撃パターンを検知・遮断するフィルター層を設ける | △ 補完的 |
| 脆弱性診断の実施 | 開発後にセキュリティ専門家が攻撃者視点でテストする | ◎ 最優先 |
関連する規格・RFC
| 規格・番号 | 内容 |
|---|---|
| OWASP Top 10 2021 (A03) | インジェクション攻撃全般。コマンドインジェクションを含む最重要脆弱性カテゴリ |
| CWE-78 | OS Command Injection。共通脆弱性タイプ一覧(CWE)における識別番号 |
| CVE(個別番号) | 実際に発見されたコマンドインジェクション脆弱性には個別のCVE番号が付与される |
| NIST SP 800-53 | 米国標準技術研究所のセキュリティ管理策。入力検証・最小権限の原則を規定 |
| IPA「安全なウェブサイトの作り方」 | 日本のIPA(情報処理推進機構)が公開する開発者向けガイドライン。OSコマンドインジェクション対策を明記 |
関連用語
- SQLインジェクション — データベースへの不正なSQL文を注入して情報を盗む攻撃。コマンドインジェクションと並ぶ最重要脆弱性
- XSS(クロスサイトスクリプティング) — Webページに悪意あるスクリプトを埋め込み、閲覧ユーザーを攻撃する手法
- 入力値検証(バリデーション) — ユーザーからの入力データが正しい形式・内容かをチェックするセキュリティの基本処置
- サニタイズ — 入力値に含まれる危険な文字や記号を無害化する処理
- WAF(Webアプリケーションファイアウォール) — Webへの攻撃パターンを検知・遮断するセキュリティ装置
- OWASP Top 10 — Webアプリケーションの重大な脆弱性ランキング。セキュリティ要件策定の基準として活用される
- 脆弱性診断 — システムのセキュリティ上の弱点を専門家が調査・報告するサービス