CS.UNSAFE.DLLPRELOAD

DLL プリロードのハイジャックベクターの可能性

アプリケーションが外部ライブラリをロードする場合、コードが完全修飾パスを使用できることが重要です。不完全修飾パスが指定されると、悪意のある攻撃者が検索パスを制御し、リモートで実行する任意コードにそれをベクターとして使用しかねません。このタイプの脅威は、バイナリプラントまたは DLL プリロード攻撃として知られています。

CS.UNSAFE.DLLPRELOAD チェッカーは、DllImport 属性で絶対パス名が使用されていないコードインスタンスにフラグを立てます。

脆弱性とリスク

攻撃者は、関連のあるパスを使用して、セキュリティメカニズムをバイパスして、重大なファイルの読み取り、変更、上書きを行うことができます。完全修飾パスを使用できないと、アプリケーションは、意図している以外の DLL をロードすることが可能となります。搾取者は、この脆弱性を利用して、ユーザー権を取得し、より高い特権を獲得し、システムの制御まですることができます。

軽減と防止

関連パスの問題を回避するには、次の操作を実行します。
  • できる限り完全修飾パス名を使用し、外部ライブラリが安全にロードされるようにします。
  • ライブラリファイル、インクルードファイル、ユーティリティファイルをアクセスされにくい別のディレクトリに保存します。
  • エラーメッセージがパス情報を開示しないようにします。

脆弱コード例

コピー
   using System;
   using System.Text;
   using System.Runtime.InteropServices;
   
   namespace CS.UNSAFE.PRELOAD
   {
       class Program
       {
           [DllImport("CoreDLL.dll")];
          public static extern void SimulateGameDLL(int a, int b);
      }
  }

この例では、DllImport パスが絶対パスではないため、悪意のある入力の影響を受けやすくなります。Klocwork は、10 行目でこの指摘を CS.UNSAFE.DLLPRELOAD 欠陥として報告します。

修正コード例

コピー
   using System;
   using System.Text;
   using System.Runtime.InteropServices;
   
   namespace CS.UNSAFE.PRELOAD
   {
       class Program
       {
           [DllImport("C:\\space\\user32.dll", CharSet = CharSet.Unicode)]
          public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
      }
  }

この修正コード例では、DllImport で完全修飾パスが与えられており、悪意のあるアクセスの可能性が排除されます。

関連チェッカー

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

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