CS.SV.TAINTED.DLLPRELOAD

未検証入力 - DLL のロードに信頼されないデータが使用されます

プログラムが外部入力を使用して DLL をロードする場合、DLL ロード攻撃にさらされたままになる可能性があります。DLL のロードに (信頼されない) 外部文字列が使用されている場合、このチェッカーは欠陥を報告します。

脆弱性とリスク

コードへの入力が適切に検証されないと、攻撃者は入力をアプリケーションが予期しない形で作成することができます。意図しない入力を受け取ると、制御フローの改変、任意リソースの制御、および任意のコードの実行につながる可能性があります。この種のチャンスがある場合、攻撃者は次のことを行えます。

  • 予期しない値を提供し、プログラムクラッシュを引き起こします。
  • 過剰なリソース消費を引き起こします。
  • 機密データを読み取ります。
  • 悪意のある入力を使用して、データを変更したり制御フローを改めたりします。
  • 任意のコマンドを実行します。

軽減と防止

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

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

脆弱コード例 1

コピー
   using System;
   using System.Reflection;
   
   namespace CS.SV.TAINTED.DLLPRELOAD
   {
       class Program
       {
           static void Main(string[] args)
           {
              string fullName = args[1];
              Assembly SampleAssembly2 = Assembly.ReflectionOnlyLoadFrom(fullName);
          }
      }
  }

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

脆弱コード例 2

コピー
   using System;
   using System.Reflection;
   
   namespace CS.SV.TAINTED.DLLPRELOAD
   {
       class Program
       {
           static void Main(string[] args)
           {
              string fullName = Console.ReadLine();
              Assembly SampleAssembly = Assembly.LoadFile(fullName);
          }
      }
  }

この例では、文字列はユーザーから取得されるため、悪意のある入力の影響も受けやすくなります。Klocwork は、11 行目でこの指摘を CS.SV.TAINTED.DLLPRELOAD 欠陥として報告します。

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

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