CWE-119
Weakness ID:119(Weakness Class)
Status: Draft
バッファエラー
解説
解説要約
メモリバッファ上でオペレーションを行うソフトウェアにおいて、メモリ内に意図するバッファの境界外へ読み書きが可能な際に発生する脆弱性です。
詳細な解説
特定の言語においてはメモリアドレスの直接指定が許可されており、指定されたメモリバッファのアドレスの妥当性を自動的に検証しません。これにより、他の変数、データ構造や内部のプログラムデータと関連するメモリの位置へ読み書きが可能となります。
その結果、攻撃者は任意のコード実行、意図する制御フローへの改ざん、機密情報の読み取り、またはシステムの破壊が可能です。
別名
メモリコラプション
「メモリコラプション」は一般的に、バッファの外側のメモリに書きこまれる用語として利用されます。根本的な原因は、メモリの固定開始位置から過度なシーケンシャルなコピー以外の何かによるものです(例:古典的バッファオーバーフロー、あるいは CWE-120)。これには不正確なポインタ計算、不完全な初期化やメモリ解放による不正なポインタへのアクセス、といった問題も含まれます。
脆弱性の発生時期
アーキテクチャおよび設計
実装
オペレーション
該当するプラットフォーム
言語
C
C++
アセンブリ言語
メモリ管理がサポートされていない言語
プラットフォームの補足
多くのプログラミング言語においてメモリバッファの境界外から操作される可能性がありますが、言語やプラットフォーム、チップのアーキテクチャによりその影響は大きく左右されます。
一般的な影響
完全性
攻撃者がアクセス可能なメモリを制御できる場合、バッファーオーバーフローと同様に、任意のコードを実行される可能性があります。
メモリのポインタの値(通常、32ビットか64ビット)を上書き可能な場合、攻撃者の悪意あるコードにリダイレクトする可能性があります。1バイトの書き込みでも、任意のコードを実行される可能性があります。原因として、同じ脆弱性が繰り返し悪用されることや、そのユーザが管理者であるかどうかを示すフラグ等、セキュリティ上重要なアプリケーション固有の情報が上書きされる可能性があることが挙げられます。
可用性
確保された領域外のメモリにアクセスされることにより、高い確率で関連するメモリ、場合によってはインストラクションが破損し、クラッシュする可能性があります。また、プログラムを無限ループさせる等、可用性が失われる可能性もあります。
機密性
境界外の読み取りの場合、攻撃者は機密情報へのアクセス権を持っているかもしれません。機密情報がシステムの詳細情報を含む場合(バッファメモリの現在地等)、この情報はさらなる攻撃に悪用され、より深刻な結果となる可能性があります。
攻撃を受ける可能性
高い
検出手段
自動静的分析
本脆弱性は自動静的分析によって検出が可能です。最近のツールの多くは、フォールスポジティブを最小化するために、データフロー分析や制約ベースの技術を使用しています。
一般的に自動静的分析は、メモリの外部でのオペレーションをレポートする際、環境を考慮した説明を行いません。これにより、ユーザはどの警告から調査すべきか決定することが困難になります。例えば、分析ツールは、setuid やその他の特権で実行することを予期していないプログラムのコマンドラインの引数から発生するバッファオーバーフローをレポートすることがあります。
有効性:高
バッファに関連するエラーの検出手法は、その他の脆弱性タイプに対する手法よりも適しています。
自動動的分析
本脆弱性は、ファズテスト(ファジング)、ロバストネステスト(頑健性のテスト)や、フォールトインジェクション(エラーをわざと起こすテスト)等、多種多様な入力を持つ膨大なテストケースを使用してソフトウェアを分析する動的なツールや技術を用いて検出することが可能です。
ソフトウェアの処理速度は低下しますが、処理が不安定になったり、クラッシュする、不正確な結果を出すということはありません。
脆弱なコード例
例 1:
以下の例は、ユーザのIPアドレスを取得し、適格であることを確認した後、ホスト名を調べてバッファ内にコピーを作成するものです。
サンプル言語: C (悪い例)
void host_lookup(char *user_supplied_addr){ struct hostent *hp; in_addr_t *addr; char hostname[64]; in_addr_t inet_addr(const char *cp); /*routine that ensures user_supplied_addr is in the right format for conversion */ validate_addr_form(user_supplied_addr); addr = inet_addr(user_supplied_addr); hp = gethostbyaddr( addr, sizeof(struct in_addr), AF_INET); strcpy(hostname, hp->h_name); }
この関数は、ホストネームを保存するためのバッファとして 64 バイトを割り当てていますが、ホストネームは必ずしも 64 バイト以内とは限りません。攻撃者により、非常に長いホストネームを解決するアドレスが指定された場合、機密データの上書きや、制御フローを奪取される可能性があります。
例 2:
以下の例は、入力された文字列をエンコードプロシージャに与え、バッファに格納するものです。
サンプル言語: C (悪い例)
char * copy_input(char *user_supplied_string){ int i, dst_index; char *dst_buf = (char*)malloc(4*sizeof(char) * MAX_SIZE); if ( MAX_SIZE <= strlen(user_supplied_string) ){ die("user string too long, die evil hacker!"); } dst_index = 0; for ( i = 0; i < strlen; i++ ){ if( '&' == user_supplied_string[i] ){ dst_buf[dst_index++] = '&'; dst_buf[dst_index++] = 'a'; dst_buf[dst_index++] = 'm'; dst_buf[dst_index++] = 'p'; dst_buf[dst_index++] = ';'; } else if ('<' == user_supplied_string[i] ){ /* encode to < */ } else dst_buf[dst_index++] = user_supplied_string[i]; } return dst_buf; }
アンパサンド (&) をユーザのコントロールする文字列 (&) にエンコードしようとしていますが、エンコード前は有効だった文字列の長さが、エンコードにより超過してしまう可能性があります。その上、エンコードによる文字数の増加は4文字までと想定していますが、アンパサンドの場合は5文字分増加します。結果、攻撃者が大量のアンパサンドを入力すると、送り先バッファはオーバーフローします。
例 3:
以下の例は、ユーザが項目を選択するためオフセットするよう要求するものです。
サンプル言語: C (悪い例)
int main (int argc, char **argv) { char *items[] = {"boat", "car", "truck", "train"}; int index = GetUntrustedOffset(); printf("You selected %s¥n", items[index-1]); }
ユーザがリスト内のどの要素を選択するか指定することを許可していますが、攻撃者は範囲外のオフセットを与え、buffer over-read (CWE-126) を招きます。
発見された事例
参照 | 詳細 |
---|---|
CVE-2009-2550 | Classic stack-based buffer overflow in media player using a long entry in a playlist |
CVE-2009-2403 | Heap-based buffer overflow in media player using a long entry in a playlist |
CVE-2009-0689 | large precision value in a format string triggers overflow |
CVE-2009-0690 | negative offset value leads to out-of-bounds read |
CVE-2009-1532 | malformed inputs cause accesses of uninitialized or previously-deleted objects, leading to memory corruption |
CVE-2009-1528 | chain: lack of synchronization leads to memory corruption |
CVE-2009-0558 | attacker-controlled array index leads to code execution |
CVE-2009-0269 | chain: -1 value from a function call was intended to indicate an error, but is used as an array index instead. |
CVE-2009-0566 | chain: incorrect calculations lead to incorrect pointer dereference and memory corruption |
CVE-2009-1350 | product accepts crafted messages that lead to a dereference of an arbitrary pointer |
CVE-2009-0191 | chain: malformed input causes dereference of uninitialized memory |
CVE-2008-4113 | OS kernel trusts userland-supplied length value, allowing reading of sensitive information |
被害の緩和策
フェーズ:要件定義
戦略:言語選択
本脆弱性の発生しない、あるいは本脆弱性を回避しやすくするような構造を提供する言語を使用してください。バッファオーバーフローの発生しにくい Java や Perl のような、メモリ管理を独自に行う言語が例に挙げられます。
その他の Ada や C# といった言語は、一般的にオーバーフローに対する保護機能を提供しますが、プログラマにより無効にされる可能性があります。
ネイティブコード(オブジェクトコード)に対する言語のインターフェースは、言語自体が論理的に安全であったとしても、オーバーフローの危険性が残ることに注意してください。
フェーズ:アーキテクチャおよび設計
戦略: ライブラリ、フレームワーク
本脆弱性の発生を防ぐ、あるいは本脆弱性を回避しやすい構造を提供する、十分に検査されたライブラリやフレームワークを使用してください。
Messier and Viega の提供する Safe C String Library (SafeStr)、Microsoft の提供する Strsafe.h ライブラリが例に挙げられます。これらのライブラリは、オーバーフローを引き起こしやすい文字列を扱う関数の、より安全なバージョンを提供します。
ただし、多くのバッファオーバーフローは文字列に関連しないため、完全な対策ではありません。
フェーズ:ビルドおよびコンパイル
戦略: コンパイル、ビルドの強化
バッファオーバーフローを軽減あるいは排除する保護機能を自動的に提供する機能や拡張子を使用して、ソフトウェアを実行、またはコンパイルしてください。コンパイルされたコードに対し、自動的にバッファオーバーフローの検出機能を提供するようなコンパイラや拡張子が例として挙げられます。このようなコンパイラや拡張子には、Microsoft Visual Studio /GS フラグ、Fedora/Red Hat FORTIFY_SOURCE GCC フラグ、StackGuard, ProPolice 等が含まれます。
有効性:多層防御
これらの仕組みが検知可能なオーバーフローの種類は限られているため、完全な解決策ではありません。また、通常のレスポンスはアプリケーションを終了させるため、攻撃により、サービス不能 (DoS) 状態にされる可能性があります。
フェーズ:実装
プログラマは、アプリケーションのメモリを割り当てたり、管理したりする際に以下のルールを遵守して下さい。
・バッファの容量が指定したサイズと同じかダブルチェックする
・strncpy() 関数等、サイズの大きなデータをコピー出来る関数を使用する場合、文字列が NULL 終端でない可能性があるため、送り先のバッファサイズが送り元のバッファサイズと等しいか確認する
・バッファに繰り返しアクセスする場合にはバッファの上限をチェックし、割り当てられた領域を超えてデータを書き込む危険性がないことを確認する
・全ての入力された文字列を、必要に応じてコピー関数や連結関数に引き渡す前に適切な長さに調節する
フェーズ:オペレーション
戦略: 環境の強化
Address Space Layout Randomization (ASLR) 等の機能を使用して下さい。
有効性:多層防御
これは完全な解決策ではありません。しかし、全てのプログラム実行を変更する未知の値を推測するように強制させることは可能です。ただし、この機能の典型的な応答はアプリケーションの終了であるため、攻撃により DoS が引き起こされる可能性があります。
フェーズ:オペレーション
戦略: 環境の強化
Data Execution Protection (NX) またはそれと同等の機能を提供する CPU および OS を使用して下さい。
有効性:多層防御
バッファオーバフローは隣接するする変数を上書きし、ソフトウェアを危険な状態に改ざんすることを目的として使用されるため、これは完全な解決策ではありません。また、自己書き換えコードが必要な場合は使用することができません。この機能の典型的な応答はアプリケーションの終了であるため、攻撃により DoS が引き起こされる可能性があります。
フェーズ:実装
strcpy を strncpy に置き換える等、制限のないコピー関数を、長さの引数をサポートする類似した関数に置換えてください。利用可能な関数がない場合は、作成してください。
有効性:中
この緩和策は、off-by-one errors (CWE-193) や incorrectly calculating buffer lengths (CWE-131) の問題のような計算エラーの影響を受ける可能性があります。
関係性
Nature | Type | ID | Name | View(s) this relationship pertains to | Named Chain(s) this relationship pertains to |
---|---|---|---|---|---|
ChildOf | Weakness ClassWeakness ClassWeakness Class |
20 | Improper Input Validation | Development Concepts699 | |
Seven Pernicious Kingdoms (primary)700 | |||||
ChildOf | Weakness ClassWeakness ClassWeakness Class |
118 | Improper Access of Indexable Resource ('Range Error') | Development Concepts (primary)699 | |
Research Concepts (primary)1000 | |||||
ChildOf | CategoryCategory | 633 | Weaknesses that Affect Memory | Resource-specific Weaknesses (primary)631 | |
ChildOf | CategoryCategory | 726 | OWASP Top Ten 2004 Category A5 - Buffer Overflows | Weaknesses in OWASP Top Ten (2004) (primary)711 | |
ChildOf | CategoryCategory | 740 | CERT C Secure Coding Section 06 - Arrays (ARR) | Weaknesses Addressed by the CERT C Secure Coding Standard (primary)734 | |
ChildOf | CategoryCategory | 741 | CERT C Secure Coding Section 07 - Characters and Strings (STR) | Weaknesses Addressed by the CERT C Secure Coding Standard734 | |
ChildOf | CategoryCategory | 742 | CERT C Secure Coding Section 08 - Memory Management (MEM) | Weaknesses Addressed by the CERT C Secure Coding Standard734 | |
ChildOf | CategoryCategory | 743 | CERT C Secure Coding Section 09 - Input Output (FIO) | Weaknesses Addressed by the CERT C Secure Coding Standard734 | |
ChildOf | CategoryCategory | 744 | CERT C Secure Coding Section 10 - Environment (ENV) | Weaknesses Addressed by the CERT C Secure Coding Standard734 | |
ChildOf | CategoryCategory | 752 | 2009 Top 25 - Risky Resource Management | Weaknesses in the 2009 CWE/SANS Top 25 Most Dangerous Programming Errors (primary)750 | |
ParentOf | Compound Element: CompositeCompound Element: Composite | 120 | Buffer Copy without Checking Size of Input ('Classic Buffer Overflow') | Development Concepts (primary)699 | |
Research Concepts (primary)1000 | |||||
ParentOf | Weakness Base | 123 | Write-what-where Condition | Development Concepts (primary)699 | |
Research Concepts (primary)1000 | |||||
ParentOf | Weakness Base | 125 | Out-of-bounds Read | Development Concepts (primary)699 | |
Research Concepts (primary)1000 | |||||
ParentOf | Weakness Base | 130 | Improper Handling of Length Parameter Inconsistency | Development Concepts (primary)699 | |
ParentOf | Weakness Base | 466 | Return of Pointer Value Outside of Expected Range | Research Concepts (primary)1000 | |
ParentOf | Weakness Base | 786 | Access of Memory Location Before Start of Buffer | Development Concepts (primary)699 | |
Research Concepts (primary)1000 | |||||
ParentOf | Weakness Base | 787 | Out-of-bounds Write | Development Concepts (primary)699 | |
Research Concepts (primary)1000 | |||||
ParentOf | Weakness Base | 788 | Access of Memory Location After End of Buffer | Development Concepts (primary)699 | |
Research Concepts (primary)1000 | |||||
ParentOf | Weakness Base | 805 | Buffer Access with Incorrect Length Value | Development Concepts (primary)699 | |
Research Concepts (primary)1000 | |||||
ParentOf | Weakness Base | 822 | Untrusted Pointer Dereference | Development Concepts (primary)699 | |
Research Concepts (primary)1000 | |||||
ParentOf | Weakness Base | 823 | Use of Out-of-range Pointer Offset | Development Concepts (primary)699 | |
Research Concepts (primary)1000 | |||||
ParentOf | Weakness Base | 824 | Access of Uninitialized Pointer | Development Concepts (primary)699 | |
Research Concepts (primary)1000 | |||||
ParentOf | Weakness Base | 825 | Expired Pointer Dereference | Development Concepts (primary)699 | |
Research Concepts (primary)1000 | |||||
MemberOf | View | 635 | Weaknesses Used by NVD | Weaknesses Used by NVD (primary)635 | |
ParentOf | Weakness Base | 128 | Wrap-around Error | Research Concepts1000 | |
ParentOf | Weakness Base | 129 | Improper Validation of Array Index | Research Concepts1000 | |
CanFollow | Weakness Base | 131 | Incorrect Calculation of Buffer Size | Development Concepts699 | |
Research Concepts1000 | |||||
CanFollow | Weakness Base | 190 | Integer Overflow or Wraparound | Research Concepts1000 | Integer Overflow to Buffer Overflow(680) |
CanFollow | Weakness Base | 193 | Off-by-one Error | Research Concepts1000 | |
CanFollow | Weakness Variant | 195 | Signed to Unsigned Conversion Error | Research Concepts1000 |
影響を受けるシステムリソース
メモリ
他組織での分類
組織名または組織での分類 | ノード ID | CWEの分類との適合度 | 分類名 |
---|---|---|---|
OWASP Top Ten 2004 | A5 | 同等 | Buffer Overflows |
CERT C Secure Coding | ARR00-C | Understand how arrays work | |
CERT C Secure Coding | ARR33-C | Guarantee that copies are made into storage of sufficient size | |
CERT C Secure Coding | ARR34-C | Ensure that array types in expressions are compatible | |
CERT C Secure Coding | ARR35-C | Do not allow loops to iterate beyond the end of an array | |
CERT C Secure Coding | ENV01-C | Do not make assumptions about the size of an environment variable | |
CERT C Secure Coding | FIO37-C | Do not assume character data has been read | |
CERT C Secure Coding | MEM09-C | Do not assume memory allocation routines initialize memory | |
CERT C Secure Coding | STR31-C | Guarantee that storage for strings has sufficient space for character data and the null terminator | |
CERT C Secure Coding | STR32-C | Null-terminate byte strings as required | |
CERT C Secure Coding | STR33-C | Size wide character strings correctly | |
WASC | 7 | Buffer Overflow |
関連する攻撃パターン
CAPEC-ID | 攻撃パターン名 (CAPEC Version 1.5) |
---|---|
8 | Buffer Overflow in an API Call |
9 | Buffer Overflow in Local Command-Line Utilities |
10 | Buffer Overflow via Environment Variables |
14 | Client-side Injection-induced Buffer Overflow |
24 | Filter Failure through Buffer Overflow |
42 | MIME Conversion |
44 | Overflow Binary Resource File |
45 | Buffer Overflow via Symbolic Links |
100 | Overflow Buffers |
46 | Overflow Variables and Tags |
47 | Buffer Overflow via Parameter Expansion |
参照
[REF-11] M. Howard and D. LeBlanc. "Writing Secure Code". Chapter 5, "Public Enemy #1: The Buffer Overrun" Page 127; Chapter 14, "Prevent I18N Buffer Overruns" Page 441. 2nd Edition. Microsoft. 2002.
Microsoft. "Using the Strsafe.h Functions". <http://msdn.microsoft.com/en-us/library/ms647466.aspx>.
Matt Messier and John Viega. "Safe C String Library v1.0.3". <http://www.zork.org/safestr/>.
Michael Howard. "Address Space Layout Randomization in Windows Vista". <http://blogs.msdn.com/michael_howard/archive/2006/05/26/address-space-layout-randomization-in-windows-vista.aspx>.
Arjan van de Ven. "Limiting buffer overflows with ExecShield". <http://www.redhat.com/magazine/009jul05/features/execshield/>.
"PaX". <http://en.wikipedia.org/wiki/PaX>.
更新履歴
[2011年04月21日]
2010年10月12日時点のデータを元に更新
[2009年06月29日]
2009年02月02日時点の下記 URL を元に作成
http://cwe.mitre.org/data/definitions/119.html
登録日 2011/04/21
最終更新日 2023/04/04