SV.DLLPRELOAD.NONABSOLUTE.EXE

DLL プリロードのプロセスインジェクションベクターの可能性

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

DLLPRELOAD.NONABSOLUTE.EXE チェッカーは、関連したパス名が .exe ファイルへのシステムファイル操作関数呼び出し CreateProcess、WinExec、LoadModule、_exec*、_wexec*、_spawn*、_wspawn*、ShellExecute で使用されるコードのインスタンスにフラグを立てます。

脆弱性とリスク

攻撃者は、関連のあるパス名を使用して、セキュリティメカニズムをバイパスして、重大なファイルの読み取り、変更、上書きを行うことができます。たとえば、悪意のあるユーザーは、認証を回避したり、パスワードファイルを読み取ってシステムのアカウントに侵入したりするため、パスワードファイルの終わりに新しいアカウントを追加できます。最悪の場合は、ユーザーがシステムからロックアウトされたり、ソフトウェアが動作を妨害されたり、権限のないコマンドやコードが実行されたりします。

完全修飾パスを使用しないと、アプリケーションは、意図しているもの以外の実行可能ファイルをロードすることが可能となってしまいます。搾取者は、この脆弱性を利用して、悪意のある実行可能コードを挿入し、それをユーザーのマシンで実行します。

軽減と防止

関連パスの問題を回避するには、次の操作を実行します。

  • できる限り完全修飾パス名を使用して、外部ライブラリが安全にロードされていることを確認します
  • realpath() または canonicalize_file_name() などの、組み込みパス正規化関数をコードに含めます
  • ライブラリ、インクルード、ユーティリティファイルをアクセスされにくい別のディレクトリに保存します
  • エラーメッセージがパス情報を開示しないことを確認します

DLL プリロード攻撃の軽減および防御に関する提案については、マイクロソフトの記事、ダイナミックリンクライブラリのセキュリティを参照してください。

脆弱コード例

コピー
  BOOL createChild() {
      return CreateProcess("child.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); 
  }

Klocwork は 2 行目で、完全修飾パスなしで CreateProcess を呼び出すと、アプリケーションは任意の場所から .exe ファイルをロードできることを示す指摘レポートを生成します。関連するパス名またはパス名を使用するファイル操作関数への呼び出しにより、予測できず危険を伴う応答が生成されます。親ディレクトリのショートカット (..) およびファイル名の区切り文字 (/) のようなパスの特殊要素により、パスを、リモートで実行する任意のコードのベクターにすることができます。

修正コード例

コピー
  BOOL createChild() {
      return CreateProcess("C:\\MyApp\\child.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);  
  }

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