SV.DLLPRELOAD.NONABSOLUTE.DLL
DLL プリロードのハイジャックベクターの可能性
アプリケーションが外部ライブラリをロードする場合、コードが完全修飾パスを使用できることが重要です。不完全修飾パスが指定されると、悪意のある攻撃者が検索パスを制御し、リモートで実行する任意コードにそれをベクターとして使用しかねません。このタイプの脅威は、バイナリプラントまたは DLL プリロード攻撃として知られています。
DLLPRELOAD.NONABSOLUTE.DLL チェッカーは、.dll ファイルへのシステムファイル操作関数呼び出し LoadLibrary および LoadLibraryEx に、パス名が失われたか、または null のパス名があるコードのインスタンスにフラグを立てます。
脆弱性とリスク
攻撃者は、関連のあるパス名を使用して、セキュリティメカニズムをバイパスして、重大なファイルの読み取り、変更、上書きを行うことができます。完全修飾パスを使用できないと、アプリケーションは、意図している以外の DLL をロードすることが可能となります。搾取者は、この脆弱性を利用して、ユーザー権を取得し、より高い特権を獲得し、システムの制御まですることができます。
軽減と防止
関連パスの問題を回避するには、次の操作を実行します。
- できる限り完全修飾パス名を使用し、外部ライブラリが安全にロードされるようにします。
- realpath() または canonicalize_file_name() などの、組み込みパス正規化関数をコードに含めます
- ライブラリ、インクルード、ユーティリティファイルをアクセスされにくい別のディレクトリに保存します
- エラーメッセージがパス情報を開示しないことを確認します
DLL プリロード攻撃の軽減および防御に関する提案については、マイクロソフトの記事、ダイナミックリンクライブラリのセキュリティを参照してください。
脆弱コード例
HINSTANCE myLoadLibraryX() {
return LoadLibrary("X.dll");
}
Klocwork は 2 行目で、完全修飾パスなしで LoadLibrary を呼び出すと、アプリケーションは任意の場所から DLL をロードできることを示す指摘レポートを生成します。関連するパス名または null パス名を使用するファイル操作関数への呼び出しにより、予測できず危険を伴う応答が生成されます。
修正コード例
HINSTANCE myLoadLibraryX() {
return LoadLibrary("C:\\myapp\\X.dll");
}
修正されたコード例では、完全修飾パスが与えられ、悪意のあるアクセスの可能性を排除します。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。