知識マップ: Windows DLL名前解決の仕組み - 検索順序とSxS

記事「Windows DLL名前解決の仕組み - 検索順序とSxS」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

この記事は、WindowsのDLL名前解決が単なるフォルダ探索順ではなく、DLL redirection・API set・SxSマニフェスト・loaded-module list・Known DLLsという前段ルールがファイルシステム探索より先に評価される仕組みであることを整理する。packaged appとunpackaged appでは検索順序の定義自体が異なり、current folderの位置はsafe DLL search modeの有効・無効で変わる。SetDllDirectoryはsafe DLL search modeを実質的に無効化するため、SetDefaultDllDirectoriesとLoadLibraryExの検索フラグ、AddDllDirectoryを組み合わせて検索空間を絞ることがDLLハイジャックの軽減につながる。フルパス指定でも依存DLLまでは自動固定されず、実際の読み込み元はProcess MonitorやListDLLsで確認する。

Windows DLL名前解決の知識マップDLL redirection・API set・SxSマニフェスト・loaded-module list・Known DLLs・package dependency graphがファイルシステム探索より前段で評価されること、packaged appとunpackaged appで検索順序の定義自体が異なること、SetDllDirectoryがsafe DLL search modeを弱める一方でSetDefaultDllDirectoriesとLoadLibraryExの検索フラグが検索空間を絞りDLLハイジャックを軽減すること、実際の読み込み元をProcess Monitor等で確認する手段の関係を示す図利用する利用する利用する利用する利用する利用するで構成できる両立しない利用する両立しない軽減する前提とする利用する用いるのは非推奨推奨される対応軽減する原因になり得る軽減する用いるのは非推奨利用するで確認できるで確認できるで確認できるDLLの検索順序DLLハイジャッキング(DLL preloading攻撃)DLLリダイレクション(.local)API setSxSマニフェストリダイレクションloaded-module listKnown DLLspackage dependency graphcurrent folderの検索safe DLL search modepackaged appunpackaged appSetDllDirectorySetDefaultDllDirectoriesAddDllDirectoryLoadLibraryExDLL検索空間の絞り込み裸の名前によるLoadLibraryフルパス指定でのDLLロード依存DLLの解決DllImportSearchPath(.NET)Process Monitor(procmon.exe)ListDLLstasklist /m

概念間の関係(全23件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

DLLの検索順序
Windowsが実行ファイルの起動時に限らず、LoadLibrary系APIによる動的な読み込み時も含めて、DLL redirectionやKnown DLLsなどの前段ルールを経てDLLを探す、決まった順序でフォルダーを辿る仕組み。
DLLハイジャッキング(DLL preloading攻撃)
フルパスなしの動的ロードと、攻撃者が支配できる検索対象ディレクトリの組み合わせによって、悪意あるDLLをアプリの権限で実行させる攻撃。
current folderの検索
unpackaged appの標準検索順序に含まれる、プロセスのカレントディレクトリを対象にした検索段。safe DLL search modeの有効・無効で順位が変わる。
packaged app
MSIXなどのパッケージとして配布・インストールされるアプリ。package dependency graphがより前段で効くなど、unpackaged appとは異なる検索順序が定義される。
SetDllDirectory
DLL検索順序を変更するWin32 APIで、safe DLL search modeを実質的に無効化する副作用を持つ。親プロセスで呼ぶと子プロセスの検索順序にも影響し得る。
SetDefaultDllDirectories
標準のDLL検索パスから脆弱になりやすいディレクトリを外し、プロセス既定の検索対象を限定するWin32 API。プロセス単位で効き、標準形へ戻すことはできない。
AddDllDirectory
DLLの検索対象ディレクトリを1つ追加するWin32 API。LOAD_LIBRARY_SEARCH_USER_DIRSと組み合わせて使い、複数追加時の探索順は未規定。
LoadLibraryEx
LOAD_WITH_ALTERED_SEARCH_PATHやLOAD_LIBRARY_SEARCH_*フラグでDLLの検索挙動を明示的に変更できるDLLロード用Win32 API。
DLL検索空間の絞り込み
SetDefaultDllDirectoriesやLoadLibraryExのLOAD_LIBRARY_SEARCH_*フラグ、AddDllDirectoryを組み合わせて、DLLの検索対象を明示的に絞り込む設計方針。
裸の名前によるLoadLibrary
フルパスを指定せずモジュール名だけでLoadLibraryを呼び出す実装。攻撃者が支配できる検索対象ディレクトリと組み合わさるとDLLハイジャックにつながる。
フルパス指定でのDLLロード
LoadLibrary系APIにモジュール名だけでなく完全なパスを渡してDLLをロードする方式。裸の名前によるロードに起因するDLLハイジャックを軽減する。
DllImportSearchPath(.NET)
.NETのP/InvokeやNativeLibrary.Loadで、DLLの検索先を限定する属性・パラメーター。値はLOAD_LIBRARY_SEARCH_*フラグに対応する。
loaded-module list
同じモジュール名のDLLが既にそのプロセスのメモリにロードされていないかを、ファイルシステム検索より前に確認する仕組み。どのフォルダから読まれたかに関係なく、読み込み済みならそれが使われる。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。