首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

CVE-2025-13032:进入并破坏 Avast Antivirus 沙盒第 2 部分

摘要

Introduction This blogpost is the second and final part of our Avast research and will focus on the exploitation of CVE-2025-13032, a double-fetch vulnerability we discovered in Avast’s kernel driver....

the and user unicodestring_user fetch kernel This part will double
2026-09-25 1 阅读 约8分钟阅读 safateam
分享:
字号:
简介 这篇博文是我们 Avast 研究的第二部分,也是最后一部分,将重点关注 CVE-2025-13032 的利用,这是我们在 Avast 内核驱动程序中发现的双重获取漏洞。这篇文章回顾了该漏洞,并介绍了我们在发现该漏洞时如何在最新的 Windows 11 系统上利用该漏洞。如果您错过了,请随意阅读第一部分 → https://www.safateam.com/intelligence-hub/research/technical-articles/cve-2025-13032-entering-and-breaking-the-avast-antivirus-sandbox-part-1 注意:在最新版本中,Windows 内核和驱动程序使用用户模式访问器( https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/user-mode-accessors )来验证每个内核对用户模式内存的访问,并确保每次访问时用户缓冲区实际上驻留在用户空间中。此缓解措施将阻止使用本文中描述的利用技术,请参阅 https://www.youtube.com/watch?v=ry4SNYe2f68 的其他详细信息 错误说明 我们要利用的错误是导致内核池溢出的双重获取问题。下面提供的代码片段应该捕获用户提供的“_UNICODE_STRING”结构,但是用户输入的“Length”字段被多次提取,这导致了双重提取问题。第一次提取是为了分配一个缓冲区,在其中复制字符串,第二次提取是为了根据检索到的值执行 memcpy,如果用户在这些操作之间更改它,则会导致池溢出。 1 if (!a1 && unicodestring_user ) 3 ProbeForRead ( unicodestring_user , 0x10 , 1 ) ; 4 ProbeForRead ( unicodestring_user -> 缓冲区 , unicodestring_user -> 长度 , 1 ) ; 6 v17 = sub_140071C6C ( ( __int64 ) v18 , & v14 [ v23 + 13 ] , unicodestring_user ) ; 8 __int64 __fastcall sub_140071C6C ( __int64 a1 , _QWORD * a2 , _UNICODE_STRING * unicodestring_user ) 10 PoolWithTag = ExAllocatePoolWithTag ( PagedPool , unicodestring_user -> 长度 + 16 , 0x20786E53u ) ; 13 长度 = unicodestring_user -> 长度; 14 * PoolWithTag = unicodestring_user -> 长度; 15 池与标签[1]=长度; 16 * ( ( _QWORD * ) PoolWithTag + 1 ) = PoolWithTag + 8 ; 17 缓冲区 = ( char * ) unicodestring_user -> 缓冲区 ; 20 if (unicodestring_user -> 长度) 21 memmove ((_OWORD *) PoolWithTag + 1, 缓冲区, unicodestring_user -> 长度);为了利用双重提取,第二个线程在紧密循环中运行,不断地在较小的安全值和较大的恶意值(例如“0x1000”,大于分配的缓冲区)之间切换共享“_UNICODE_STRING”的“Length”字段。主线程循环调用易受攻击的IOCTL。当时间对齐时——内核在“ExAllocatePoolWithTag”调用中读取的“Length”较小,然后在“memmove”中读取较大的“Length”——复制的字节数多于分配的字节数,从而产生池溢出。竞赛窗口很窄,但可以在适度的迭代次数内可靠地获胜。我们的目标是利用此池溢出来获取任意内核读/写原语并实现本地权限升级。该bug为我们提供了良好的利用条件:溢出目标是“PAGED_POOL”,分配大小和溢出大小都受到控制,内容也是如此。分页池是 Windows 内核内存的一个区域,用于存储内核或驱动程序所需的对象和数据,但可以将其分页到磁盘。它用于不需要由高优先级运行的关键代码访问的内存。分配器按大小类别对分配进行分组,这意味着相同大小的对象往往在内存中彼此靠近——这一属性使堆喷射变得可行。从 Windows 10 19H1 开始,这是由段堆处理的,它使用两个后端:用于小型分配的 LFH,它在大小桶内随机选择空闲插槽;以及用于较大分配的 VS 分配器,它提供正确大小的第一个可用块 - 每个都需要不同的喷射策略。我们还可以注意到,大多数 Windows 对象都存储在分页池中,这在选择损坏对象时为我们提供了大量候选对象。在下一节中,我们将解释我们选择的对象以及该选择背后的原因。有关 Windows 池如何工作的更多信息,您可以参阅 Synacktiv 的“Scoop the Windows 10 pool!”论文( https://www.sstic.org/media/SSTIC2020/SSTIC-actes/pool_overflow_exploitation_since_windows_10_19h1/SSTIC2020-Article-pool_overflow_exploitation_since_windows_10_19h1-bayet_fariello.pdf)。 I/O 环对象 I/O 环对象是维护要异步执行的 I/O 操作提交队列的对象。具体来说,它允许用户态批处理文件 I/O 请求:“IoRingReadFile”将数据从文件复制到预先注册的缓冲区中,“IoRingWriteFile”将数据从预先注册的缓冲区复制到文件中。这些注册的缓冲区 - 在“_IORING_OBJECT”的“RegBuffers”字段中跟踪 - 在注册时进行一次验证
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱