Bypass ACG With OpenProcess

https://bugs.chromium.org/p/project-zero/issues/detail?id=1435&can=1&q=&start=1200 p0 研究者 ifratric 提出的一种绕过 ACG 保护的方案,即通过修改同一 AppContainer 中的其他 MicrosoftEdgeCp.exe 进程的内存来阻止另一个进程开启 ACG 保护

ACG 的开启

进程的 ACG 需要调用函数 SetProcessMitigationPolicy.aspx) 或者 ZwSetInformationProcess 来开启。这里我们主要关注 SetProcessMitigationPolicy ,函数的原型如下

1
2
3
4
5
BOOL WINAPI SetProcessMitigationPolicy(
_In_ PROCESS_MITIGATION_POLICY MitigationPolicy,
_In_ PVOID lpBuffer,
_In_ SIZE_T dwLength
);

第一个参数指定要设定的缓解策略类型,第二个参数根据第一个参数指定不同的 Policy 数据,第三个参数指定第二个参数的长度。

目前支持的缓解策略有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef enum _PROCESS_MITIGATION_POLICY { 
ProcessDEPPolicy = 0,
ProcessASLRPolicy = 1,
ProcessDynamicCodePolicy = 2,
ProcessStrictHandleCheckPolicy = 3,
ProcessSystemCallDisablePolicy = 4,
ProcessMitigationOptionsMask = 5,
ProcessExtensionPointDisablePolicy = 6,
ProcessControlFlowGuardPolicy = 7,
ProcessSignaturePolicy = 8,
ProcessFontDisablePolicy = 9,
ProcessImageLoadPolicy = 10,
MaxProcessMitigationPolicy = 11
} PROCESS_MITIGATION_POLICY, *PPROCESS_MITIGATION_POLICY;

其中 ProcessDynamicCodePolicy 就是开启 ACG 的标志,与之对应的数据结构为 PROCESS_MITIGATION_DYNAMIC_CODE_POLICY.aspx)

调用这个函数之后,内核会修改当前进程 EPROCESS 结构上的标志位,这个标志位会影响进程可执行内存页的动态申请。

OpenProcess bypass

MicrosoftEdgeCP.exe 进程运行的权限很低,且运行在 AppContainer 权限下,一般来说无法对其他进程产生影响。但是在同一个 AppContainer 中的进程拥有这个 AppContainer 中其他进程的访问权限。也就意味着,MicrosoftEdgeCP.exe 可以通过 OpenProcess 同一个 AppContainer 下的其他 MicrosoftEdgeCP 进程。因此可以通过条件竞争的方式,在一个 MicrosoftEdgeCP 进程开启 ACG 之前通过同一个 AppContainer 下的另一个 MicrosoftEdgeCP 修改其开启 ACG 的条件(内存),使得这个 MicrosoftEdgeCP 不会开启 ACG。

是否开启 ACG 保护由内存中的两个全局变量控制,在 win10 v1709 版本中这个值的便宜分别是 0x23090 和 0x23092,如果这两个位置都不是 0 ,那么 ACG 将不会开启。

补丁

微软针对这个漏洞的修补就是将进程开启 ACG 保护的时机由进程启动时移动到进程创建时,父进程调用 ZwSetInformationProcess 在子进程中设置。

总结

这种 ACG 的绕过的前提是已经可以执行用户代码,然后通过这种方法可以获取一个关闭了 ACG 的进程,从而可以直接在这个进程中使用 shellcode 执行代码。从 ACG 的启动策略入手找到相关绕过方法。

References

[1] https://bugs.chromium.org/p/project-zero/issues/detail?id=1552&can=1&q=ACG&colspec=ID%20Status%20Restrict%20Reported%20Vendor%20Product%20Finder%20Summary