记一个未完全修补的ios补丁

  • A+

译文声明
本文是翻译文章,文章原作者 ZECOPS RESEARCH TEAM
,文章来源:https://blog.zecops.com
原文地址:https://blog.zecops.com/vulnerabilities/hidden-demons-maildemon-patch-analysis-ios-13-4-5-beta-vs-ios-13-5/

摘要

ZecOps研究团队除了分析Apple的MailDemon漏洞补丁(请参阅此处的博客)之外,还对iOS 13.4.5 beta和iOS 13.5的MailDemon补丁进行了对比。结论是,两个版本的补丁程序有所不同,iOS 13.4.5 beta补丁程序不全面的,在某些情况下仍可能会受到攻击。

Apple随后发布了一个完整的补丁,采用了不同的方法,在iOS13.5和iOS12.4.7上都完全修复了这个问题。

这也解释了为什么完整的补丁花费了一个月才进行发布。

iOS 13.4.5 Beta补丁

以下是在iOS 13.4.5 beta上,针对堆溢出漏洞修补的程序。

如果-[MFMutableData _mapMutableData]返回false,则函数-[MFMutableData appendBytes:length:]将会触发异常。
::: hljs-center

2.png

:::

为了知道何时[[MFMutableData _mapMutableData]会返回false,让我们看一下函数实现:
::: hljs-center

3.png

:::

由上图可以看到,当mmap失败时,会返回False。但是程序仍会分配一个大小为8字节的块,并将指针存储在self-> bytes中。在patch中,通过在数据复制到self-> bytes之前就触发异常,从而部分解决了堆溢出问题。
-[MFMutableData appendData:]
|
+-- -[MFMutableData appendBytes:length:] **<-patch**
|
+-- -[MFMutableData _mapMutableData]

但是程序中还存在其它函数调用-[MFMutableData _mapMutableData]并与self->进行交互。这些函数并不会检查mmap是否失败,因为补丁只会影响-[MFMutableData appendBytes:length:]。

以下是从MobileMail获取的回溯:

4.png
-[MFMutableData mutableBytes]
|
+-- -[MFMutableData bytes]
|
+-- -[MFMutableData _mapMutableData:]

由于mutableBytes返回的字节通常被认为是可修改的,具体请参见Apple的文档

此属性与bytes属性类似,但也有不同之处。bytes属性包含一个指向常量的指针,您可以使用该指针来读取指针指向数据,但不能修改数据。然而,如果mutableBytes包含非空指针,该指针指向可变数据。那么就可以使用mutableBytes指针修改由数据对象管理的数据。

如果mmap失败,则-[[MFMutableData mutableBytes]和-[MFMutableData bytes]都将返回self-> byte并指向8字节的块,在某些情况下可能导致堆溢出。

下面是一个实例,说明堆溢出发生的可能性。即使在memcpy之前检查长度,堆溢出仍然会发生:
::: hljs-center

5.png

:::

iOS 13.5补丁

在iOS 13.5修补程序中,在-[MFMutableData _mapMutableData]中触发异常,mmap失败后不再返回一个8字节的块。这种方法可以彻底解决堆溢出问题。
::: hljs-center

6.png

:::

总结

iOS 13.5补丁是修补堆溢出漏洞的正确方法。在补丁发布之前必须仔细对补丁进行检查并验证修补程序是否完整。

相关推荐: 通达OA任意文件上传+任意文件包含分析

通达OA官方于2020-03-13发布了安全更新,修复了任意文件上传(2013、2013adv、2015、2016、2017、V11)和文件包含(V11)漏洞,从官网下到源码解密后,简单看了下 直接看主流的2017、V11产品吧,这个系列产品有全版本的变量覆盖…