CWE-134
Weakness ID:134(Weakness Base)
Status: Draft
書式文字列の問題
解説
解説要約
本脆弱性が存在するソフトウェアは、printf 系列の関数に外部から制御可能な書式文字列を使用しています。この関数は、バッファオーバーフローやデータ表示の問題を招く可能性があります。
脆弱性の発生時期
実装
該当するプラットフォーム
言語
C 言語
C++
Perl (頻度低)
書式文字列をサポートする言語
脆弱性の発生状況
まれに、ユーザの入力した文字列を書式文字列として扱うプログラムが存在します。本脆弱性は、書式文字列が指定されていないログメッセージを構築するコード内に頻繁に発生します。
地域化や国際化等の場合には、言語固有のメッセージのリポジトリが攻撃手段として使用される可能性があります。しかし リポジトリの制御により、攻撃者はメッセージ長、書式、コンテンツの改ざんも可能であるため、書式文字列の問題は他の脆弱性の結果として発生します。
一般的な影響
影響を受ける範囲 | 影響 |
---|---|
機密性 | 書式文字列の問題は、プログラムへの攻撃を単純化する様な情報の開示を招く可能性があります。 |
アクセス制御 | 書式文字列の問題により、任意のコードを実行される可能性があります。 |
攻撃を受ける可能性
非常に高い
検出手段
自動静的分析
本脆弱性は自動静的分析によって検出が可能です。最近のツールの多くは、フォールスポジティブを最小化するために、データフロー分析や制約ベースの技術を使用しています。
ブラックボックス:
書式文字列の問題は、極めて珍しい状況 (エラーメッセージのログ取得等) で発生する場合が多いため、ブラックボックス方式による検知は困難です。潜在的な問題の多くは、ソースコードや同等のソースに関連しない、実行ファイルに存在する傾向にあります。
有効性:限定的
脆弱なコード例
例 1:
以下の例は、printWrapper() 関数の中で、printf() を呼び出すために攻撃される可能性があります。(攻撃を単純化するため、スタックバッファーが追加されました。)
サンプル言語: C (悪い例)
#include <stdio.h> void printWrapper(char *string) { printf(string); } int main(int argc, char **argv) { char buf[5012]; memcpy(buf, argv[1], 5012); printWrapper(argv[1]); return (0); }
例 2:
以下の例は、snprintf()を利用してコマンドラインの引数をバッファにコピーします。
サンプル言語: C (悪い例)
int main(int argc, char **argv){ char buf[128]; ... snprintf(buf,128,argv[1]); }
このコードでは、攻撃者がスタックの内容を閲覧し、書式指定子を含むコマンドラインの引数を使用してスタックに書き込むことが可能です。「%x」 などの書式指定子を、関数が要求する以上に入力することで、スタックの内容を読み取ることが可能です。(この例では、関数は書式化される引数を受け取っていません。)
攻撃者は「%n」を使用し、snprintf() によりこれまでの出力バイト数を指定された引数に書き込みながら、スタックに書き込む可能性があります。これは、引数から値を読み込むという、想定された動作とは異なるものです。 巧妙な手口では、スタック上のポインタ値を完全に制御するために、4 バイト分ずらして書き込みます。
例 3:
実装によっては、メモリの位置を制御する書式指定子により、メモリを読み書きする攻撃が成功する可能性が高まります。書式指定子の例として glibc で記述された以下のコードを挙げます。
サンプル言語: C (悪い例)
printf("%d %d %1$d %1$d¥n", 5, 9);
このコードは、 「5 9 5 5」 と出力されます。また、half-writes (%hn) を使用しても、メモリ内の任意の DWORDS を正確に制御することが可能です。このことにより、例1の様な、4 バイト分ずらして書き込む必要のある攻撃を単純化することが可能です。
発見された事例
参照 | 詳細 |
---|---|
CVE-2002-1825 | format string in Perl program |
CVE-2001-0717 | format string in bad call to syslog function |
CVE-2002-0573 | format string in bad call to syslog function |
CVE-2002-1788 | format strings in NNTP server responses |
CVE-2007-2027 | Chain: untrusted search path enabling resultant format string by loading malicious internationalization messages |
被害の緩和策
フェーズ:要件定義
本脆弱性の影響を受けない言語を使用して下さい。
フェーズ:実装
全ての書式文字列関数が、ユーザが制御できない静的な文字列であり、その上、その関数に適切な数の引数が渡されていることを確認して下さい。可能ならば、書式文字列において 「%n」 をサポートしない関数を使用して下さい。
ビルド:不適切な使用を警告している可能性があるため、コンパイラおよびリンカーの警告に注意して下さい。
その他の補足
書式文字列の脆弱性は、一般的にバッファオーバーフローのカテゴリに分類されますが、厳密にはバッファはオーバーフローしていません。
書式文字列の問題における脆弱性は、比較的新しい問題であり (1999頃) 、可変引数を受け取る関数が、受け取った引数の数を確認する現実的な手段が存在しないことに起因します。C言語のランタイム関数を含め、可変引数を受け取る関数の中で最も一般的なものは、 printf() 系列です。
書式文字列の問題は様々な形で現れます。
書式指定子のない *printf() コールは危険であり、攻撃される可能性があります。例えば、同じコンテキストにおいて、printf(y,input); は攻撃されることがありませんが、printf(input); には攻撃される可能性があります。 printf(input); コールが不正に利用された結果、入力文字列は書式指定子として使用されるため、攻撃者にスタックメモリを覗かれる可能性があります。残ったパラメータはスタックから引き出されるため、攻撃者は書式指定子と共に入力文字列を詰め込み、スタックの値を読み取り始めます。最悪の場合には、この不正利用により、任意の値 (または攻撃プログラムの条件となる値) を稼動中のプログラムのメモリに書き込む制御を与えてしまう可能性があります。
一般的に、攻撃対象となるのはファイル名、プロセス名、識別子です。
書式文字列の問題は、C/C++言語における既知の脆弱性であり、容易に検知できることもあって現在はほとんど存在しません。書式文字列の問題が攻撃を受ける主な原因の一つは 「%n」 の書式指定子にあります。「%n」は、引数によって指定されたメモリに対し、それまでに書式文字列によって表示された文字数を書き込みます。書式文字列を巧妙に生成することで、悪意あるユーザはスタックの値を利用して write-what-where condition (CWE-123) を引き起こす可能性があります。
また、他の書式指定子も同様に攻撃に使用される可能性があります。例えば、「%9999s」の書式指定子は、バッファオーバーフローの誘発や、fprintf の様なファイルフォーマット関数で使用された場合、予期したよりも大きな出力を生成する可能性があります。
発生における他の脆弱性との依存関係
依存関係 | 詳細 |
---|---|
独立的 | 他の脆弱性の有無に関係せず、独立して発生 |
関係性
Nature | Type | ID | Name | View(s) this relationship pertains to |
---|---|---|---|---|
ChildOf | Weakness Class | 20 | Improper Input Validation | Seven Pernicious Kingdoms (primary)700 |
ChildOf | Weakness Class | 74 | Failure to Sanitize Data into a Different Plane (aka 'Injection') | Development Concepts (primary)699 |
Research Concepts (primary)1000 | ||||
ChildOf | Category | 133 | String Errors | Development Concepts699 |
ChildOf | Category | 633 | Weaknesses that Affect Memory | Resource-specific Weaknesses (primary)631 |
ChildOf | Category | 726 | OWASP Top Ten 2004 Category A5 - Buffer Overflows | Weaknesses in OWASP Top Ten (2004) (primary)711 |
ChildOf | Category | 743 | CERT C Secure Coding Section 09 - Input Output (FIO) | Weaknesses Addressed by the CERT C Secure Coding Standard (primary)734 |
ChildOf | Category | 808 | 2010 Top 25 - Weaknesses On the Cusp | Weaknesses in the 2010 CWE/SANS Top 25 Most Dangerous Programming Errors(primary)800 |
PeerOf | Weakness Base | 123 | Write-what-where Condition | Research Concepts1000 |
MemberOf | View | 630 | Weaknesses Examined by SAMATE | Weaknesses Examined by SAMATE (primary)630 |
MemberOf | View | 635 | Weaknesses Used by NVD | Weaknesses Used by NVD (primary)635 |
要調査事項 (CWE の見解)
C言語以外の言語における書式文字列の問題は調査中です。メモリまたはディスク消費、コントロール制御、データ破損は、Perl、 PHP、Python などの C言語 以外の言語で書かれたアプリケーションにおける書式文字列の攻撃の要因となります。
影響を受けるシステムリソース
メモリ
機能分野
ログの取得
エラー
一般的なアウトプット
原因の性質
不明確(開発者の行動の結果によらない脆弱性)
他組織での分類
組織名または組織での分類 | ノード ID | CWEの分類との適合度 | 分類名 |
---|---|---|---|
PLOVER | Format string vulnerability | ||
7 Pernicious Kingdoms | Format String | ||
CLASP | Format string problem | ||
CERT C Secure Coding | FIO30-C | Exact | Exclude user input from format strings |
OWASP Top Ten 2004 | A1 | CWE More Specific | Unvalidated Input |
CERT C Secure Coding | FIO30-C | Exclude user input from format strings | |
WASC | 6 | Format String |
ホワイトボックスの定義
コードパスが以下の条件を満たす脆弱性
1. 開始ステートメントで入力を受付ける場合
2. 以下の条件を満たす終了ステートメントで文字列処理関数に書式を渡す場合
・入力データは文字列の一部であり、かつ、望ましくない書式文字列である場合
※上記の「望ましくない」とは、以下の状態を指します。
1. 検証されていない
2. 誤った方法で検証されている
参照
Steve Christey. "Format String Vulnerabilities in Perl Programs". <http://www.securityfocus.com/archive/1/418460/30/0/threaded>.
Hal Burch and Robert C. Seacord. "Programming Language Format String Vulnerabilities". <http://www.ddj.com/dept/security/197002914>.
Tim Newsham. "Format String Attacks". Guardent. September 2000. <http://www.lava.net/~newsham/format-string-attacks.pdf>.
[REF-11] M. Howard and D. LeBlanc. "Writing Secure Code". Chapter 5, "Format String Bugs" Page 147. 2nd Edition. Microsoft. 2002.
更新履歴
[2011年04月21日]
2010年10月12日時点のデータを元に更新
[2009年06月29日]
2009年02月02日時点の下記 URL を元に作成
http://cwe.mitre.org/data/definitions/134.html
登録日 2011/04/21
最終更新日 2023/04/04