移动端 | 加入收藏 | 设为首页 | 最新ss | 赞助本站 | RSS
 

freefq.comfree——免费、自由fq——翻墙

困在墙内,请发邮件到freefqcom#gmail.com获得最新免费翻墙方法!
您当前的位置:首页 > 网络安全

微信远程工攵击面简单的研究与分析

时间:2020-04-08  来源:  作者: 条评论
在完成了对 FaceTime 的一系列漏氵同挖掘与研究后,我们决定对微信的音视频通信做一些分析。经分析后发现,当微信语音通话连接建立成功之后,微信客户端将解析远端发来的网络报文并还原成多媒体流。在还原解析的过程中,如果处理远端数据的代码存在问题时就会形成一个远程的工攵击面。
在针对这个工攵击面进行深入挖掘后我们发现了若干可以造成远程内存破坏的漏氵同。本篇文章我们将选择一个比较有趣且复杂的漏氵同进行深入的分析。该漏氵同可以造成远程写溢出从而导致崩溃,其root cause隐藏的非常深,触发流程也比较复杂。研究与分析该漏氵同无论是对安全研究还是软件开发的角度都有一定的价值。我们将在文章中详细的分析漏氵同成因和触发流程。微信已经在最新版7.0.12中修复了该漏氵同。

开胃小菜

首先我们先介绍两个比较简单的漏氵同,一个属于本地代码执行,一个属于远程溢出。

本地代码执行

Mac版本的微信客户端处理粘贴操作时,没有有效检查粘贴板对象中内容,导致不安全的对象反序列化。当本地其他恶意应用设置粘贴板时,用户在微信客户端粘贴操作时,会导致任意对象的创建。
如下面截图所示,Mac 版本的微信在反序列化粘贴板对象的过程中,并没有使用secure coding 以及白名单等设置,导致任何可以响应 [initwithcoder:] 函数的 objective-c 对象都能被创建并使用,会引起很大的工攵击面。
 
 
Mac版本微信对剪切板的处理
 
具体工攵击结果可以参考[Google Project Zero在iMessage中发现的大量不安全反序列化工攵击] (https://www.blackhat.com/us-19/briefings/schedule/#look-no-hands—-the-remote-interaction-less-attack-surface-of-the-iphone-15203).
Mac版本微信已经对该漏氵同进行了完全正确的修复,调用了 setRequiresSecureCoding: 函数,并作出了安全设置。
修复后的剪切板处理
 

远程下溢出

 
微信视频通话接通后,通话两端建立网络直连传递RTP报文。微信客户端传输RTP包过程中,采用了一套加密机制。但是微信客户端在RTP解密之前,没有很好验证RTP包长度。当工攵击者发送很短的RTP包的时候,会引起接受端处理RTP包过程中长度计算的整数下溢出,进而导致内存越界访问。
RTP包长度验证减法下溢出
有趣的是,GP0 研究员在微信 CAudioJBM::InputAudioFrameToJBM 函数中发现了类似的错误 (https://bugs.chromium.org/p/project-zero/issues/detail?id=1948)。这说明微信在在包长度验证时存在一定共性缺陷。
这是一个非常明显的下溢出,但是通过对这个问题的分析,我们认为远程的工攵击面中可能存在风险更高的漏氵同。

远程写溢出成因与分析

跳过前期复杂的协商互联流程,我们在已经通过微信语音通话的状态下,微信客户端将收到远端发送来的音频数据。收到的原始数据会被层层分解处理,并根据不同的类型分发到不同的处理函数上。

RecvRtpPacketCng

在收到远端的网络数据后,RTP 数据包将被 RecvRtpPacketCng(__int64 XVEChannel, unsigned int *pData, __int16 len, void *a4) 函数处理,这里的参数 pData内容是语音通话的远端完全可控的。该函数会根据网络包中指定的过不同的代码解析
当pkType类型为7或8时,该网络包的类型为 RTPwithRsMd
 
 
当网络包头部的 subpkt 解析完成后会调用 ParaseRemoteLostRateParam 函数:
 
 
ParaseRemoteLostRateParam 函数中,根据远端的 pData 中数据设置了XVEChannel+72 处对象的内部数据。通过参数 a2,在 pData 中读取两个字节,并最终设置到 m_RemoteLrParam 和 nFrmCnt 两个成员变量中。
 
 

DevPutProcessRsMdCng

在接收远端的语音数据的同时,也需要将自己的语音数据通过`XVEChannel`对象发送给远端。
 
在 readRemoteLrParam 函数中,会将刚刚设置的 m_RemoteLrParam 和 nFrmCnt 读取到栈上变量v92中。
 
 
在读取`RemoteLostRateParam`到局部变量v92后,需要设置到相应的本地成员变量中
 
 
当数据准备好后将调用函数 CAudioRS::RsMdEncProcessCng,写溢出就发生在这个函数中。
 
当 CAudioRS::RsMdEncProcessCng 刚开始执行时会通过 XVEChannel_72+9 作为 index 写一个 byte.
 
 
并在 RsMdEncQueueSourcePktCng 函数中 XVEChannel_72 + 9 将做一次自增。
 
当 CAudioRS::RsMdEncProcessCng 退出前会根据当前的状态更新成员变量。
 
[1] 通过`update_data`根据`LocalExpectRSPara`的值修改成员变量
 
[2] 如果XVEChannel_72+9处的值与XVEChannel_72+4处的值相同,则会发[3]处的代码将XVEChannel_72+9处写0.
因为 XVEChannel_72 + 9 可以根据 pData 中的数据设置成工攵击者可控的数据,当 XVEChannel_72 + 9 被设置为大于 XVEChannel_72 + 4 时,就必须一直自增且产生整数溢出后重新与 XVEChannel_72 + 4 相等时, 才能将 XVEChannel_72 + 9清零。
所以 XVEChannel_72 + 9 的取值范围是0-255。又因为` *(_BYTE *)(XVEChannel_72 + *(char *)(XVEChannel_72 + 9) + 1668) = a7;` 使用的是有符号数作为`index`。最终覆盖范围是 `XVEChannel_72+1668`处的`-128`到`127`处超过原本数据结构包含的内存。

触发流程

  • RecvRtpPacketCng 从网络报文中获取 lrParam
  • DevPutProcessRsMdCng 根据`lrParam 设置 LocalExpectRSPara
  • RsMdEncProcessCng 根据 LocalExpectRSPara 中的参数修改成员变量作为数据修改的index (XVEChannel_72 + 9 )
  • 修改成功后会对index自增并与本地的max值做比较,如果index达到最大值index_max时(`XVEChannel_72 + 4`)将index清零
    • 如果通过远数据端将index设置为大于index_max的情况,则index会一直自增直到发生整数溢出后才能满足index==index_max的条件进入清零的逻辑
    • index在(-128,127)范围内遍历,产生越界写。越界写的范围在 (-128,127)之间。

 

感谢

要特别感谢 TSRC 的认真负责。他们在我们上报漏氵同后对漏氵同响应及时,收到报告的次日就确认了漏氵同并给出危险评级。并且在后续的漏氵同修复与修复版本更新的工作中和我们保持联系。

TimeLine

2019/11/28 发现漏氵同
2019/12/02 完成漏氵同分析并上报TSRC
2019/12/03 TSRC确认漏氵同并修复
2020/03/23 文章发布
Credit:漏氵同由盘古实验室黄涛、王铁磊发现和分析。
来顶一下
返回首页
返回首页
欢迎评论:免登录,输入验证码即可匿名评论 共有条评论
用户名: 密码:
验证码: 匿名发表

推荐资讯

Octohide VPN:快如闪电的免费VPN
Octohide VPN:快如闪
原子网络加速器 - 免费高速VPN 一键链接 方便快捷
原子网络加速器 - 免费
foxovpn绿狐VPN——即连即用、快速、安全
foxovpn绿狐VPN——即
Dubai VPN - Free, Fast & Secure VPN下载
Dubai VPN - Free, Fa
相关文章
栏目更新
栏目热门
墙外新闻
读者文摘

你可以访问真正的互联网了。You can access the real Internet.

管理员精中特别提醒:本网站域名、主机和管理员都在美国,且本站内容仅为非中国大陆网友服务。禁止中国大陆网友浏览本站!若中国大陆网友因错误操作打开本站网页,请立即关闭!中国大陆网友浏览本站存在法律风险,恳请立即关闭本站所有页面!对于您因浏览本站所遭遇的法律问题、安全问题和其他所有问题,本站均无法负责也概不负责。

特别警告:本站推荐各种免费科学上网软件、app和方法,不建议各位网友购买收费账号或服务。若您因付费购买而遭遇骗局,没有得到想要的服务,请把苦水往自己肚子里咽,本站无法承担也概不承担任何责任!

本站严正声明:各位翻墙的网友切勿将本站介绍的翻墙方法运用于违反当地法律法规的活动,本站对网友的遵纪守法行为表示支持,对网友的违法犯罪行为表示反对!

网站管理员定居美国,因此本站所推荐的翻墙软件及翻墙方法都未经测试,发布仅供网友测试和参考,但你懂的——翻墙软件或方法随时有可能失效,因此本站信息具有极强时效性,想要更多有效免费翻墙方法敬请阅读本站最新信息,建议收藏本站!本站为纯粹技术网站,支持科学与民主,支持宗教信仰自由,反对恐怖主义、邪教、伪科学与专制,不支持或反对任何极端主义的政治观点或宗教信仰。有注明出处的信息均为转载文章,转载信息仅供参考,并不表明本站支持其观点或行为。未注明出处的信息为本站原创,转载时也请注明来自本站。

鉴于各种免费翻墙软件甚至是收费翻墙软件可能存在的安全风险及个人隐私泄漏可能,本站提醒各位网友做好各方面的安全防护措施!本站无法对推荐的翻墙软件、应用或服务等进行全面而严格的安全测试,因此无法对其安全性做保证,无法对您因为安全问题或隐私泄漏等问题造成的任何损失承担任何责任!

S. Grand Ave.,Suite 3910,Los Angeles,CA 90071

知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。