iOS 12.1.4是2019年2月8日发布的最新版本的iOS。此版本修补了iOS上四个公开的漏洞。根据“零计划”的本·霍克斯(Ben Hawkes)在推特上发布的消息,其中至少有两个在野外被开采为零天。在ZecOps研究团队,我们非常希望能够分析和揭示这些修补漏洞的更多细节。
如果你有兴趣做类似的研究作为我们的反向赏金计划的一部分-你可以在这里注册。
如果你认为你已经成为目标,请联系ZecOps APT事件响应小组。
TL;博士:
- CVE-2019-7286在野外开采
- 该漏洞似乎具有严重性,可能还用于在重新启动后保持持久性
- ZecOps能够重现此漏洞(下面是POC代码)
- 该漏洞可用于将权限升级为根权限,作为iOS 12.1.3越狱链的一部分。
分析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崩溃:
建议
- 更新至最新的OS X和iOS版本。
- 偶尔重启iPhone/ipad(例如每天一次)以消除非持久性攻击者的攻击
- 如果你认为你或你的公司是这里的APT集团的目标,请联系ZecOps。
如果您喜欢做类似的分析/研究,我们将接受更多的研究人员和分析师加入我们的反向奖励计划。
77a10d1b745bc3e943a5ee45544c762021892a30