知識マップ: Windowsの偽装トークンを正しく扱う ── スレッド単位の権限借用と安全な戻し方
記事「Windowsの偽装トークンを正しく扱う ── スレッド単位の権限借用と安全な戻し方」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
Windowsの偽装トークンは、プロセス全体を別ユーザーにする権限昇格ではなく、スレッド単位でアクセスチェックのセキュリティコンテキストを切り替える仕組みで、Identification・Impersonation・Delegationといった偽装レベルによって何ができるかが決まる。Win32 APIで偽装する場合は必ずRevertToSelfで戻す必要があり、.NETのRunImpersonated/RunImpersonatedAsyncは偽装トークンをExecutionContextに載せて運ぶため、偽装スコープの中からTask.Runへfire-and-forgetで処理を投げると、コード上のスコープを超えて偽装されたまま処理が動き続けるという壊れ方をする。プロセスを別ユーザーとして起動したい場合は偽装トークンではなくプライマリトークンが必要で、ネットワーク越しに利用者本人の権限を使いたいダブルホップ問題にはKerberosの委任設計が必要になる。
flowchart LR
accTitle: Windowsの偽装トークンの知識マップ
accDescr: 偽装トークンが偽装レベルを伴いRevertToSelfで安全に戻す必要があること、.NETのRunImpersonatedがExecutionContextの伝播を通じてTask.Runに投げた処理を偽装させたまま動かし続けうること、プライマリトークンやダブルホップ問題との関係を示す図
impersonation_token["偽装トークン"]
impersonation_level["偽装レベル"]
revert_to_self["RevertToSelf"]
runimpersonated_dotnet["WindowsIdentity.RunImpersonated / RunImpersonatedAsync"]
executioncontext_dotnet[".NETのExecutionContext"]
lingering_impersonation_risk["偽装スコープを超えて継続する偽装"]
logonuser_api["LogonUser"]
double_hop_problem["ダブルホップ問題"]
kerberos_delegation["Kerberosの委任"]
spn["SPN"]
domain_controller["ドメインコントローラー"]
safeaccesstokenhandle["SafeAccessTokenHandle"]
handle_leak["ハンドルリーク"]
primary_token["プライマリトークン"]
admin_rights["管理者権限"]
aspnet_core_windows_auth["ASP.NET CoreのWindows認証"]
createprocessasuser["CreateProcessAsUser"]
windows_service["Windowsサービス"]
impersonation_token -->|"前提とする"| impersonation_level
impersonation_token -.->|"前提とする"| revert_to_self
runimpersonated_dotnet -->|"利用する"| impersonation_token
runimpersonated_dotnet -->|"利用する"| executioncontext_dotnet
executioncontext_dotnet -.->|"原因になり得る"| lingering_impersonation_risk
impersonation_token -->|"利用する"| logonuser_api
impersonation_token -.->|"原因になり得る"| double_hop_problem
double_hop_problem -.->|"前提とする"| kerberos_delegation
double_hop_problem -.->|"前提とする"| spn
kerberos_delegation -->|"で構成できる"| domain_controller
revert_to_self -->|"防止する"| lingering_impersonation_risk
safeaccesstokenhandle -->|"軽減する"| handle_leak
primary_token -.->|"前提とする"| impersonation_token
impersonation_token -->|"用いるのは非推奨"| admin_rights
aspnet_core_windows_auth -.->|"前提とする"| runimpersonated_dotnet
primary_token -->|"利用する"| createprocessasuser
windows_service -->|"利用する"| primary_token
runimpersonated_dotnet -->|"前提とする"| safeaccesstokenhandle
概念間の関係(全18件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- 偽装トークンは偽装レベルを前提とします。
- 偽装トークンはRevertToSelfを前提とします。
- WindowsIdentity.RunImpersonated / RunImpersonatedAsyncは偽装トークンを利用します。
- WindowsIdentity.RunImpersonated / RunImpersonatedAsyncは.NETのExecutionContextを利用します。
- .NETのExecutionContextは偽装スコープを超えて継続する偽装の原因になることがあります。
- 偽装トークンはLogonUserを利用します。
- 偽装トークンはダブルホップ問題の原因になることがあります。
- ダブルホップ問題はKerberosの委任を前提とします。
- ダブルホップ問題はSPNを前提とします。
- Kerberosの委任はドメインコントローラーで構成できます。
- RevertToSelfは偽装スコープを超えて継続する偽装を防ぎます。
- SafeAccessTokenHandleはハンドルリークを軽減します。
- プライマリトークンは偽装トークンを前提とします。
- 偽装トークンを管理者権限に用いることは推奨されません。
- ASP.NET CoreのWindows認証はWindowsIdentity.RunImpersonated / RunImpersonatedAsyncを前提とします。
- プライマリトークンはCreateProcessAsUserを利用します。
- Windowsサービスはプライマリトークンを利用します。
- WindowsIdentity.RunImpersonated / RunImpersonatedAsyncはSafeAccessTokenHandleを前提とします。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。