CS.UNSAFE.SEARCH_PATH

絶対パスを解決するための検索パスの使用

アプリケーションが外部指定された検索パスを使用して (通常は search-path 変数を使用して) 重要なリソースを検索する場合、そのパスはアプリケーションの直接制御下にないリソースを指す可能性があります。これにより攻撃者は、自己所有のプログラムを実行したり、権限のないデータファイルにアクセスしたり、予期しない方法で構成を変更したりする可能性があります。あるアプリケーションが、プログラムなどの重要なリソースを見つけるために、検索パスを使用している場合、攻撃者はその検索パスを変更して、悪意のあるプログラムを指定する可能性があり、その後ターゲットとなったアプリケーションが実行されます。

CS.UNSAFE.SEARCH_PATH チェッカーは、外部プロセスを起動するルーチンに対してパラメーターとして使用できる変数に、ハードコードされた相対パスが割り当てられているコードにフラグを立てます。

脆弱性とリスク

攻撃者が、悪意のあるバイナリを指すように $PATH 変数を変更し、その環境でプログラムを実行させることができる場合、意図したものの代わりに、悪意のあるバイナリがロードされます。この悪意のあるバイナリは、プログラムの権限で実行されるため、攻撃者はシステムを完全に制御できるようになる可能性があります。信頼できない検索パスの最も一般的なバリエーションとして、次のようなものがあります。

  • UNIX や Linux をベースとするさまざまなシステムでは、PATH 環境変数を参照して実行可能プログラムを検索したり、LD_PRELOAD を使用して別のライブラリを検索する場合があります。
  • さまざまな Microsoft ベースのシステムでは、検索順序でより前に表示される他のパスで DLL、実行可能ファイル、ディレクトリなどが見つからない場合は、PATH 環境変数を参照してこれらを検索します。

この種のチャンスがある場合、攻撃者は次のことを行えます。

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

軽減と防止

お使いのアプリケーションでは、相対パスの使用をできる限り避けてください。また、生の入力をパス名として使用する前に、検証コードを追加することがベストです。承認コードには、次のようなケースのチェックが含まれている必要があります:

  • dot-dot-slash (../): このシーケンスおよびそのバリエーションを使用して、攻撃者はファイルシステムに移動して、どのファイルにもアクセスを得ることを可能にします。(../) は、さまざまなエンコーディングで表すことができることに注意してください。" ../../../etc/shadow" はその一例です。
  • 絶対パス:また、相対パスが予測される状況で絶対パスを使用すると、お使いのシステムで任意のファイルにアクセスできるようにもなります。"/etc/shadow" はその一例です。
  • ヌル記号:アプリケーションが特定の拡張子をチェックまたは追加することによって、可能なファイル拡張子を制限している場合、ヌル記号を使用すると、攻撃者は、生成されたファイル名を切り詰めて、攻撃の範囲を広げることができます。"application.cfg%00.pdf" はその一例です。

脆弱コード例

コピー
   using System.IO;
   namespace Example
   {
       System.Diagnostics.Process ExternalProcess = new System.Diagnostics.Process();
       ExternalProcess.StartInfo.FileName = "dir"; // Because the path is relative, the PATH environment variable will be used to resolve full path.
       ExternalProcess.StartInfo.Arguments = secretDirectoryPath;
       ExternalProcess.Start();
       ExternalProcess.WaitForExit();
   }

この例では、Klocwork は 8 行目で欠陥を報告します。そこでは、'FileName' プロパティにハードコードされた相対パスが含まれているプロセスを開始しようとします。この場合、潜在的に安全でないファイルを使用してプロセスを開始することになり、悪意のあるユーザーによって悪用される可能性があります。

修正コード例

コピー
   using System.IO;
    
   namespace Example
   {
       System.Diagnostics.Process ExternalProcess = new System.Diagnostics.Process();
       ExternalProcess.StartInfo.FileName = "C:\\absolute_path\\filename.dat";
       ExternalProcess.StartInfo.Arguments = secretDirectoryPath;
       ExternalProcess.Start();
       ExternalProcess.WaitForExit();
  }

修正されたコード例では、Klocwork は 8 行目で指摘を報告しません。'FileName' には絶対パスが割り当てられており、システムはパスを解決する必要がないためです。

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

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