CS.SV.TAINTED.CALL.BINOP

関数呼び出しによるバイナリ演算での未検証整数値の使用

入力データがユーザーまたは外部環境から受け入れられるときは常に、入力のタイプ、長さ、書式、および範囲を検証してから使用する必要があります。このデータが適切に検証されるまでは、そのデータは汚染していると言われます。CS.SV.TAINTED ファミリーのチェッカーは、コードでの汚染データの使用箇所を探します。

CS.SV.TAINTED.BINOP チェッカーが、加算、減算、または乗算など、関数呼び出しを使って、バイナリ演算により、汚染データを使用するコードにフラグを立てます。

脆弱性とリスク

コードへの入力された整数データが適切に検証されず、バイナリ演算のオペランドとして使用されると、結果は整数オーバーフローまたはラップアラウンドを起こす可能性があります。これが起きると、攻撃者が通常の制御フローを変更し、予期せぬプログラム行動を引き起こす可能性があります。最悪の場合攻撃者は次のことを行えます。
  • 予期しない値を提供し、プログラムクラッシュを引き起こします。
  • 過剰なリソース消費を引き起こします。
  • 機密データを読み取る
  • 悪意のある入力を使用して、データを変更したり制御フローを改めたりします。
  • 任意のコマンドを実行します。

軽減と防止

汚染入力エラーを回避するには:
  • パラメーターや引数、クッキー、ネットワークから読み取られる入力、環境変数、逆 DNS ルックアップ、クエリ結果、ファイル名、データベース、および外部システムという、信頼されていない入力がソフトウェア内に入り込む可能性がある領域すべてを把握します。
  • ブラックリスト、つまり「既知の不良な」戦略だけを信頼するのではなく、ホワイトリスト、つまり「既知の良好な」ポリシーを入力に使用します。
  • 入力の該当するプロパティがすべて検証済みであることを確認します。これには、長さ、タイプ、範囲、欠落しているか余計な入力、構文、および一貫性が含まれます。
  • アプリケーションのクライアント側でセキュリティチェックが実行される場合、サーバー側で複製されることを確認します。
  • アプリケーションで複数ソースからの入力が組み合わされる場合、ソースの組み合わせが完了したら検証を行います。

脆弱コード例

コピー
   namespace myNamespace
   {    
       class BinaryOprations
       {
           public static int Addition(int value1, int value2)
           {
               value1 = value1+ value2;
           }
   
          public static void TrySum()
          {            
           int sum = MIN_VALUE;
              int input_value = Console.Read();
              sum = Addition(sum, input_value);
          }
      }
  }

Klocwork は 14 行目で指摘レポートを生成します。これは、13 行目で「Console.Read()」の呼び出しを通じて受け取った、未検証の整数「input_value」が、14 行目で関数呼び出しを通じて、7 行目でバイナリ演算に使用され、その結果、制御されない整数オーバーフローと未定義の動作につながる可能性があることを示しています。CS.SV.TAINTED.CALL.BINOP チェッカーは、この潜在的に有害なシナリオについて警告します。

修正コード例

コピー
   namespace myNamespace
   {    
       class BinaryOprations
       {
           public static int Addition(int value1, int value2)
           {
               value1 = value1+ value2;
           }
   
          public static void TrySum()
          {            
           int sum = MIN_VALUE;
              int input_value = Console.Read();
  
           // Validate input before using it in a memory allocation 
           if (input_value > 0 && input_value <= MAX_BUFFER_SIZE)
           {
                  sum = Addition(sum, input_value);
           }
          }
      }
  }

この例では、外部制御されたデータは 16 行目で検証後にのみ使用されるため、コードは整数オーバーフロー攻撃に対して脆弱ではなくなります。

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。