CS.SV.TAINTED.FMTSTR

未検証入力 - 信頼されないデータが書式文字列として使用されます。

このチェッカーは、書式文字列として使用される、外部入力制御されたデータのインスタンスを検出してフラグを立てます。カスタムの書式文字列をサポートしている .NET ライブラリは、特定のパターンに準拠することを想定しています。無効な書式文字列により、FormatException がスローされるか、プログラムの動作がさまざまな方法で改変されてしまう可能性があります。

脆弱性とリスク

コードへの入力が適切に検証されないと、攻撃者は入力をアプリケーションが予期しない形で作成することができます。意図しない入力を受け取ると、制御フローの改変、任意リソースの制御、および任意のコードの実行につながる可能性があります。この種のチャンスがある場合、攻撃者は次のことを行えます。
  • 予期しない値を提供し、プログラムクラッシュを引き起こします。
  • 過剰なリソース消費を引き起こします。
  • 機密データを読み取ります。
  • 悪意のある入力を使用して、データを変更したり制御フローを改めたりします。
  • 任意のコマンドを実行します。

軽減と防止

汚染入力エラーを回避するには

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

脆弱コード例 1

コピー
   namespace CS.SV.TAINTED.FMTSTR
   {
       class Program
       {
           static void Main(string[] args)
           {
               string fmtStr = Console.ReadLine();
               int num = 10;
               Console.WriteLine(fmtStr, num); 
          }
      }
  }

上記の例では、書式文字列はユーザー入力から読み取られるため、悪意ある入力の影響を受ける可能性があります。Klocwork は、この脆弱性を CS.SV.TAINTED.FMTSTR の欠陥として報告し、次を示します。「7 行目の 'ReadLine' の呼び出しを通じて外部関数から受け取った未検証の文字列 'fmtStr' は、9 行目の 'WriteLine' の呼び出しを通じて書式文字列として使用できます。これにより、文字列バッファー内でバッファーオーバーフローが発生し、ユーザー入力から任意コードの実行が引き起こされる可能性があります。書式文字列の操作で使用される文字列の長さと内容を確認してください。」

脆弱コード例 2

コピー
   namespace CS.SV.TAINTED.FMTSTR
   {
       class Program
       {
           static void Main(string[] args)
           {
               int res = 4;
               Console.Write(args[1], res); 
           }
      }
  }

この例では、書式文字列はコマンドライン引数から取得されるため、悪意のある入力の影響を受けやすくなります。Klocwork は、この問題を CS.SV.TAINTED.FMTSTR の欠陥として 8 行目で報告します。

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

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