Windows 11低权限令牌学习模式:诊断沙箱权限的利器

本文详细介绍了Windows 11和Windows Server 2022中新增的低权限令牌学习模式功能,通过ETW跟踪和PowerShell操作演示如何诊断AppContainer沙箱的权限需求,帮助开发者预先识别权限不足问题。

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-...

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

希望这些信息对您有用。

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