win32k内核提权漏洞分析(CVE-2021-1732)

  • A+
所属分类:安全文章

CVE-2021-1732是今年二月份被披露的蔓灵花(BITTER)APT组织在某次攻击行动中使用的0Day漏洞【1】【2】【3】。该漏洞利用Windows操作系统win32k内核模块一处用户态回调机会,破坏函数正常执行流程,造成窗口对象扩展数据的属性设置错误,最终导致内核空间的内存越界读写。当受影响版本的Windows操作系统用户执行攻击者构造的利用样本时,将会触发该漏洞,造成本地权限提升【4】。


漏洞原理分析


CVE-2021-1732漏洞形成的根本原因是:

Windows窗口创建(CreateWindowEx)过程中,当遇到窗口对象tagWND有扩展数据时(tagWND.cbwndExtra != 0),会通过nt!KeUserModeCallback回调机制调用用户态ntdll!_PEB.kernelCallbackTable(offset+0x58)里的函数:

user32!_xxxClientAllocWindowClassExtraBytes,从而在用户态通过系统堆分配器申请(RtlAllocateHeap)扩展数据的内存。通过在用户态hook user32!_xxxClientAllocWindowClassExtraBytes函数,并在hook函数中手动修改窗口对象扩展数据的属性,可以破坏内核态为窗口对象扩展数据申请内存的原子操作,最终实现基于窗口对象扩展数据内存的越界读写能力。


Windows窗口创建(CreateWindowEx)过程的正常流程如下图(部分):

win32k内核提权漏洞分析(CVE-2021-1732)

通过上图可以知道:当窗口的扩展数据大小tagWND.cbWndExtra不为0时,

win32kfull!xxxCreateWindowEx 内部通过内核回调机制调用用户态

user32!_xxxClientAllocWindowClassExtraBytes函数,在用户空间申请窗口对象扩展数据所需内存,最终将指针返回给窗口对象的tagWND.pExtraBytes属性:

win32k内核提权漏洞分析(CVE-2021-1732)

内核窗口对象tagWND的扩展数据有两种保存方式:

1)保存于用户态系统堆:即上图所示的正常流程,用户态系统堆申请的扩展数据内存指针直接保存于tagWND.pExtraBytes。

基于用户态系统堆模式的一个tagWND内存布局如下图所示:

win32k内核提权漏洞分析(CVE-2021-1732)

2)保存于内核态桌面堆:函数NtUserConsoleControl调用会通过DesktopAlloc在内核态桌面堆分配内存,计算分配的扩展数据内存地址到桌面堆起始地址的偏移,保存在tagWND.pExtraBytes中,并修改tagWND.extraFlag |= 0x800:

win32k内核提权漏洞分析(CVE-2021-1732)

基于内核态桌面堆偏移模式的一个tagWND内存布局如下图所示:

win32k内核提权漏洞分析(CVE-2021-1732)

因此可以通过hook回调

user32!_xxxClientAllocWindowClassExtraBytes,在回调期间手动调用NtUserConsoleControl修改tagWND的扩展数据保存方式。然后在回调返回前手动调用ntdll!NtCallbackReturn:

win32k内核提权漏洞分析(CVE-2021-1732)

通过ntdll!NtCallbackReturn返回用户态可控offset值至tagWND.pExtraBytes,最终实现基于内核态桌面堆起始地址的可控offset越界读写能力。

修改后可以触发漏洞的流程如下:

win32k内核提权漏洞分析(CVE-2021-1732)

根据上面修改的流程图,漏洞触发的关键步骤如下:

1)修改

PEB.kernelCallbackTable中user32!_xxxClientAllocWindowClassExtraBytes函数指针为自定义hook函数。

2)创建一些普通窗口对象,通过

user32!HMValidateHandle泄漏这些tagWND内核对象在用户态映射的内存地址。

3)释放2)中创建的部分普通窗口对象,再次创建指定tagWND.cbwndExtra大小的窗口对象hwndMagic。此时该窗口对象有一定几率使用之前释放的窗口对象内存。因此在自定义hook函数中搜索之前泄漏的窗口对象用户态映射内存地址,通过比较tagWND.cbwndExtra,就可以在CreateWindowEx返回前找到hwndMagic。

4)hook函数中调用NtUserConsoleControl修改hwndMagic的extraFlag |= 0x800。

5)hook函数中调用NtCallbackReturn将伪造offset赋值给hwndMagic的pExtraBytes。

6)调用SetWindowLong,向内核态桌面堆起始地址+指定offset越界写入数据。


hook函数一种实现如下:

win32k内核提权漏洞分析(CVE-2021-1732)

BSOD现场堆栈情况:

win32k内核提权漏洞分析(CVE-2021-1732)


漏洞利用分析


由漏洞原理分析部分知道:

通过该漏洞,可以获得”一次修改基于内核态桌面堆起始地址+指定offset地址数据的机会“。对于内核态的漏洞,攻击目标一般是获得system权限,一种常用方法为:

1)利用漏洞获得内核态任意地址读写权限

2)泄漏内核对象地址,通过EPROCESS链查找system进程

3)拷贝system进程token至本进程,完成提权工作


这里的难点为1):即如何利用”一次修改基于内核态桌面堆起始地址+指定offset地址数据的机会“,实现内核态任意地址读写。一种利用思路如图所示:

win32k内核提权漏洞分析(CVE-2021-1732)

1)首先利用漏洞,tagWNDMagic的附加数据(wndMagic_extra_bytes)的offset可控,可以通过SetWindowLong实现从桌面堆基址+可控offset的指定地址数据修改。

2)利用漏洞能力修改tagWNDMagic.pExtraBytes为tagWND0对象的offset (tagWND0的offset 由tagWND0+0x8获得),调用SetWindowLong修改tagWND0.cbWndExtra = 0x0fffffff,从而获得一个可越界读写的tagWND0.pExtraBytes。

3)计算tagWND0.pExtraBytes到tagWND1的offset,利用2)中获得的可越界读写的tagWND0.pExtraBytes,调用SetWindowLongPtr修改tagWND1的spMenu指向伪造的spMenu,从而借助伪造的spMenu和GetMenuBarInfo实现任意地址读能力。

GetMenuBarInfo读取指定地址数据的逻辑如下,读取的16字节数据被保存在MENUBARINFO.rcBar结构体中:

win32k内核提权漏洞分析(CVE-2021-1732)

1)利用3)中获得的可越界读写的tagWND0.pExtraBytes,修改tagWND1.pExtraBytes到指定地址,借助tagWND1的SetWindowLongPtr,获得任意地址写入能力。

2)获得任意地址读写权限后,需要泄漏一个桌面堆上的内核对象地址来定位EPROCESS,这里步骤3)中为tagWND1设置伪造spMenu时SetWindowLongPtr返回值就是原spMenu的内核地址,可以直接利用。最后通过遍历EPROCESS链查找system进程,并拷贝system进程token至本进程完成提权,此类方法比较常见,不再详述。


最终完整的提权演示:

win32k内核提权漏洞分析(CVE-2021-1732)


参考文献


[1]https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-1732

[2]https://ti.dbappsecurity.com.cn/blog/index.php/2021/02/10/windows-kernel-zero-day-exploit-is-used-by-bitter-apt-in-targeted-attack-cn/

[3]https://www.virustotal.com/gui/file/914b6125f6e39168805fdf57be61cf20dd11acd708d7db7fa37ff75bf1abfc29/detection

[4]https://en.wikipedia.org/wiki/Privilege_escalation


解决方案


深信服EDR】深信服EDR近期将支持针对该漏洞的在野样本检测:

    ● 确保病毒库更新至最新版本
    ● 集成深信服SAVE人工智能检测引擎,拥有强大的泛化能力,精准防御未知病毒
    ● 接入安全云脑,即可使用云查服务及时检测防御新威胁

深信服EDR补丁库】EDR已完成漏洞规则库的更新,支持该漏洞的检测及补丁分发。EDR3.2.10及以上版本需要升级相应的SP包,更新漏洞补丁规则库版本到20210311204509及以上版本,即可检测漏洞并分发补丁进行漏洞修复。联网用户可直接在线更新,离线升级包及漏洞补丁规则库已上传至深信服社区,有需要的用户请到深信服社区下载。


团队介绍

深信服南研安全研究团队专注于高级威胁攻击,在野漏洞利用追踪、研究、检测,攻防对抗等方向的研究工作。团队成员曾在Windows,MacOS/iOS,Linux/Android等主流操作系统中发现了上百个安全漏洞,在BlackHat USA、BlackHat Europe、BlackHat Asia、HITB、Microsoft BlueHat、CodeBlue、HITCON、Virus Bulletin、Pacsec、看雪SDC、Freebuf CIS等国内外知名安全会议上发表过演讲和论文。


如果你对以下技术内容感兴趣,希望和高手切磋共事,赶紧发简历过来吧(邮箱[email protected] 工作地点:南京):

APT攻击溯源】 恶意代码分析,威胁情报研究,APT溯源分析

检测引擎研发】 EDR、XDR等检测引擎研发

攻防对抗技术】红蓝对抗,ATT&CK技术研究,检测规则编写

漏洞挖掘与利用】在野漏洞利用研究,漏洞挖掘

云原生安全】云原生安全技术研究和产品研发

MacOS安全】macOS安全产品核心模块开发,macOS沙箱、EDP、EDR、DLP等安全产品开发

大数据安全】研发基于大数据技术的下一代安全产品


深信服千里目安全实验室长期招聘


01

【漏洞分析】 win32k内核提权漏洞分析(CVE-2021-1732)

02

【漏洞分析】 win32k内核提权漏洞分析(CVE-2021-1732)

03

【漏洞分析】 win32k内核提权漏洞分析(CVE-2021-1732)

左右滑动查看更多图片


深信服千里目安全实验室

【漏洞分析】 win32k内核提权漏洞分析(CVE-2021-1732)

深信服科技旗下安全实验室,致力于网络安全攻防技术的研究和积累,深度洞察未知网络安全威胁,解读前沿安全技术。

● 扫码关注我们


本文始发于微信公众号(深信服千里目安全实验室):【漏洞分析】 win32k内核提权漏洞分析(CVE-2021-1732)

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: