背景

  CVE-2021-33739是一个UAF漏洞,成因是由于在对象CInteractionTrackerBindingManagerMarshaler与对象CInteractionTrackerMarshaler双向绑定的前提下,再对双方绑定进行解绑,CInteractionTrackerMarshaler指向前者的指针虽被清除,但CInteractionTrackerBindingManagerMarshaler中指向CInteractionTrackerMarshaler的指针仍然存在,之后释放CInteractionTrackerMarshaler对象,CInteractionTrackerBindingManagerMarshaler中的指针仍然指向被free的内核地址,从而导致UAF漏洞。

分析

  首先创建一个CInteractionTrackerBindingManagerMarshaler(id=1)和两个CInteractionTrackerMarshaler对象资源(id=2、3)。创建方式是利用用户态win32u.dll模块的导出函数NtDCompositionProcessChannelBatchBuffer,通过和信道关联的缓冲区pMappedAddress指定创建资源类型(ResourceType)和指令(nCmdCreateResource),在内核中创建指定id的相应资源。信道通过调用函数NtDCompositionCreateChannel创建。

  系统调用NtDCompositionProcessChannelBatchBuffer支持的指令如下,每个指令都有自己不同的缓冲区大小和格式。当前漏洞涉及到了其中的nCmdCreateResource(1)、nCmdReleaseResource(3)、nCmdSetResourceBufferProperty(12)。

  nCmdCreateResource指令对应的缓冲区(pMappedAddress)格式和大小:

  调用后,执行至win32kbase!DirectComposition::CApplicationChannel::CreateResource,再根据isSharedResource参数执行CreateInternalSharedResource或CreateInternalResource,漏洞在CreateInternalResource中。



  win32kbase!DirectComposition::CApplicationChannel::CreateInternalResource根据Resource Type创建不同资源对象。

  对象全部创建成功后,指定处理指令nCmdSetResourceBufferProperty,将两种不同类型指令进行绑定。缓冲区格式如下:



  该指令将执行至CInteractionTrackerBindingManagerMarshaler::SetBufferProperty,该函数位于CInteractionTrackerBindingManagerMarshaler对象偏移0xA8处。



  如果CInteractionTrackerBindingManagerMarshaler没有绑定对象,且nCmdSetResourceBufferProperty指令对应pMappedAddress中由用户指定的EntryID(Data偏移+0x8处)不为0,则将TrackerManager(CInteractionTrackerBindingManagerMarshaler)和两个Tracker(CInteractionTrackerMarshaler)互相绑定。

  由TrackerManager向Tracker的绑定方式是创建一个TrackerEntry结构,指针放在TrackerManager偏移+0x38处。TrackerEntry结构大小为32字节:

pTracker1(QWORD) | pTracker2(QWORD) | entry_id(QWORD) | 1(QWORD)

  绑定后的TrackerManager:

  而从Tracker向TrackerManager的绑定由SetBindingManagerMarshaler函数实现。该函数先判断Tracker偏移0x190处指针是否指向待绑定的TrackerManager,在确认未绑定的条件下先将TrackerManager偏移0x14处的资源引用值加1,接着在Tracker对象偏移0x190处写入TrackerManager对象指针值,实现绑定。



  指令完成后,再次执行上一步nCmdSetResourceBufferProperty指令操作,不过变动是需要指定EntryID为0(szBuff+0x8)。

  再次执行至SetBufferProperty,此时流程将进入另一分支,因为此时在TrackerManager对象偏移0x50处值由0变成1,应该和TrackerEntry关联。之后又根据用户给的Tracker1和Tracker2二者ID从channel对象关联的pMappedAddress中取出各自对应下标的指针值,和TrackerManager中TrackerEntry绑定的两个Tracker ID进行比较,相同则继续,不同则跳转至绑定分支。

  顺利执行下来,又对用户指定的EntryID判断为0的话,将调用RemoveBindingManagerReferenceFromTrackerIfNecessary,该函数将解除TrackerManager和Tracker的绑定关系。然而漏洞就是出现在此处,因为RemoveBinding...函数只是将Tracker中的TrackerManager指针值置0,而TrackerManager中的TrackerEntry仍然存在。



  之后释放(nCmdReleaseResource)两个Tracker资源,再调用NtDCompositionCommitChannel提交channel数据后将触发BSOD。可以看到,最终是在调用CInteractionTrackerBindingManagerMarshaler::EmitBoundTrackerMarshalerUpdateCommands发生错误。

利用

目前公开的POC,是利用构造的Palette对象去占用被释放的两个Tracker的原本空间,之后再借助NtDCompositionCommitChannel触发利用。

  每释放一个Tracker,就紧接着通过大量创建Fake_Palette对象的方式去占用目标空间。为了能准确地实现占用,构造的Fake_Palette对象大小应和原本被释放的Tracker对象大小一致,可以在之前的windbg中使用命令!pool中看到Tracker的size为0x1A0。

  在分析部分,可以知道最终是在CInteractionTrackerBindingManagerMarshaler::EmitBoundTrackerMarshalerUpdateCommands函数除触发的BSOD。

  查看该函数,可以看到会调用 (*pTracker)+0x50 地址处的函数,应该是原本已释放Tracker的虚表函数调用。

  通过构造Palette,可指定函数调用,POC中选用了nt! SeSetAccessStateGenericMapping,可将16字节内容写入可控地址,可用于替换_KTHREAD中的PreviousMode(1:usermode;0:kernelmode),内核中的完整性检查是在previousmode为1前提下,意味着previousmode被覆写为0可进行跟高权限操作。

  查看nt!SeSetAccessStateGenericMapping,其中rdx指向channel缓冲区的偏移0xB8处的16字节。多次调试后发现该位置前8字节为一个不明指针值,后8字节为0值,因此覆写时,向后移动了9字节,以保证0值覆盖previousmode字段。



  POC代码中似乎还尝试修改Token,但是rdx不可控,似乎没起作用。

  另外在EmitBoundTrackerMarshalerUpdateCommands中,需要TrackerEntry的ID不为0方才能调用虚表中的函数。但是解绑Tracker2和Tracker3时,TrackerEntry被重新设置为了0,因此POC除了创建Tracker2和Tracker3,还需要创建第三个Tracker(Tracker4)。在绑定和释放Tracker2和Tracker3且Fake_Palette成功占用二者原来空间后,再绑定Tracker4和TrackerManager,指定TrackerEntry不为0,如POC中的0xffff。

  成功占用后的空间情况,可以看到都是大小为0x1A0的相同连续空间分布。

  PreviousMode覆写前后:

  之后将shellcode注入winlogon.exe,启动system权限的cmd.exe。

参考

https://www.anquanke.com/post/id/245427

https://www.zerodayinitiative.com/blog/2021/5/3/cve-2021-26900-privilege-escalation-via-a-use-after-free-vulnerability-in-win32k

https://github.com/Lagal1990/CVE-2021-33739-POC/blob/fbbba006a610f4f269c9aefdf060562d86459bf5/CVE-2021-26868 %26 CVE-2021-33739/exp/exp.cpp

CVE-2021-33739 EOP漏洞分析的更多相关文章

  1. 漏洞分析:CVE 2021-3156

    漏洞分析:CVE 2021-3156 漏洞简述 漏洞名称:sudo堆溢出本地提权 漏洞编号:CVE-2021-3156 漏洞类型:堆溢出 漏洞影响:本地提权 利用难度:较高 基础权限:需要普通用户权限 ...

  2. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  3. FFmpeg任意文件读取漏洞分析

    这次的漏洞实际上与之前曝出的一个 CVE 非常之类似,可以说是旧瓶装新酒,老树开新花. 之前漏洞的一篇分析文章: SSRF 和本地文件泄露(CVE-2016-1897/8)http://static. ...

  4. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...

  5. Elasticsearch 核心插件Kibana 本地文件包含漏洞分析(CVE-2018-17246)

    不久前Elasticsearch发布了最新安全公告, Elasticsearch Kibana 6.4.3之前版本和5.6.13之前版本中的Console插件存在严重的本地文件包含漏洞可导致拒绝服务攻 ...

  6. ThinkCMF X2.2.2多处SQL注入漏洞分析

       1.     漏洞描述 ThinkCMF是一款基于ThinkPHP+MySQL开发的中文内容管理框架,其中X系列基于ThinkPHP 3.2.3开发,最后更新到2.2.2版本.最近刚好在渗透测试 ...

  7. 看个AV也中招之cve-2010-2553漏洞分析

    试想:某一天,你的基友给你了一个视频文件,号称是陈老师拍的苍老师的老师题材的最新电影.avi,你满心欢喜,在确定文件格式确实为avi格式后,愉快的脱下裤子准备欣赏,打开后却发现什么也没有,而随后你的基 ...

  8. CVE-2010-3971 CSS内存破坏漏洞分析

    看了仙果版主的议题演讲,其中提到cve-2010-3971是一个浏览器漏洞利用中的里程碑.于是找来POC,尝试分析一下. 1.漏洞重现 XP SP3+ie6.0环境 poc如下: poc.htm &l ...

  9. CVE-2016-0095提权漏洞分析

    1 前言 瞻仰了k0shl和鹏哥 的漏洞分析,感慨万千,任重而道远. 2 系统环境和工具 windows 7 32旗舰版 windbg 3 poc 3.1poc复现 首先k0shl大佬给出的poc() ...

随机推荐

  1. 利用ajaxfileupload插件异步上传文件

    html代码: <input type="file" id="imgFile" name="imgFile" /> js代码: ...

  2. centos 操作系统优化

    命令提示符优化 修改PS1环境变化 vim /etc/profile #在最后一行添加 export PS1='[\u@\H \w]$' \u ---显示当前登录用户名称 \h ---显示系统主机名称 ...

  3. HTTP 408 问题 - Koa body parser

    环境描述: 1.nodejs 作为 api 服务器,转发请求给 nginx 2.用 curl 测试,返回 408 找了很久没有找到原因,发现了一篇文章: https://lujunda.cn/2016 ...

  4. 注意,你所做的 A/B 实验,可能是错的!

    对于 A/B 实验原理认知的缺失,致使许多企业在业务增长的道路上始终在操作一批"错误的 A/B 实验".这些实验并不能指导产品的优化和迭代,甚至有可能与我们的初衷背道而驰,导致&q ...

  5. python 读取配置文件ini ---ConfigParser

    Python读取ini文件需要用到 ConfigParser 模块 关于ConfigParser模块的介绍详情请参照官网解释:https://docs.python.org/2.7/library/c ...

  6. Solon 开发,七、自定义注解开发汇总

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  7. 《剑指offer》面试题21. 调整数组顺序使奇数位于偶数前面

    问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4] 输出:[1,3,2,4] ...

  8. Three.js之绘制物体的边框及修改lineWidth

    本博文主要记录如何使用three.js绘制物体的边框及修改其lineWidth.three.js是个技术点比较多,查询资料又比较少的框架,单单就这个修改lineWidth就是一个坑.先放一个动态的效果 ...

  9. golang中的定时器

    1.  timer 定时器,时间到了执行,只执行一次 package main import ( "fmt" "time" ) func main() { // ...

  10. Qt中编译器

    很多时候,Qt构建项目编译的过程中会报错,大部分报错是因为qt的设置出现问题,很多时候环境配置时要选择合适的编译器,debugger调试器等,这里对一些名词解释,内容对新手很友好,大佬就不用看啦. M ...