标注的博客| 安全研究| 渗透测试| APT

首页

ios/osx漏洞的分析与再现:cve

作者 zackey 时间 2020-04-01
all

iOS 12.1.4是2019年2月8日发布的最新版本的iOS。此版本修补了iOS上四个公开的漏洞。根据“零计划”的本·霍克斯(Ben Hawkes)在推特上发布的消息,其中至少有两个在野外被开采为零天。在ZecOps研究团队,我们非常希望能够分析和揭示这些修补漏洞的更多细节。

如果你有兴趣做类似的研究作为我们的反向赏金计划的一部分-你可以在这里注册。

如果你认为你已经成为目标,请联系ZecOps APT事件响应小组。

TL;博士:

分析CVE-2019-7286

根据苹果的描述:

基础设施可用于:iPhone 5s及更高版本、iPad Air及更高版本和iPod touch第6代影响:应用程序可能获得更高的权限描述:通过改进输入验证解决了内存损坏问题。CVE-2019-7286:匿名研究员,谷歌威胁分析组的克莱门特·莱基涅,谷歌的伊恩·比尔零项目和谷歌零项目的塞缪尔·格罗

除了这个漏洞是在苹果的基础框架中修补的,这个描述并没有为我们提供很多关于这个漏洞本质的细节。

在分析了Foundation framework中的补丁后,二进制diffing显示iOS 12.1.4的二进制文件与ios12.1.3的二进制文件相比没有明显的变化。下一个直接的嫌疑犯是corefundation,它显示了dephera工具中的一些二进制差异,如下所示:

通过比较这些补丁,我们发现CFPrefs守护进程(cfprefsd)的实现有一些细微的变化。

此后台程序的手册页不太具有描述性:

cfprefsd为CFPreferences和NSUserDefaults api提供首选项服务。没有手动cfprefsd的配置选项。

CFPreferences选项几乎在iOS/OS X上的每一个软件启动时都会使用,因此这个守护进程中的漏洞也可能有助于保持持久性。令人惊讶的是,目前还没有关于这一CVE的公开信息,正如人们从一个在野外被积极利用的漏洞可以预料到的那样。

斑块分析

同样的错误也出现在OSX上,这有助于ZecOps的调查和分析。在修补时,cfprefsd中引入了一些小的更改,但似乎最重要的修改是在以下函数中进行的:

[CFPrefsDaemon handleMultiMessage:replyHandler:]

下面是ZecOps试图重建原始Obj-C代码和补丁(粗体)的片段:

漏洞详细信息

handleMultiMessage:replyHandler:使用xpc请求中的“CFPreferencesMessages”数组时出现引用计数问题。

函数使用xpc_array_get_value将数组的对象逐个读取到内存缓冲区中,这不会影响引用计数。释放缓冲区中所有元素的函数的最后一部分假定xpc对象的所有权。这通常是正确的,因为回调块调用xpc_retain并替换xpc_缓冲区中的原始对象。但是,如果回调不是作为精心编制的消息的结果调用的(消息正文包含消息的处理程序索引)。并非所有处理程序都调用回调),将出现元素的double free。

具有以下键和值的XPC将触发此漏洞:

如果回调没有更新XPC_缓冲区[count],苹果的补丁将原来的XPC对象替换为XPC_null。因此,当xpc_null没有内存可释放时,不存在双重空闲条件。

脆弱性再现

我们能够使用以下POC代码片段重现CVE-2019-7286:

在iOS 12.0.1上运行上述程序导致cfprefsd崩溃:

建议

如果您喜欢做类似的分析/研究,我们将接受更多的研究人员和分析师加入我们的反向奖励计划。

77a10d1b745bc3e943a5ee45544c762021892a30