Windows 11低权限令牌的宽容学习模式深度解析

本文详细介绍了Windows 11和Windows Server 2022新引入的低权限令牌宽容学习模式功能,通过具体示例演示如何利用ETW跟踪和PowerShell命令配置沙箱环境,帮助开发者诊断应用程序权限需求并防止沙箱崩溃。

LowBox Token Permissive Learning Mode

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

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

首先需要启动ETW跟踪,启用Microsoft-Windows-Kernel-General提供程序的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-...

日志事件虽未包含被打开资源的名称,但包含对象的安全描述符和类型、请求的访问掩码以及所用访问令牌的基本信息。希望这些信息对您有所帮助。

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