ABV.TAINTED

バッファオーバーフロー - 汚染した入力の配列インデックスが範囲外

ABV.TAINTED は、ユーザーまたは外部デバイスからの、未検証または汚染した入力データが引き起こすバッファオーバーフローをチェックします。このチェッカーは、バッファオーバーフローに関与する入力データが検証されていないコードへの実行パスにフラグを立てます。

脆弱性とリスク

バッファオーバーフローはしばしばアプリケーション攻撃と悪用の元になります。

軽減と防止

汚染した入力からのこれらの攻撃の可能性を避けるには、次のようにします。

  • オーバーフローが発生する可能性のある行の前に、必ず検証条件を挿入します。
  • 入力の長さ、入力のタイプ、許容される入力値の全範囲、入力の欠落や余剰入力、構文、関連するフィールドの整合性およびビジネスルールとの適合性を含めて、関連する入力プロパティについてすべての可能性を考慮します。
  • 誤って負値を許容しないように、範囲の最小値と最大値を必ず検証します。

脆弱コード例

コピー
  #include <stdio.h>
  void wrapped_read(char* buf, int count) {
     fgets(buf, count, stdin);
  }
  
  void TaintedAccess()
  {
     char buf1[12];
     char buf2[12];
 
    char dst[16];
 
    wrapped_read(buf1, sizeof(buf1));
    wrapped_read(buf2, sizeof(buf2));
    sprintf(dst, "%s-%s\n", buf1, buf2);
 }

Klocwork は 15 行目について、'dst' への配列インデックスとして未検証入力が使用されていることを指摘する、バッファオーバーフローレポートを生成します。配列 'dst' はサイズ 16 として定義されていますが、13 行目と 14 行目で 22 文字の入力 + 終端の null を生成する可能性があります。この場合は、入力データはバッファサイズとの関連がチェックされていません。このため汚染していると見なされます。

修正コード例

コピー
  #include <stdio.h>
  void wrapped_read(char* buf, int count) {
     fgets(buf, count, stdin);
  }
  
  void TaintedAccess()
  {
     char buf1[12];
     char buf2[12];
 
    char dst[25];
 
    wrapped_read(buf1, sizeof(buf1));
    wrapped_read(buf2, sizeof(buf2));
    sprintf(dst, "%s-%s\n", buf1, buf2);
 }

                                                

修正コード例では、'dst' のサイズは正しく 25 と定義されました。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。