JPCERT コーディネーションセンター

VOID. INT03-C. セキュアな整数ライブラリを使用する

このガイドラインは廃止されました。


整数に起因する脆弱性を防ぐ上での防御の第一線は、明示的にあるいは強い型付けによって、範囲チェックを行うことである。ひとつのアプローチは、信頼できない入力源から取得した整数値に制限を強制することである。(「INT04-C. 信頼できない入力源から取得した整数値は制限する」を参照。) しかし、入力時点で制限を行ったとしても、その後の演算でエラーを引き起こさないことを保証するのは困難である。

これに代わる、あるいは補助的なアプローチは、各(整数)演算を保護することである。しかし、問題になりやすい整数演算の数や、例外条件を防止するあるいは検出するのに要するチェックの数は膨大であり、このアプローチは法外に手間がかかるし、実装にコストがかかる。

この問題に対するより経済的な解決法は、ひとつ以上の入力値が信頼できない入力源の影響を受けたり、結果の値がセキュリティ上の欠陥を引き起こす可能性のあるすべての整数演算に、セキュアな整数ライブラリを使用することである。これには、整数値が以下に挙げるような手段で使用される場合を含む。

以下のコード例はセキュアな整数演算が不要な場合を示している。

void foo() {
  size_t i;

  for (i = 0; i < INT_MAX; i++) {
    /* ... */
  }
}

この例では、整数 i がタイトに制御されたループで使用されており、信頼できない入力源の操作対象ではない。したがって、セキュアな整数ライブラリを使用する価値はなく、ただ不必要なオーバーヘッドが生じるだけである。

IntegerLib

セキュアな整数ライブラリの例として、ここでは CERT/CC が開発し無償で提供している IntegerLib を取り上げる。

このライブラリの目的は、一連のユーティリティ関数をソフトウェア開発者に提供し、整数オーバーフローや整数の切り捨て、符号エラーといったよくやりがちな整数に起因する問題のないCプログラムを書くことを補助することである。

int, long, long long, size_t 型整数について、整数オーバーフローを引き起こしうるすべての整数演算(加算、減算、乗算、除算、単項否定など)をカバーする関数を提供する。以下の例は、このライブラリを使用して二つのsigned long型整数値を加算する方法について示している。

long retsl, xsl, ysl;
xsl = LONG_MAX;
ysl = 0;
retsl = addsl(xsl, ysl);

小さな整数型(charおよびshort)については、以下の例に示すように、セキュアな変換関数を使って加算結果を切り捨てる必要がある。

char retsc, xsc, ysc;
xsc = SCHAR_MAX;
ysc = 0;
retsc = si2sc(addsi(xsc, ysc));

エラー処理に関しては、セキュアな整数ライブラリは [ISO/IEC TR 24731-1:2007] が定義する実行時制約処理のメカニズムを使用している。(「ERR03-C. 境界チェックインタフェースを呼び出す際は、実行時制約ハンドラを使用する」を参照。)

ライブラリの実装には Henry S. Warren が書籍 Hacker's Delight (邦題:「ハッカーのたのしみ」)で定義した高性能アルゴリズムを使用している[Warren 2002]。

リスク評価

C言語における整数の振る舞いは比較的複雑であり、取るに足らないようなエラーを起こしやすく、これが攻撃可能な脆弱性につながる恐れがある。厳密に必要というわけではないが、セキュアな整数ライブラリを使用することで、間接的にこれらのエラーを解決することができる。

レコメンデーション

深刻度

可能性

修正コスト

優先度

レベル

INT03-C

P8

L2

Related Guidelines

CERT C++ Secure Coding Standard: INT03-CPP. Use a secure integer library

ISO/IEC TR 24731-1:2007

ISO/IEC TR 24772 "TRJ Use of Libraries"

MITRE CWE: CWE-606,"Unchecked Input for Loop Condition"

MITRE CWE: CWE-190, "Integer Overflow (Wrap or Wraparound)"

参考情報

[Seacord 2005a] Chapter 5, "Integers"
[Warren 2002] Chapter 2, "Basics"

翻訳元

これは以下のページを翻訳したものです。

VOID. INT03-C. Use a secure integer library (revision 52)

Top へ

Topへ
最新情報(RSSメーリングリストTwitter