Webアプリケーション攻撃

コマンドインジェクション こまんどいんじぇくしょん

OSコマンドインジェクションシェルインジェクション入力値検証脆弱性不正コマンド実行Webセキュリティ
コマンドインジェクションについて教えて

簡単に言うとこんな感じ!

Webサービスの入力フォームに「こっそり命令文」を混ぜ込んで、サーバーのOSを乗っ取ろうとする攻撃だよ!「名前を入力してね」という欄に悪意あるシステムコマンドを紛れ込ませると、サーバーが素直に実行してしまうことがあるんだ。ファイルを全部消されたり、情報を丸ごと盗まれたりする超危険な攻撃ってこと!


コマンドインジェクションとは

コマンドインジェクション(Command Injection)とは、Webアプリケーションやシステムがユーザーからの入力値を適切に検証・サニタイズ(無害化)せずにOSのコマンドとして実行してしまう脆弱性、およびその脆弱性を突く攻撃手法のことです。「インジェクション(injection)」は「注入」という意味で、正規の処理の流れに悪意あるコマンドを「注入」するイメージです。

攻撃者がこの脆弱性を悪用すると、サーバーのオペレーティングシステム(OS)上で任意のコマンドを実行できてしまいます。その結果、個人情報や機密ファイルの窃取サーバーの設定変更マルウェアのインストール、さらにはシステム全体の乗っ取りまで至る可能性があり、セキュリティ上の脅威としては最高クラスに位置づけられます。

コマンドインジェクションは、OWASP(オワスプ:Webセキュリティの国際標準を定める団体)が公開する「OWASP Top 10」においても、長年にわたって上位にランクインし続けている重大な脆弱性カテゴリです。特に社内システムや発注したWebサービスに外部入力を受け付ける機能がある場合は、開発会社に対して対策状況を必ず確認すべき項目です。


攻撃の仕組みと構造

コマンドインジェクションがどのように起きるか、具体的な流れで見てみましょう。

攻撃が成立する典型的な流れ

ステップ正常なリクエスト攻撃リクエスト
① ユーザー入力192.168.1.1192.168.1.1; rm -rf /
② サーバーの処理ping 192.168.1.1ping 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のシェル 悪用するもの シェルコマンド 影響範囲 OS全体・ ファイルシステム 危険度 ★★★★★ (最高レベル) SQLインジェクション 注入先 データベース 悪用するもの SQL文 影響範囲 DB内のデータ・ 認証bypass 危険度 ★★★★★ (最高レベル) XSS (クロスサイトスクリプティング) 注入先 ブラウザ(HTML) 悪用するもの JavaScriptコード 影響範囲 閲覧ユーザーの ブラウザ上 危険度 ★★★☆☆ (高〜中レベル) 発注時のチェックポイント 「外部入力値をシェルコマンドに渡す処理はエスケープ・サニタイズされているか?」 「OSコマンドを直接呼び出す実装は避け、ライブラリ経由にしているか?」 「セキュリティ診断(脆弱性診断)の実施を開発仕様に含めているか?」

主な対策方法

コマンドインジェクション対策として、開発会社に確認・要求すべき点を整理します。

対策内容重要度
OSコマンド呼び出しを避けるそもそもシェルを経由せず、言語標準のライブラリを使う設計にする◎ 最優先
入力値のホワイトリスト検証許可する文字・形式だけを受け付け、それ以外は拒否する◎ 最優先
エスケープ処理シェルのメタ文字を無害化してからコマンドに渡す○ 重要
最小権限の原則アプリの実行ユーザーに必要最小限の権限だけを与える○ 重要
WAF(Web Application Firewall)の導入既知の攻撃パターンを検知・遮断するフィルター層を設ける△ 補完的
脆弱性診断の実施開発後にセキュリティ専門家が攻撃者視点でテストする◎ 最優先

関連する規格・RFC

規格・番号内容
OWASP Top 10 2021 (A03)インジェクション攻撃全般。コマンドインジェクションを含む最重要脆弱性カテゴリ
CWE-78OS Command Injection。共通脆弱性タイプ一覧(CWE)における識別番号
CVE(個別番号)実際に発見されたコマンドインジェクション脆弱性には個別のCVE番号が付与される
NIST SP 800-53米国標準技術研究所のセキュリティ管理策。入力検証・最小権限の原則を規定
IPA「安全なウェブサイトの作り方」日本のIPA(情報処理推進機構)が公開する開発者向けガイドライン。OSコマンドインジェクション対策を明記

関連用語