瑞绿 (@b2ahex) [出自:jiwo.org]
基础知识
披露或补丁日期:1月 13, 2022
产品:微软视窗
咨询:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-21882
受影响的版本:在 2022 年 1 月更新之前。Windows 10,Windows 11,Windows Server 2019,Windows Server 2022(目前仅在windows10和Windows Server 2019下找到完整的漏洞利用)
第一个修补版本:CVE-2022-21882,2022 年 1 月更新。
问题/错误报告:不适用
补丁 CL:不适用
错误引入 CL:不适用
报告者:瑞绿 (@b2ahex)
守则
概念验证:不适用
漏洞利用示例:不适用
在执行分析时,您是否有权访问漏洞利用示例?是的
漏洞
错误类:win32k 对象类型混淆
漏洞详细信息:
攻击者可以在user_mode调用相关的GUI API,以进行内核调用,如xxxMenuWindowProc,xxxSBWndProc,xxxSwitchWndProc,xxxTooltipWndProc等。这些内核函数将触发回调 xxxClientAllocWindowClassExtraBytes。攻击者可以通过内核回溯表中的钩子xxxClientAllocWindowClassExtraBytes拦截此回调,并使用NtUserConsoleControl方法设置tagwnD对象的控制台Window标志,从而修改窗口类型。
最终回调后,系统不会检查窗口类型是否已更改,并且由于类型混淆而引用了错误的数据。修改标志之前和之后的区别在于,在设置标志之前,系统认为 tagWND.WndExtra 保存了一个user_mode指针;设置标志后,系统认为 tagWND.WndExtra 是内核桌面堆的偏移量,攻击者可以控制此偏移量,从而导致 R&W 越界。
补丁分析:
补丁添加了检查代码。在 xxxClientAllocWindowClassExtraBytes 方法结束之前,系统将检查 ConsoleWindow 标志 (0x800)。如果设置了该标志,则 xxxClientAllocWindowClassExtraBytes 将返回 false。
关于如何找到这个漏洞的想法(模糊测试,代码审计,变体分析等):
对用户模式回调相关函数进行代码审计是可行的,并且在这个攻击面上有很多优秀的研究。
(历史/现在/未来)错误上下文:
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-1732
漏洞利用
(此处定义了"利用原语"、"利用策略"、"利用技术"和"利用流"这两个术语。
利用策略(或多个策略):
通过漏洞实现越界读写,并修改内核对象的另一个窗口,获取内核任意地址读写原语
漏洞利用流:
1.触发漏洞得到越界写入,修改窗口对象的cbWndExtra 0x0FFFEFFF,所以使用窗口对象WndExtra可以访问大内存。
2.修改另一个窗口的WS_CHILD标志,为另一个窗口设置一个特殊构造的菜单(假菜单)
3.通过GetMenuBarInfo API和假菜单获取任意读取原语。
4.使用 SetWindowLongPtrA API 修改另一个窗口对象的 ExtraBytes 以获得任意写入基元。
5.通过 EPROCESS ActiveProcessLinks 查找具有 PID 4 的系统电子进程
6.读取系统令牌并替换当前进程令牌
相同漏洞利用流的已知情况:
它与之前的 CVE-2021-1732 漏洞利用相同,是利用权限提升漏洞的常用方法。
CVE-2021-1732(https://googleprojectzero.github.io/0days-in-the-wild//0day-RCAs/2021/CVE-2021-1732.html)
漏洞利用链的一部分?
不适用
后续步骤
变体分析
变体分析的领域/方法(及其原因):
以下是检查 CVE-2021-1732 和 CVE-2022-21882 的快速方法:
在 xxxClientAllocWindowClassExtraBytes 回调完成后,在函数返回之前确定窗口对象是否包含0x800标志。
当设置了标志后,可以根据xxxClientAllocWindowClassExtraBytes的调用路径进行识别。
当堆栈路径为 xxxCreateWindowEx -> xxxClientallocxxxxExtraBytes (CVE-2021-1732)。
在其他情况下是(CVE-2022-21882)。
找到的变体:不适用
结构改进
杀死 bug 类的想法:
完善内核0天赏金,让更多的安全研究人员参与赏金计划,帮助系统更完美。
缓解漏洞利用流的想法:
缓解常见的漏洞利用技术。
其他潜在改进:
改进内核0天赏金。
0 天检测方法
类似 0 天的潜在检测方法有哪些?这意味着是否有任何关于如何将此漏洞或类似漏洞检测为0天的想法?
检测内存中的字符串以动态获取地址/偏移量。
检测用户模式进程加载内核模块(如 ntoskrnl.exe)的行为。
检查内核回溯表是否被挂接。
其他参考资料
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-21882
https://googleprojectzero.github.io/0days-in-the-wild//0day-RCAs/2021/CVE-2021-1732.html
https://www.mcafee.com/blogs/enterprise/mcafee-enterprise-atr/technical-analysis-of-cve-2021-1732/