本文翻译自:https://enigma0x3.net/2018/10/10/cve-2018-8212-device-guard-clm-bypass-using-msft_scriptresource/
Device Guard及其附带的开源脚本环境是破坏攻击过程的致命组合。在脚本语言(如PowerShell和Windows Scripting Host)处于锁定状态时,Device Guard将阻止执行未经签名的代码。如果要在这种环境中运行这些代码,研究旁路可能会派上用场。此外,利用有签名或被允许的脚本或程序来执行未被签名代码可能会带来绕过的优势。
在Device Guard环境中寻找绕过约束语言模式(CLM)的方法时,通过研究Microsoft签名的PowerShell模块来执行任意未签名代码的调用始,这始终是一项富有成效的尝试,因为大多数Microsoft PowerShell模块都将被签名(按政策批准即隐式)。为了防止滥用已被签名的PowerShell模块来绕过CLM,Microsoft添加了一项检查,以保证一个模块只能在CLM中被加载时才能执行导出的函数(CVE-2017-8715)。这意味着,虽然可以根据策略对脚本进行签名并且允许其执行,但该脚本只能执行被Export-ModuleMember导出的函数。这显著减少了已签名PowerShell模块的攻击面,因为非导出函数将受CLM约束,与未签名代码相同。
虽然这个添加项减少了攻击面,但并不意味它完全消除了隐患。在分析Microsoft签名的PowerShell模块文件,以查找允许执行未签名代码的函数时,会出现DSC模块中的“MSFT_ScriptResource.psm1”。此模块由Microsoft签名,并具有一个名为“Get-TargetResource”的函数,该函数有一个“GetScript”参数:
观察此函数,其利用[ScriptBlock] :: Create()命令,将-GetScript传递的代码添加到新的scriptblock中。执行此操作后,它将psboundparameters参数传递给“ScriptExecutionHelper”函数。
如果我们仔细观察“ScriptExecutionHelper”函数,它所做的就是获取psboundparameters参数(包括我们新创建的ScriptBlock)并调用运算符(&)来执行它:
由于上述内容都发生在Microsoft签名模块中,因此允许该模块以FullLanguage模式运行(即不对其施加任何限制)。若要滥用此功能,我们需要做的只是利用-GetScript参数将我们的恶意PowerShell代码传递给Get-TargetResource函数。但是,CVE-2017-8715 的Export-ModuleMember命令是否已禁止滥用此功能了呢?查看“MSFT_ScriptResource.psm1”中的导出函数,实际为我们导出的是可滥用函数“Get-TargetResource”:
太棒了!为了测试这一点,我们可以添加一些任意C#代码(简单地如:4的平方根)到名为$code的PowerShell变量中:
执行此操作后,我们只需要导入“MSFT_ScriptResource”PowerShell模块,并使用“Add-Type -TypeDefinition $ code”作为-GetScript参数来调用“Get-TargetResource”函数。执行此操作时,Microsoft签名的PowerShell模块将以FullLanguage模式加载(因为它是通过Device Guard签名和允许的),并且传递给Get-TargetResource函数的代码也将以FullLanguage模式执行:
可以看到,我们在ConstrainedLanguage模式下运行,并且添加的4的平方根部分的代码失败了,因为这种调用方法被阻止了。然后将我们的恶意代码添加到$ code变量中。所有这些代码都和“4的平方根”的代码类似,就像我们上面尝试过的那样。完成这些后,“MSFT_ScriptResource”模块将会被导入,并通过-GetScript参数将恶意代码传递给“Get-TargetResource”函数。之后,将执行Add-Type调用并执行恶意代码,从而绕过Device Guard上的CLM。应该注意,启用ScriptBlock日志记录仍将捕获应该注意,启用ScriptBlock日志记录仍将捕获绕过CLM的尝试。
这个bug是通过CVE-2018-8212修复的。如果您有兴趣,微软最近已将此类旁路添加到WDAC Application Security赏金计划中:https://www.microsoft.com/en-us/msrc/windows-security-servicing-criteria