【CVE-2025-21298】严重级 0-Click 的漏洞成因与复现

admin 2025年4月25日00:24:53评论1 views字数 3919阅读13分3秒阅读模式

声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。

防走失:https://gugesay.com/archives/4175

不想错过任何消息?设置星标↓ ↓ ↓

【CVE-2025-21298】严重级 0-Click 的漏洞成因与复现

前言

CVE-2025-21298 漏洞其实是在三个月前被研究人员发现的,然后于 2025 年 1 月被微软官方披露,该漏洞 CVSS 评分 9.8 分。

当受害者在 Microsoft Outlook 中打开或预览电子邮件时,漏洞就会被触发,从而允许攻击者在受影响的系统上执行任意代码。

PoC

Github 已放出该漏洞的概念验证(PoC),通过演示视频可以看到这是一个内存损坏的 PoC,并非漏洞利用程序(EXP),但不得不说,这种零点击(0-Click)漏洞非常讨“黑客”们的喜爱。

https://github.com/ynwarcs/CVE-2025-21298

漏洞成因

漏洞主要位于ole32.dll!utoLepresstmtocontentsstm中,该函数的目的是将OLE存储中的“Olepres”流中的数据转换为适当格式的数据,然后将其插入同一存储中的“CONTENTS”流中,它接收一个指向存储对象的IStorage指针和三个不重要的参数。

通过查看该函数的实现,并进行补丁差异对比可以看到:

__int64 __fastcall UtOlePresStmToContentsStm(IStorage *pstg, wchar_t *puiStatus, __int64 a3, unsignedint *lpszPresStm){structIStorageVtbl *lpVtbl;// raxint v7; // r14dbool IsEnabled; // al  IStream *v10; // rcxbool v11; // zfstructIStorageVtbl *v12;// raxint v13; // ebx  HRESULT v14; // eaxconstwchar_t *v15; // rdx  IStream *pstmContents; // [rsp+40h] [rbp-19h] BYREF  IStream *pstmOlePres; // [rsp+48h] [rbp-11h] BYREF  tagFORMATETC foretc; // [rsp+50h] [rbp-9h] BYREF  tagHDIBFILEHDR hdfh; // [rsp+70h] [rbp+17h] BYREF  *lpszPresStm = 0;  lpVtbl = pstg->lpVtbl;  pstmContents = 0LL;  v7 = 1;// Create a "CONTENTS" stream in the storage and store it into pstmContentsif ( (lpVtbl->CreateStream)(pstg, L"CONTENTS"18LL, 0LL, 0, &pstmContents) )return0LL;// Immediately release pstmContents, we're not going to be using it right now  (pstmContents->lpVtbl->Release)(pstmContents);+ IsEnabled = wil::details::FeatureImpl<__WilFeatureTraits_Feature_3047977275>::__private_IsEnabled(&`wil::Feature<__WilFeatureTraits_Feature_3047977275>::GetImpl'::`2'::impl);+ v10 = pstmContents;+ v11 = !IsEnabled;  v12 = pstg->lpVtbl;if ( !v11 )+   v10 = 0LL;+ pstmContents = v10;  (v12->DestroyElement)(pstg, L"CONTENTS");  v13 = (pstg->lpVtbl->OpenStream)(pstg, &OlePres, 0LL, 16LL, 0, &pstmOlePres);// 2nd option to fail -> no OlePres streamif ( v13 )  {    *lpszPresStm |= 1u;if ( (pstg->lpVtbl->OpenStream)(pstg, L"CONTENTS"0LL, 16LL, 0, &pstmContents) )    {      *lpszPresStm |= 2u;    }else    {      (pstmContents->lpVtbl->Release)(pstmContents);+     wil::details::FeatureImpl<__WilFeatureTraits_Feature_3047977275>::__private_IsEnabled(&`wil::Feature<__WilFeatureTraits_Feature_3047977275>::GetImpl'::`2'::impl);    }return v13;  }  foretc.ptd = 0LL;  v13 = UtReadOlePresStmHeader(pstmOlePres, &foretc, 0LL, 0LL);if ( v13 >= 0 )  {    v13 = (pstmOlePres->lpVtbl->Read)(pstmOlePres, &hdfh, 16LL);if ( v13 >= 0 )    {      v13 = OpenOrCreateStream(pstg, L"CONTENTS", &pstmContents);if ( v13 < 0 )      {        *lpszPresStm |= 2u;goto $errRtn_197;      }if ( foretc.dwAspect == 4 )      {        *lpszPresStm |= 4u;        v7 = 0;        v13 = 0;goto $errRtn_197;      }if ( foretc.cfFormat == 8 )      {        v14 = UtDIBStmToDIBFileStm(pstmOlePres, hdfh.dwSize, pstmContents);LABEL_19:        v13 = v14;goto $errRtn_197;      }if ( foretc.cfFormat == 3 )      {        v14 = UtMFStmToPlaceableMFStm(pstmOlePres, hdfh.dwSize, hdfh.dwWidth, hdfh.dwHeight, pstmContents);goto LABEL_19;      }      v13 = -2147221398;    }  }$errRtn_197:if ( pstmOlePres )    (pstmOlePres->lpVtbl->Release)(pstmOlePres);// Release pstmContents if it still exists, we need to clean upif ( pstmContents )    (pstmContents->lpVtbl->Release)(pstmContents);if ( foretc.ptd )    CoTaskMemFree(foretc.ptd);if ( v13 )  {    v15 = L"CONTENTS";goto LABEL_31;  }if ( v7 )  {    v15 = &OlePres;LABEL_31:    (pstg->lpVtbl->DestroyElement)(pstg, v15);  }return v13;}

问题主要出在pstmContents变量,最初它用于将指针存储到在函数开头创建的“CONTENTS”流对象,创建后立即销毁该流,并释放存储在pstmContents中的指针(在coml2.dll!ExposedStream::~ExposedStream中释放了它)。

然而该变量仍然包含已释放的指针,在函数的后续部分,变量可能会被重新使用,以再次存储指向 "CONTENTS "流的指针--正因为如此,函数末尾有清理代码来释放指针,以防它在变量中存储,代码未能考虑到UtReadOlePresStmHeader可能会失败。

如果发生这种情况,pstmContents仍将指向已释放的指针,从而进入清理代码,再次释放指针,那么就会出现经典的双重释放(UAF)的情况。

在补丁对比中可以看到,微软通过在包含它的指针最初释放后将pstmContents设置为零修复了这个问题。

漏洞复现

首先打开 Word:

【CVE-2025-21298】严重级 0-Click 的漏洞成因与复现
打开 Word

然后使用 WinDbg 附加到正在运行的 WINWORD.EXE 进程中:

【CVE-2025-21298】严重级 0-Click 的漏洞成因与复现
 Windbg 附加进程

打开Github 中给出的 poc.rtf ,就会看到 WORD 崩溃的调试信息:

【CVE-2025-21298】严重级 0-Click 的漏洞成因与复现
WORD崩溃信息

缓解措施与建议

微软已发布补丁来修复该漏洞,强烈建议用户和组织及时应用这些更新来降低潜在风险。

参考资料:https://www.offsec.com/blog/cve-2025-21298/

- END -

加入星球,随时交流:

(会员统一定价):128元/年(0.35元/天)【CVE-2025-21298】严重级 0-Click 的漏洞成因与复现感谢阅读,如果觉得还不错的话,欢迎分享给更多喜爱的朋友~

原文始发于微信公众号(骨哥说事):【CVE-2025-21298】严重级 0-Click 的漏洞成因与复现

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月25日00:24:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【CVE-2025-21298】严重级 0-Click 的漏洞成因与复现https://cn-sec.com/archives/3959754.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息