知識マップ: 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で確認する。
flowchart LR
accTitle: Windows DLL名前解決の知識マップ
accDescr: 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_search_order["DLLの検索順序"]
dll_hijacking["DLLハイジャッキング(DLL preloading攻撃)"]
dll_redirection["DLLリダイレクション(.local)"]
api_set["API set"]
sxs_manifest_redirection["SxSマニフェストリダイレクション"]
loaded_module_list["loaded-module list"]
known_dlls["Known DLLs"]
package_dependency_graph["package dependency graph"]
current_folder_search["current folderの検索"]
safe_dll_search_mode["safe DLL search mode"]
packaged_app["packaged app"]
unpackaged_app["unpackaged app"]
setdlldirectory["SetDllDirectory"]
setdefaultdlldirectories["SetDefaultDllDirectories"]
adddlldirectory["AddDllDirectory"]
loadlibraryex["LoadLibraryEx"]
dll_search_path_hardening["DLL検索空間の絞り込み"]
bare_name_loadlibrary["裸の名前によるLoadLibrary"]
fullpath_load["フルパス指定でのDLLロード"]
dependent_dll_resolution["依存DLLの解決"]
dllimportsearchpath["DllImportSearchPath(.NET)"]
procmon["Process Monitor(procmon.exe)"]
listdlls_tool["ListDLLs"]
tasklist_command["tasklist /m"]
dll_search_order -->|"利用する"| dll_redirection
dll_search_order -->|"利用する"| api_set
dll_search_order -->|"利用する"| sxs_manifest_redirection
dll_search_order -->|"利用する"| loaded_module_list
dll_search_order -->|"利用する"| known_dlls
dll_search_order -.->|"利用する"| package_dependency_graph
current_folder_search -->|"で構成できる"| safe_dll_search_mode
packaged_app -->|"両立しない"| unpackaged_app
packaged_app -->|"利用する"| package_dependency_graph
setdlldirectory -->|"両立しない"| safe_dll_search_mode
setdefaultdlldirectories -->|"軽減する"| dll_hijacking
adddlldirectory -.->|"前提とする"| setdefaultdlldirectories
loadlibraryex -->|"利用する"| adddlldirectory
setdlldirectory -->|"用いるのは非推奨"| dll_search_path_hardening
loadlibraryex -->|"推奨される対応"| dll_search_path_hardening
dll_search_path_hardening -->|"軽減する"| dll_hijacking
bare_name_loadlibrary -->|"原因になり得る"| dll_hijacking
fullpath_load -.->|"軽減する"| dll_hijacking
fullpath_load -->|"用いるのは非推奨"| dependent_dll_resolution
dllimportsearchpath -->|"利用する"| loadlibraryex
dll_search_order -->|"で確認できる"| procmon
loaded_module_list -->|"で確認できる"| listdlls_tool
loaded_module_list -->|"で確認できる"| tasklist_command
概念間の関係(全23件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- DLLの検索順序はDLLリダイレクション(.local)を利用します。
- DLLの検索順序はAPI setを利用します。
- DLLの検索順序はSxSマニフェストリダイレクションを利用します。
- DLLの検索順序はloaded-module listを利用します。
- DLLの検索順序はKnown DLLsを利用します。
- DLLの検索順序はpackage dependency graphを利用します。
- current folderの検索はsafe DLL search modeで構成できます。
- packaged appはunpackaged appと両立しません。
- packaged appはpackage dependency graphを利用します。
- SetDllDirectoryはsafe DLL search modeと両立しません。
- SetDefaultDllDirectoriesはDLLハイジャッキング(DLL preloading攻撃)を軽減します。
- AddDllDirectoryはSetDefaultDllDirectoriesを前提とします。
- LoadLibraryExはAddDllDirectoryを利用します。
- SetDllDirectoryをDLL検索空間の絞り込みに用いることは推奨されません。
- LoadLibraryExはDLL検索空間の絞り込みに対する本記事の推奨です。
- DLL検索空間の絞り込みはDLLハイジャッキング(DLL preloading攻撃)を軽減します。
- 裸の名前によるLoadLibraryはDLLハイジャッキング(DLL preloading攻撃)の原因になることがあります。
- フルパス指定でのDLLロードはDLLハイジャッキング(DLL preloading攻撃)を軽減します。
- フルパス指定でのDLLロードを依存DLLの解決に用いることは推奨されません。
- DllImportSearchPath(.NET)はLoadLibraryExを利用します。
- DLLの検索順序はProcess Monitor(procmon.exe)で確認できます。
- loaded-module listはListDLLsで確認できます。
- loaded-module listはtasklist /mで確認できます。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。