使用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模块中存在两个关键函数:

  1. Get-TargetResource函数

    • 接受-GetScript参数
    • 使用[ScriptBlock]::Create()将传入代码转换为ScriptBlock
    • 将参数传递给ScriptExecutionHelper函数
  2. ScriptExecutionHelper函数

    • 接收参数(包含创建的ScriptBlock)
    • 使用调用运算符(&)执行ScriptBlock

2.3 绕过机制

由于:

  1. 该模块由Microsoft签名,默认允许以FullLanguage模式运行
  2. Get-TargetResource函数被Export-ModuleMember导出
  3. 函数内部未对执行代码进行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 执行效果

  1. 在CLM模式下,直接执行Add-Type会失败
  2. 通过MSFT_ScriptResource模块执行时,代码以FullLanguage模式运行
  3. 成功加载并执行未签名代码

4. 防御与检测

4.1 微软修复方案

此漏洞被分配为CVE-2018-8212,微软通过以下方式修复:

  • 在模块内部添加CLM检查
  • 确保通过模块执行的代码仍受CLM限制

4.2 检测方法

  1. ScriptBlock日志记录

    • 启用ScriptBlock日志记录可捕获此类绕过尝试
    • 日志会记录通过模块执行的代码内容
  2. WDAC监控

    • Windows Defender Application Control可检测异常模块使用
    • 微软已将此类型绕过添加到WDAC赏金计划

5. 技术总结

关键点 说明
漏洞模块 MSFT_ScriptResource.psm1
关键函数 Get-TargetResource
利用参数 -GetScript
执行机制 通过ScriptBlock.Create和调用运算符
绕过效果 CLM到FullLanguage模式提升
修复编号 CVE-2018-8212
检测方法 ScriptBlock日志记录

6. 研究意义

  1. 展示了签名模块可能存在的安全风险
  2. 证明了模块导出函数检查的不足
  3. 强调了深度防御的重要性
  4. 促进了WDAC等更严格的安全控制机制发展

此技术虽然已被修复,但其研究思路仍对理解Windows安全机制和攻击面有重要价值。

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 准备恶意代码 3.2 导入模块并执行 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安全机制和攻击面有重要价值。