摘要和TL; DR
除了Apple的MailDemon漏洞补丁之外,ZecOps研究团队还分析并比较了iOS 13.4.5 beta和iOS 13.5的MailDemon补丁。
我们的分析得出的结论是,补丁程序有所不同,并且iOS 13.4.5 beta补丁程序不完整,在某些情况下仍可能会受到攻击。
由于13.4.5 beta补丁不够用,因此Apple发布了完整的补丁,采用了另一种方法,此方法在iOS 13.5和iOS 12.4.7上完全解决了此问题,作为旧设备的特殊安全更新。
这可能解释了为什么要花费大约一个月才能发布完整补丁。
iOS 13.4.5 Beta补丁
以下是iOS 13.4.5 beta上的堆溢出漏洞修补程序。
如果-[MFMutableData _mapMutableData]返回false,则函数-[MFMutableData appendBytes:length:]引发异常。
为了查看何时[[MFMutableData _mapMutableData]返回false,让我们看一下它是如何实现的:
当mmap失败时,它返回False,但仍分配一个8字节的块并将指针存储在self-> bytes中。此修补程序在将数据复制到self-> bytes之前引发异常,从而部分解决了堆溢出问题。
-[MFMutableData appendData:] | +-- -[MFMutableData appendBytes:length:] ** | +-- -[MFMutableData _mapMutableData]
该修补程序确保在-[MFMutableData appendBytes:length:]内部引发异常。但是,还有其他函数调用-[MFMutableData _mapMutableData]并与self-> bytes交互,如果mmap失败,则将是8字节的块,这些函数不会检查mmap是否失败,因为补丁只会影响-[MFMutableData appendBytes:length:]。
以下是从MobileMail获取的实际回溯:
* frame #0: 0x000000022a0fd018 MIME`-[MFMutableData _mapMutableData:] frame #1: 0x000000022a0fc2cc MIME`-[MFMutableData bytes] + 108 frame #2: 0x000000022a0fc314 MIME`-[MFMutableData mutableBytes] + 52 frame #3: 0x000000022a0f091c MIME`_MappedAllocatorAllocate + 76 frame #4: 0x0000000218cd4e9c CoreFoundation`_CFRuntimeCreateInstance + 324 frame #5: 0x0000000218cee5c4 CoreFoundation`__CFStringCreateImmutableFunnel3 + 1908 frame #6: 0x0000000218ceeb04 CoreFoundation`CFStringCreateWithBytes + 44 frame #7: 0x000000022a0eab94 MIME`_MFCreateStringWithBytes + 80 frame #8: 0x000000022a0eb3a8 MIME`_filter_checkASCII + 84 frame #9: 0x000000022a0ea7b4 MIME`MFCreateStringWithBytes + 136
-[MFMutableData mutableBytes]|+-- -[MFMutableData bytes] | +-- -[MFMutableData _mapMutableData:]
由于mutableBytes返回的字节通常被认为是可修改的,具体请参见Apple的文档(https://developer.apple.com/documentation/foundation/nsmutabledata/1410770-mutablebytes):
此属性类似于但不同于bytes属性。bytes属性包含一个指向常量的指针。您可以使用字节指针读取由数据对象管理的数据,但不能修改该数据。但是,如果mutableBytes属性包含非null指针,则此指针指向可变数据。您可以使用mutableBytes指针来修改由数据对象管理的数据。
苹果的文档
如果mmap失败,则[[MFMutableData mutableBytes]和-[MFMutableData bytes]都将返回self-> bytes指向8字节的块,这在某些情况下可能导致堆溢出。
以下是一个如何出错的示例,即使在memcpy之前检查了长度,堆仍然会发生溢出:
size_t length = 0x30000;MFMutableData* mdata = [MFMutableData alloc];data = malloc(length);[mdata initWithBytesNoCopy:data length:length]; size_t mdata_len = [mdata length];char* mbytes = [mdata mutableBytes];//mbytes could be a 8-bytes chunksize_t new_data_len = 90;char* new_data = malloc(new_data_len);if (new_data_len <= mdata_len) { memcpy(mbytes, new_data, new_data_len);//heap overflow if mmap fails}
iOS 13.5补丁
在iOS 13.5修补程序之后,mmap失败并且紧接着不再返回8字节的块之后,“-[MFMutableData _mapMutableData]”中引发了异常。这种方法可以完全解决该问题。
概要
iOS 13.5修补程序是修补堆溢出漏洞的正确方法。仔细检查安全补丁并确认补丁已完成很重要。
在ZecOps,我们帮助开发人员发现安全漏洞,并验证问题是否已自动正确解决。如果您想在您的应用程序/程序中找到类似的漏洞,我们现在将其他用户添加到我们的CrashOps SDK beta程序中(https://www.crashops.com/)。 如果您没有应用程序,并且想检查手机是否存在可疑活动,请查看ZecOps iOS DFIR解决方案(https://zecops.com/solutions/gluon.html)– Gluon。
本文翻译自:https://blog.zecops.com/vulnerabilities/hidden-demons-maildemon-patch-analysis-ios-13-4-5-beta-vs-ios-13-5/