Windows 11低权限令牌Permissive Learning Mode技术解析

本文详细介绍了Windows 11和Windows Server 2022中新引入的LowBox令牌Permissive Learning Mode功能。该功能允许内核在执行低权限访问检查时记录错误而非直接拒绝访问,为开发人员提供沙箱诊断工具。文章包含完整的PowerShell操作示例和ETW事件跟踪实践指南。

LowBox Token Permissive Learning Mode

最近有人询问我关于这个主题的问题,因此我认为将其整理成公开博客文章能让更多人受益。Windows 11(和Windows Server 2022)为令牌引入了一项新功能,允许内核执行正常的LowBox访问检查,但在检查失败时记录错误而非直接返回访问拒绝。这项功能允许你启动一个AppContainer沙箱进程,运行任务,并确定如果实际尝试沙箱化进程时哪些部分会失败。这使得在尝试实际应用沙箱时,更容易确定需要授予哪些权限来防止应用程序崩溃。这是一个非常有用的诊断工具,尽管微软是否会正式文档化还有待观察。

让我们通过一个简单示例来了解如何使用它。

首先需要为Microsoft-Windows-Kernel-General提供程序启动ETW跟踪,并启用KERNEL_GENERAL_SECURITY_ACCESSCHECK关键字(值0x20)。在管理员PowerShell控制台中运行以下命令:

1
2
3
4
PS> $name = 'AccessTrace'
PS> New-NetEventSession -Name $name -LocalFilePath "$env:USERPROFILE\access_trace.etl" | Out-Null
PS> Add-NetEventProvider -SessionName $name -Name "Microsoft-Windows-Kernel-General" -MatchAllKeyword 0x20 | Out-Null
PS> Start-NetEventSession -Name $name

这将启动跟踪会话,并将事件记录到用户主目录的access_trace.etl文件中。由于这是ETW,你还可以进行实时跟踪或启用堆栈跟踪来找出实际失败的代码,但本示例我们将尽可能简化操作。此日志也用于我之前博客中提到的Adminless等功能。

现在需要生成一些日志事件。只需在创建lowbox令牌或进程时添加permissiveLearningMode能力。在开发沙箱化UWP应用时,你几乎可以将其添加到应用程序清单中,但这里我们假设是手动设置沙箱。

1
2
3
PS> $cap = Get-NtSid -CapabilityName 'permissiveLearningMode'
PS> $token = Get-NtToken -LowBox -PackageSid ABC -CapabilitySid $cap
PS> Invoke-NtToken $token { "Hello" | Set-Content "$env:USERPOFILE\test.txt" }

上述代码创建了具有该能力的lowbox令牌,并向用户配置文件中写入文件。正常情况下这会失败,因为用户配置文件不授予任何AppContainer写入权限。但你会发现写入操作成功了。现在回到管理员PowerShell控制台,停止跟踪并清理会话。

1
2
PS> Stop-NetEventSession -Name $name
PS> Remove-NetEventSession -Name $name

你会在用户配置目录中找到access_trace.etl文件,其中包含记录的事件。有多种读取此文件的方法,最简单的是使用Get-WinEvent命令。由于需要对日志内容进行一些解析以获取各种值,我编写了一个简单脚本来完成此任务。该脚本可在github获取。只需运行脚本并传入日志文件名即可将事件转换为PowerShell对象。

1
2
3
4
5
6
7
8
PS> parse_access_check_log.ps1 "$env:USERPROFILE\access_trace.etl"

ProcessName        : ...\v1.0\powershell.exe
Mask              : MaximumAllowed
PackageSid         : S-1-15-2-1445519891-4232675966-...
Groups            : INSIDERDEV\user
Capabilities      : NAMED CAPABILITIES\Permissive Learning Mode
SecurityDescriptor : O:BAG:BAD:(A;OICI;KA;;;S-1-5-21-623841239-...

日志事件似乎不包含被打开资源的名称,但包含对象的安全描述符和类型、请求的访问掩码以及所用访问令牌的基本信息。

希望这些信息对大家有用。

发布时间:2021年9月6日 23:53
作者:tiraniddo

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计