使用MSFT_SCRIPTRESOURCE绕过DEVICE GUARD/CLM
字数 1496 2025-08-27 12:33:23
MSFT_SCRIPTRESOURCE绕过DEVICE GUARD/CLM技术分析
1. 背景介绍
Device Guard及其附带的开源脚本环境是Windows系统中重要的安全防护机制。当系统处于约束语言模式(Constrained Language Mode, CLM)时,Device Guard会阻止执行未经签名的代码。本文分析了一种利用Microsoft签名的PowerShell模块MSFT_ScriptResource.psm1绕过这些限制的技术。
2. 技术原理
2.1 约束语言模式(CLM)的限制
在CLM环境下:
- 阻止执行未经签名的代码
- 限制某些PowerShell功能和API调用
- 通过CVE-2017-8715修复后,已签名模块只能执行被
Export-ModuleMember导出的函数
2.2 MSFT_ScriptResource模块漏洞
MSFT_ScriptResource.psm1模块中存在两个关键函数:
-
Get-TargetResource函数:
- 接受
-GetScript参数 - 使用
[ScriptBlock]::Create()将传入代码转换为ScriptBlock - 将参数传递给
ScriptExecutionHelper函数
- 接受
-
ScriptExecutionHelper函数:
- 接收参数(包含创建的ScriptBlock)
- 使用调用运算符(
&)执行ScriptBlock
2.3 绕过机制
由于:
- 该模块由Microsoft签名,默认允许以FullLanguage模式运行
Get-TargetResource函数被Export-ModuleMember导出- 函数内部未对执行代码进行CLM限制检查
攻击者可利用此模块作为"代理"来执行任意代码,绕过CLM限制。
3. 利用步骤
3.1 准备恶意代码
$code = @"
using System;
public class Test {
public static double Sqrt() {
return Math.Sqrt(4);
}
}
"@
3.2 导入模块并执行
# 导入模块
Import-Module MSFT_ScriptResource
# 通过Get-TargetResource执行代码
Get-TargetResource -GetScript "Add-Type -TypeDefinition $code; [Test]::Sqrt()"
3.3 执行效果
- 在CLM模式下,直接执行
Add-Type会失败 - 通过MSFT_ScriptResource模块执行时,代码以FullLanguage模式运行
- 成功加载并执行未签名代码
4. 防御与检测
4.1 微软修复方案
此漏洞被分配为CVE-2018-8212,微软通过以下方式修复:
- 在模块内部添加CLM检查
- 确保通过模块执行的代码仍受CLM限制
4.2 检测方法
-
ScriptBlock日志记录:
- 启用ScriptBlock日志记录可捕获此类绕过尝试
- 日志会记录通过模块执行的代码内容
-
WDAC监控:
- Windows Defender Application Control可检测异常模块使用
- 微软已将此类型绕过添加到WDAC赏金计划
5. 技术总结
| 关键点 | 说明 |
|---|---|
| 漏洞模块 | MSFT_ScriptResource.psm1 |
| 关键函数 | Get-TargetResource |
| 利用参数 | -GetScript |
| 执行机制 | 通过ScriptBlock.Create和调用运算符 |
| 绕过效果 | CLM到FullLanguage模式提升 |
| 修复编号 | CVE-2018-8212 |
| 检测方法 | ScriptBlock日志记录 |
6. 研究意义
- 展示了签名模块可能存在的安全风险
- 证明了模块导出函数检查的不足
- 强调了深度防御的重要性
- 促进了WDAC等更严格的安全控制机制发展
此技术虽然已被修复,但其研究思路仍对理解Windows安全机制和攻击面有重要价值。