CWE-94
Weakness ID:94(Weakness Class)
Status: Draft
コード・インジェクション
解説
解説要約
上位コンポーネントからの影響がある入力を使用したコードセグメントの全部、もしくは一部を構築するソフトウェアにおいて、意図するOSコマンドの構文やふるまいを改ざんすることが可能な要素を適切に無効化しないようにする脆弱性です。
詳細な解説
ソフトウェアがユーザ入力にコードを含めることを許可する場合、意図した制御フローを改ざんされる等の方法により、攻撃者によりコードを作成される可能性があります。これにより、任意のコードを実行される可能性があります。
インジェクションの問題は様々な脆弱性を含み、対処策もそれぞれ大きく異なります。しかし、全てのインジェクションの問題は、ユーザの入力に制御用のコードを挿入することが可能であるという共通点を持ちます。バッファオーバーフロー等の他の脆弱性は、攻撃を成功させるためにはソフトウェア上の欠陥が必要です。しかし、インジェクションの脆弱性はソフトウェアの欠陥に依存せず、正常な処理を悪用することで攻撃が成功します。この脆弱性のカテゴリにおける最も典型的な例として、SQL インジェクションおよび書式文字列の問題があります。
脆弱性の発生時期
アーキテクチャおよび設計
実装
該当するプラットフォーム
言語
インタープリタ型言語
一般的な影響
機密性
挿入されたコードにより、制限されたデータおよびファイルにアクセスされる可能性があります。
認証
挿入されたコードにより、認証が制御される可能性があります。それにより、リモートの脆弱性を招く恐れがあります。
アクセス制御
挿入されたコードにより、本来攻撃者が直接アクセス権限を持たないリソースにアクセスされる可能性があります。
完全性
制御データの挿入は、常にデータの読み出しや書き込みを伴うため、ほぼ全てのコードインジェクション攻撃はデータの完全性を損います。加えて、任意のコードを実行される可能性があります。
説明責任
挿入されたコードにより実行されたアクションは、ログに痕跡が残らない場合があります。
攻撃を受ける可能性
中
脆弱なコード例
例 1:
以下の例は、メッセージファイルにユーザのメッセージを書き込み、ユーザにそのメッセージの閲覧を許可するものです。
サンプル言語: PHP (悪い例)
$MessageFile = "cwe-94/messages.out"; if ($_GET["action"] == "NewMessage") { $name = $_GET["name"]; $message = $_GET["message"]; $handle = fopen($MessageFile, "a+"); fwrite($handle, "<b>$name</b> says '$message'<hr>¥n"); fclose($handle); echo "Message Saved!<p>¥n"; } else if ($_GET["action"] == "ViewMessages") { include($MessageFile); }
MessageFile は、データのみが含まれることを想定されていますが、攻撃者はメッセージに以下の様な入力する可能性があります。
(攻撃)
name=h4x0r message=%3C?php%20system(%22/bin/ls%20-l%22);?%3E
このメッセージは、以下の様にデコードされます。
(攻撃)
<?php system("/bin/ls -l");?>
一見、通常のデータファイルの内容として挿入されるように思われますが、PHP はこのデータを含んだファイルを解析しコードを実行します。このコードは一般ユーザがメッセージを閲覧する度に実行されます。
この様な状況下では、XSS (CWE-79) 攻撃をされる可能性もあるため注意が必要です。
被害の緩和策
フェーズ:アーキテクチャおよび設計
動的にコードを生成しないよう、プログラムをリファクタリングして下さい。
フェーズ:アーキテクチャおよび設計
プロセスとオペレーティングシステムの間で厳重な境界を強制する "jail" や、類似するサンドボックス環境の中でコードを実行してください。これにより、ソフトウェア上で実行される可能性のあるコードを効果的に制限可能です。
例として、Unix chroot jail 及び AppArmor が挙げられます。一般的に、コードの管理により、いくつかの保護機能が提供されます。
これは、ふさわしい解決策ではない可能性があります。また、オペレーティングシステムへの被害を限定するだけであり、残りのアプリケーションは侵害の対象のままです。
CWE-243 及びその他の jail に関連する脆弱性の回避には注意してください。
フェーズ:実装
戦略: 入力の妥当性チェック
全ての入力は悪意のあるものと想定してください。仕様に厳密に従い許可する入力のホワイトリストを使用する等、既知の受け入れられている入力の妥当性チェック手法を用いてください。仕様に反する入力を拒否する、あるいは入力を仕様に適応する形に変化させてください。ブラックリストに依存してしまう等、悪意のある、あるいは不正な入力を探すことのみに依存しないでください。しかし、ブラックリストは予測される攻撃の検知や、無条件に拒否するべき不正な入力を決定する際に役立ちます。
入力値の妥当性をチェックする際、関連しそうな全ての要素(長さ、入力タイプ、許容する値の範囲、入力の過不足、構文、関連するフィールド間の一貫性、及びビジネスルールの一致、等)について考慮してください。ビジネスルールの例として、"boat" は英数字しか含まないため構文的に有効ですが、もし開発者が "red" や "blue" のような色の名前を想定する場合には有効ではない、というロジックが挙げられます。
類似するコードインジェクションを減少させるために、許可する構造を厳しく制限したホワイトリストを使用してください。関数を呼び出すコードを動的に構築している場合は、英数字のみの入力では不十分な可能性があることを確認してください。攻撃者により、許可するつもりのない危険な関数(system()、exec()、exit()等)を参照される可能性があります。
フェーズ:テスト
本脆弱性を検出可能な自動静的分析ツールを使用してください。最近の多くの手法は、フォールスポジティブを最小化するためにデータフロー分析を使用しています。ただしツールによる検出では 100% の精度やカバーは実現不可能であるため、完璧な解決策とはなりません。
フェーズ:テスト
ファズテスト(ファジング)、ロバストネステスト(頑健性のテスト)や、フォールトインジェクション(エラーをわざと起こすテスト)等、多種多様な入力を持つ膨大なテストケースを使用してソフトウェアを分析する、動的なツールや技術を使用してください。ソフトウェアの処理速度は低下しますが、処理が不安定になったり、クラッシュする、不正確な結果を出すといったことはありません。
フェーズ:オペレーション
戦略: コンパイル、ビルドの強化
Perl の 「-T」 スイッチ等、汚染検出機能を自動実行し、汚染された変数を含むコマンドの実行を防ぐ環境でコードを実行して下さい。誤って危険性がある入力に対して、汚染されていないという印がつかないように正確に入力の妥当性を確認するように注意しなければなりませんが、汚染された変数を取り除くための妥当性を確認するステップを強制的に実行して下さい。(CWE-183、CWE-184をご参照下さい)
関係性
Nature | Type | ID | Name | View(s) this relationship pertains to |
---|---|---|---|---|
ChildOf | Weakness Class | 74 | Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection') | Development Concepts (primary)699 |
Research Concepts (primary)1000 | ||||
ChildOf | Weakness Class | 691 | Insufficient Control Flow Management | Research Concepts1000 |
ChildOf | Category | 752 | 2009 Top 25 - Risky Resource Management | Weaknesses in the 2009 CWE/SANS Top 25 Most Dangerous Programming Errors (primary)750 |
ParentOf | Weakness Base | 95 | Improper Neutralization of Directives in Dynamically Evaluated Code ('Eval Injection') | Development Concepts (primary)699 |
Research Concepts (primary)1000 | ||||
ParentOf | Weakness Base | 96 | Insufficient Control of Directives in Statically Saved Code (Static Code Injection) | Development Concepts (primary)699 |
Research Concepts (primary)1000 | ||||
ParentOf | Weakness Base | 621 | Variable Extraction Error | Research Concepts (primary)1000 |
ParentOf | Weakness Base | 627 | Dynamic Variable Evaluation | Development Concepts (primary)699 |
Research Concepts (primary)1000 | ||||
MemberOf | View | 635 | Weaknesses Used by NVD | Weaknesses Used by NVD (primary)635 |
CanFollow | Compound Element: Composite | 98 | Improper Control of Filename for Include/Require Statement in PHP Program ('PHP File Inclusion') | Development Concepts699 |
Research Concepts (primary)1000 |
要調査事項 (CWE の見解)
本脆弱性の多くは研究中および調査中であり、脆弱性の名称も改善の余地があります。
他組織での分類
組織名または組織での分類 | ノード ID | CWEの分類との適合度 | 分類名 |
---|---|---|---|
PLOVER | CODE | Code Evaluation and Injection |
関連する攻撃パターン
CAPEC-ID | 攻撃パターン名 (CAPEC Version 1.5) |
---|---|
35 | Leverage Executable Code in Nonexecutable Files |
77 | Manipulating User-Controlled Variables |
更新履歴
[2011年04月21日]
2010年10月12日時点のデータを元に更新
[2009年06月29日]
2009年02月02日時点の下記 URL を元に作成
http://cwe.mitre.org/data/definitions/94.html
登録日 2011/04/21
最終更新日 2023/04/04