【活用ガイド】

CWE-362

Weakness ID:362(Weakness Class)

Status: Draft

競合状態

解説

解説要約

コードは二つの操作間で、特定の状態が変更されないよう要求していますが、予期せぬ主体やプロセスにより、変更が可能なタイミングウィンドウが存在します。

詳細な解説

本脆弱性は、予期された同期処理がセキュリティ上重大なコード (例:ユーザが認証されているか否かを記録するもの、部外者の影響を受けてはならない重要な状態情報を変更するもの等) 内に存在する場合、セキュリティ上の影響を与える可能性があります。

脆弱性の発生時期

アーキテクチャおよび設計
実装

該当するプラットフォーム

アーキテクチャの実例

共有リソース上で、同時に発生するシステム操作

一般的な影響

 

影響を受ける範囲 影響
可用性 技術的インパクト:DoS(CPU のリソース消費)、DoS(メモリのリソース消費)、DoS(その他のリソース消費)
競合状態により、リソースのクリーンアップルーチンの回避、または複数の初期化ルーチンを引き起こすことが可能な場合、 resource exhaustion (CWE-400) を招く恐れがあります。
可用性 技術的インパクト: DoS: crash / exit / restart、DoS(不安定)
競合状態により、複数の制御フローが同時に一つのリソースにアクセスすることが可能な場合、プログラムが予期しない状態に陥り、クラッシュする可能性があります。
機密性
完全性
技術的インパクト:ファイルやディレクトリの読み取り
競合状態が、推測可能なリソース名や不十分なアクセス制御と結びついた際、攻撃者により、機密データへアクセスまたは上書きされる可能性があります。(CWE-59)

 

攻撃を受ける可能性

検出手段

ブラックボックス
ブラックボックス手法は、複数の同時接続によりソフトウェアを不安定にする、あるいはクラッシュさせる手法を使用して、競合状態の兆候を特定することが可能です。しかし、極端に時間の受付幅が狭い競合状態は検出が困難です。

ホワイトボックス
一般的な競合状態は、Time-of-check Time-of-use (TOCTOU) Race Condition (CWE-367) や、Double-Checked Locking (CWE-609) のような、ホワイトボックスによる分析で検出可能です。

自動動的分析
本脆弱性は、ファズテスト(ファジング)、ロバストネステスト(頑健性のテスト)や、フォールトインジェクション(エラーをわざと起こすテスト)等、多種多様な入力を持つ膨大なテストケースを使用してソフトウェアを分析する、動的なツールや技術を用いて検出することが可能です。
ソフトウェアの処理速度は低下しますが、処理が不安定になったり、クラッシュする、不正確な結果を出すということはありません。
競合状態は、膨大な数のスレッドやプロセスから同時にソフトウェアを呼び出し、予期しないふるまいの兆候を探す、ストレステストにより検出可能です。 競合する時間を人工的に長引かせ、関連するコード文の間にブレイクポイントの挿入や遅延を発生させることにより、本脆弱性を検出しやすくします。

有効性:中

脆弱なコード例

例 1:

 

以下の例は、銀行口座間の送金処理をサポートする電子商取引アプリケーションのコードです。合計送金額を取得して新しい口座へ送金し、送金元の口座から、その金額を差し引くものです。

Example Language: Perl (Bad Code)
$transfer_amount = GetTransferAmount();
$balance = GetBalanceFromDatabase();


if ($transfer_amount < 0) {
FatalError("Bad Transfer Amount");
}
$newbalance = $balance - $transfer_amount;
if (($balance - $transfer_amount) < 0) {
FatalError("Insufficient Funds");
}
SendNewBalanceToDatabase($newbalance);
NotifyUser("Transfer of $transfer_amount succeeded.");
NotifyUser("New balance: $newbalance");
この例では、GetBalanceFromDatabase() と SendNewBalanceToDatabase() の呼び出し間で競合状態が発生する可能性があります。例えばWeb アプリケーション内で複数のリクエストを作成するなどの手段で、同一のユーザがこのプログラムを複数回、同時に呼び出した場合、以下の様な攻撃が可能です。

差し引き残高を初期値 100.00 と仮定します。
攻撃者はこのプログラムを同時に呼び出すため、同一のユーザアカウントで「CALLER-1」および「CALLER-2」を作成します。
CALLER-1(攻撃者)は PROGRAM-1( CALLER-1 を操作するインスタンス)と結びついており、CALLER-2 は PROGRAM-2 と結びついています。

CALLER-1 が 80.00 を送金するリクエストを作成します。 PROGRAM-1 が GetBalanceFromDatabase を呼び出すと、$balance の値が 100.00に設定されます。 PROGRAM-1 は $newbalance を 20.00 と計算し、SendNewBalanceToDatabase() を呼び出しますが、サーバに大きな負荷がかかり呼び出しに遅れが生じます。
CALLER-2 は、1.00 を送金するリクエストを作成します。
PROGRAM-2 が GetBalanceFromDatabase() 関数を呼び出しますが、PROGRAM-1 のリクエストの処理が、$balance の値は 100.00 となります。
PROGRAM-2 は $newbalance を 99.00 と計算します。

処理が遅れていた PROGRAM-1 は $balance をデータベースに送信し 20.00 に変更します。

PROGRAM-2 はデータベースを更新するために、差し引き残高を 99.00 に設定したリクエストを送信します。

本来であれば、PROGRAM-1 と PROGRAM-2 で合計処理 81.00 を送金したため、攻撃者の差し引き残高 は 19.00 となります。しかし、競合状態により、データベース上の差し引き残高は 99.00 と記録されます。

本脆弱性の防止策としては、Web アプリケーションに対する複数の同時リクエストを遮断するロックの使用、GetBalanceFromDatabase() 関数と SendNewBalanceToDatabase() 関数の間の全てのコードを含む同期メカニズムの使用などが挙げられます。

 

例 2:

 

以下の関数は、共有リソース上で操作を実行するために、ロックをかけようとするものです。

サンプル言語: C (悪い例)
void f(pthread_mutex_t *mutex) {
pthread_mutex_lock(mutex);

/* access shared resource */

pthread_mutex_unlock(mutex);
}

このコードは、pthread_mutex_lock()の返り値の確認を行っておらず、エラーを検出できません。pthread_mutex_lock() がミューテックスの取得に失敗した場合、プログラムは競合状態に陥り、予期しないふるまいをします。

データの競合を適切に回避するためには、回復あるいは上位層へのレポートが必要です。いずれの対処を行う場合でも、プログラムはスレッド同期関数の結果を確認し、適切に全てのエラーを処理するべきです。

(良い例)
int f(pthread_mutex_t *mutex) {
int result;

result = pthread_mutex_lock(mutex);
if (0 != result)
return result;

/* access shared resource */

return pthread_mutex_unlock(mutex);
}
…

 

発見された事例

 

参照 詳細
CVE-2008-5044 Race condition leading to a crash by calling a hook removal procedure while other activities are occurring at the same time.
CVE-2008-2958 chain: time-of-check time-of-use (TOCTOU) race condition in program allows bypass of protection mechanism that was designed to prevent symlink attacks.
CVE-2008-1570 chain: time-of-check time-of-use (TOCTOU) race condition in program allows bypass of protection mechanism that was designed to prevent symlink attacks.
CVE-2008-0058 Unsynchronized caching operation enables a race condition that causes messages to be sent to a deallocated object.
CVE-2008-0379 Race condition during initialization triggers a buffer overflow.
CVE-2007-6599 Daemon crash by quickly performing operations and undoing them, which eventually leads to an operation that does not acquire a lock.
CVE-2007-6180 chain: race condition triggers NULL pointer dereference
CVE-2007-5794 Race condition in library function could cause data to be sent to the wrong process.
CVE-2007-3970 Race condition in file parser leads to heap corruption.
CVE-2008-5021 chain: race condition allows attacker to access an object while it is still being initialized, causing software to access uninitialized memory.
CVE-2009-4895 chain: race condition for an argument value, possibly resulting in NULL dereference
CVE-2009-3547 chain: race condition might allow resource to be released before operating on it, leading to NULL dereferenc

 

被害の緩和策

フェーズ:アーキテクチャおよび設計

言語によりサポートされている場合は、同期基本命令(synchronization primitive)を使用して下さい。パフォーマンスへの影響を最小限とするため、重要なコードのみに適用して下さい。

フェーズ:アーキテクチャおよび設計

Spring フレームワークの data access abstraction など、スレッドセーフな機能を使用して下さい。

フェーズ:アーキテクチャおよび設計

制御フローの複雑性を可能な限り取り除き、予期しない状態に陥る可能性を低減させるために、共有リソースの使用を最小にしてください。
加えて、この手段は、同期を必要とする箇所を最小化し、攻撃者が繰り返しクリティカルセクションを実行することにより発生する DoS の可能性を低減しやすくします。

フェーズ:実装

マルチスレッドを使用する場合や、共有変数の操作では、スレッドセーフな関数のみを使用して下さい。

フェーズ:実装

共有変数はアトミック操作を行って下さい。 x++ の様なコンストラクタも、値の読み込みとその後の書き込みが別々の命令で行われ、アトミックではないので注意が必要です。

フェーズ:実装

可能であればミューテックスを使用して下さい。その際は、CWE-412 等のミューテックスの使用に関連する脆弱性を避けて下さい。

フェーズ:実装

同期によるオーバヘッドの回避で発生する double-checked locking (CWE-609) およびその他の実装エラーを回避して下さい。

フェーズ:実装

コードの重要な部分での割り込み、またはシグナルを無効化して下さい。ただし、コードが大きなループまたは無限ループにならないことも確認して下さい。

フェーズ:実装

コンパイラによる予期しない最適化または再整理を回避するため、重要な変数については揮発性の修飾子を使用して下さい。この方法は、同期問題を必ずしも解決するわけではありませんが、有効な対策です。

フェーズ:アーキテクチャおよび設計、オペレーション

戦略: 環境の強化
必要なタスクを実行するために求められる最小限の権限を使用してコードを実行してください。可能であれば、一つのタスクのみに使用される、権限を限定した単独のアカウントを作成してください。それにより、攻撃が成功した場合でも、即座に他のソフトウェアやその環境へアクセスされることは防ぐことができます。例えば、特に日常的なオペレーションにおいて、めったにデータベースの管理者権限を必要としないデータベースアプリケーションが挙げられます。

関係性

 

Nature Type ID Name View(s) this relationship pertains to
ChildOf Category 361 Time and State Development Concepts (primary)699
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 751 2009 Top 25 - Insecure Interaction Between Components Weaknesses in the 2009 CWE/SANS Top 25 Most Dangerous Programming Errors (primary)750
ChildOf Category 801 2010 Top 25 - Insecure Interaction Between Components Weaknesses in the 2010 CWE/SANS Top 25 Most Dangerous Programming Errors(primary)800
ChildOf Weakness Base 821 Incorrect Synchronization Research Concepts (primary)1000
RequiredBy Compound Element: Composite 61 UNIX Symbolic Link (Symlink) Following Research Concepts1000
RequiredBy Compound Element: Composite 689 Permission Race Condition During Resource Copy Research Concepts1000
ParentOf Weakness Base 364 Signal Handler Race Condition Development Concepts (primary)699
Research Concepts (primary)1000
ParentOf Weakness Base 366 Race Condition within a Thread Development Concepts (primary)699
Research Concepts (primary)1000
ParentOf Weakness Base 367 Time-of-check Time-of-use (TOCTOU) Race Condition Development Concepts (primary)699
Research Concepts (primary)1000
ParentOf Weakness Base 368 Context Switching Race Condition Development Concepts (primary)699
Research Concepts (primary)1000
ParentOf Weakness Base 421 Race Condition During Access to Alternate Channel Development Concepts699
Research Concepts1000
ParentOf Weakness Base 421 Race Condition During Access to Alternate Channel Development Concepts699
MemberOf View 635 Weaknesses Used by NVD Weaknesses Used by NVD (primary)635
CanFollow Weakness Base 609 Double-Checked Locking Development Concepts699
Research Concepts1000
CanFollow Weakness Base 662 Improper Synchronization Development Concepts699
Research Concepts1000
CanAlsoBe Category 557 Research Concepts1000 Research Concepts1000

 

要調査事項 (CWE の見解)

Web アプリケーションにおける競合状態については研究中であり、未報告です。2008年には、この領域への大きな関心が寄せられました。
競合状態の研究の多くは、Time-of-check Time-of-use (TOCTOU) variants (CWE-367) に焦点を当てていますが、チェックの時間を必要としない競合状態も多く存在します。

他組織での分類

 

組織名または組織での分類 ノード ID CWEの分類との適合度 分類名
PLOVER Race Conditions
CERT C Secure Coding FIO31-C Do not simultaneously open the same file multiple times

 

関連する攻撃パターン

 

CAPEC-ID 攻撃パターン名 (CAPEC Version 1.5)
26 Leveraging Race Conditions
29 Leveraging Time-of-Check and Time-of-Use (TOCTOU) Race Conditions

 

参照

[REF-17] Michael Howard, David LeBlanc and John Viega. "24 Deadly Sins of Software Security". "Sin 13: Race Conditions." Page 205. McGraw-Hill. 2010. 
Andrei Alexandrescu. "volatile - Multithreaded Programmer's Best Friend". Dr. Dobb's. 2008-02-01. <http://www.ddj.com/cpp/184403766>.
Steven Devijver. "Thread-safe webapps using Spring". <http://www.javalobby.org/articles/thread-safe/index.jsp>.
David Wheeler. "Prevent race conditions". 2007-10-04. <http://www.ibm.com/developerworks/library/l-sprace.html>.
Matt Bishop. "Race Conditions, Files, and Security Flaws; or the Tortoise and the Hare Redux". September 1995. <http://www.cs.ucdavis.edu/research/tech-reports/1995/CSE-95-9.pdf>.
David Wheeler. "Secure Programming for Linux and Unix HOWTO". 2003-03-03. <http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/avoid-race.html>.
Blake Watts. "Discovering and Exploiting Named Pipe Security Flaws for Fun and Profit". April 2002. <http://www.blakewatts.com/namedpipepaper.html>.
Roberto Paleari, Davide Marrone, Danilo Bruschi and Mattia Monga. "On Race Vulnerabilities in Web Applications". <http://security.dico.unimi.it/~roberto/pubs/dimva08-web.pdf>.
"Avoiding Race Conditions and Insecure File Operations". Apple Developer Connection. <http://developer.apple.com/documentation/Security/Conceptual/SecureCodingGuide/Articles/RaceConditions.html>.
Johannes Ullrich. "Top 25 Series - Rank 25 - Race Conditions". SANS Software Security Institute. 2010-03-26. <http://blogs.sans.org/appsecstreetfighter/2010/03/26/top-25-series-rank-25-race-conditions/>.

保守補足

競合状態と、同期化の問題 (CWE-662) との関係性については、詳細が明らかになっていません。同期は競合状態を避ける技術の一つに過ぎず、競合状態を防ぐ以外の目的にも使用されています。

更新履歴

[2011年04月21日]
  2010年10月12日時点のデータを元に更新
[2009年06月29日]
  2009年02月02日時点の下記 URL を元に作成
    http://cwe.mitre.org/data/definitions/362.html


登録日 2011/04/21

最終更新日 2011/04/21