CS.SV.TAINTED.INJECTION

C# でのコマンドインジェクション

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

CS.SV.TAINTED.INJECTION チェッカーは、外部プロセスを起動するルーチンに対して、汚染された文字列をパラメーターとして使用する可能性があるコードにフラグを立てます。

脆弱性とリスク

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

軽減と防止

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

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

脆弱コード例 1

コピー
  using System;
  using System.Diagnostics;
  namespace TaintedResource
  {
    class TestTaintedInjection
    {
      public static void TaintedResourceExample1()
      {
              string taintedString1 = Console.ReadLine();
          Process.Start(taintedString1);              // CS.SV.TAINTED.INJECTION
     }
   }
 }

Klocwork は 10 行目で指摘レポートを生成し、「未検証の文字列 'taintedString1' が 9 行目で 'ReadLine' の呼び出しを通じて外部関数から渡されており、それは 10 行目で 'Start' の呼び出しを通じてコマンドラインとして実行できること。ユーザー入力を使用して、ホストシステムで任意のコマンドを実行できること。コマンドの実行に使用する際には、文字列の長さと内容を確認すること」を示します。この場合、汚染されている可能性のあるデータを使用してプロセスが開始されることになり、悪意のあるユーザーによって悪用される可能性があります。

脆弱コード例 2

コピー
  using System;
  using System.Diagnostics;
  namespace TaintedResource
  {
    class TestTaintedInjection
    {
      public static void TaintedResourceExample1()
      {
       string taintedString = Console.ReadLine();        // tainted source
      ProcessStartInfo psi = new ProcessStartInfo();
      psi.FileName = taintedString;
      Process proc = new Process();
      proc.StartInfo = psi;
      proc.Start();                                     // CS.SV.TAINTED.INJECTION
     }
   }
 }

Klocwork は 10 行目で指摘レポートを生成し、「未検証の文字列 'taintedString' が 9 行目で 'ReadLine' の呼び出しを通じて外部関数から渡されており、それは 14 行目で 'Start' の呼び出しを通じてコマンドラインとして実行できること。ユーザー入力を使用して、ホストシステムで任意のコマンドを実行できること。コマンドの実行に使用する際には、文字列の長さと内容を確認すること」を示します。この場合、汚染されている可能性のあるデータを使用してプロセスが開始されることになり、悪意のあるユーザーによって悪用される可能性があります。