【活用ガイド】

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 &lt; */
}
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