iOSmacOS Safari QuartzCore堆溢出漏洞导致沙箱逃逸
漏洞摘要
QuartzCore,也被称为CoreAnimation,是macOS和iOS使用的一个框架,用于构建动画场景图。CoreAnimation使用独特的渲染模型,其中grapohics操作在单独的进程中运行。在macOS环境中,其进程名称为WindowServer。在iOS环境中,其进程名称为backboardd。这两个进程都位于沙箱之外,并且有权调用setuid。服务名称QuartzCore通常被称为CARenderServer,该服务存在于macOS和iOS中,可以从Safarisandbox访问,因此被广泛在Pwn2Own中利用。在最新版本的macOS和iOS系统中,存在整数溢出漏洞,该漏洞可能会导致QuartzCore发生堆溢出问题。
厂商回应
· CoreAnimation影响:应用程序可能会使用系统权限执行任意代码。
· 说明:内存损坏漏洞,通过改进内存处理过程实现修复。
· 来源:由Beyond Security的SecuriTeam报告此漏洞。
· CVE编号:CVE-2018-4415
· 致谢:一位独立的安全研究员
· 受影响的系统:macOS 10.14、iOS 12.0.1
漏洞详细信息
这个漏洞的根本原因在于QuartzCore`CA::Render::InterpolatedFunction::InterpolatedFunction函数,该函数没有关注到整数溢出的问题。在本文中,将重点讨论macOS和iOS上关于此漏洞的详细信息。
macOS 10.14
在macOS上,有一个非常实用的API,用来打开名为CGSCreateLayerContext的CARenderService(该API在iOS上不存在)。攻击者可以使用ID为0x9C42或0x9C43向服务端口发送消息。当进程(server_thread)收到指定消息ID的消息时,会进入到反序列化的过程。在提供适当的数据后,执行流将会进入函数CA::Render::InterpolatedFunction::InterpolatedFunction中。
需要注意的是,(a)和(b)这两个成员的值可以由攻击者控制(CA使用诸如CA::Render::Decoder::decode*来反序列化对象),并且在CA::Render::InterpolatedFunction::allocate_storage函数中,这些值将用于决定要分配的内存的大小。
在(d)中,v3由(a)和(b)的值控制。并且(e)处的v4也可以由(c)处的攻击者控制。所以要分配的内存大小是4 * (v4 + v3)。但仔细观察(f),其传递给CA::Render::Decoder::decode_bytes的第三个参数实际上是4 * v3。(f)中的CA::Render::Decoder::decode_bytes的最简单形式,类似于memcpy(v2, v8, 4 * v3)或memset(v2, 0, 4 * v3)。因此,当4 * (v4 + v3)发生溢出并且4 * v3不溢出时,就会发生整数溢出导致的堆溢出。在本文的漏洞利用部分,可以具体查看能够成功导致整数溢出的攻击者控制值。
在macOS环境中,要复现此漏洞,可按照如下步骤进行:
1. clang QuartzCoreFunctionIntOverFlow.c –o
quartz_core_function_over_flow -framework CoreGraphics
2. ./quartz_core_function_over_flow
1 Thread 0 Crashed:: Dispatch queue: com.apple.main−thread
com.apple.CoreFoundation 0x00007fff332e2daf __CFBasicHashAddValue + 2077
com.apple.CoreFoundation 0x00007fff332e33f5 CFDictionarySetValue + 187
com.apple.SkyLight 0x00007fff595ebfa9 CGXPostPortNotification + 123
com.apple.SkyLight 0x00007fff595eb947 notify_handler + 73
com.apple.SkyLight 0x00007fff595eb2d9 post_port_data + 237
com.apple.SkyLight 0x00007fff595eafba run_one_server_pass + 949
com.apple.SkyLight 0x00007fff595eab90 CGXRunOneServicesPass + 460
com.apple.SkyLight 0x00007fff595eb820 server_loop + 96
com.apple.SkyLight 0x00007fff595eb7b5 SLXServer + 1153
WindowServer 0x000000010011d4c4 0x10011c000 + 5316
libdyld.dylib 0x00007fff6036ced5 start + 1
Thread 2:: com.apple.coreanimation.render−server // CARenderServer thread
libsystem_platform.dylib 0x00007fff6056ce09 _platform_bzero$VARIANT$Haswell
+ 41
com.apple.QuartzCore 0x00007fff3e8ebaa4 CA::Render::Decoder::
decode_bytes(void*, unsigned long) + 46
com.apple.QuartzCore 0x00007fff3e8c35f7 CA::Render::InterpolatedFunction
::InterpolatedFunction(CA::Render::Decoder*) + 191
com.apple.QuartzCore 0x00007fff3e8c3524 CA::Render::Function::decode(CA
::Render::Decoder*) + 224
com.apple.QuartzCore 0x00007fff3e8ecb8a CA::Render::Decoder::
decode_object(CA::Render::Type) + 946
com.apple.QuartzCore 0x00007fff3e8edc8e CA::Render::decode_commands(CA::
Render::Decoder*) + 871
com.apple.QuartzCore 0x00007fff3e896422 CA::Render::Server::
ReceivedMessage::run_command_stream() + 748
com.apple.QuartzCore 0x00007fff3e73d2e1 CA::Render::Server::
server_thread(void*) + 1841
com.apple.QuartzCore 0x00007fff3e91427c thread_fun(void*) + 25
libsystem_pthread.dylib 0x00007fff60572795 _pthread_body + 159
libsystem_pthread.dylib 0x00007fff605726e2 _pthread_start + 70
libsystem_pthread.dylib 0x00007fff605722a9 thread_start + 13
iOS 12.0.1
由于这一漏洞成因非常明显,因此针对iOS的代码与macOS的代码几乎相同。在这一章中,我们仅讨论iOS和macOS之间的不同之处。
1. 在macOS上,没有例如CGSCreateLayerContext这样的API,可以直接获取CoreAnimation渲染上下文,但通过深入研究,我们发现MIG函数_XRegisterClient可以用来替换CGSCreateLayerContext。首先,攻击者打开服务com.apple.CARenderServer(可以从沙箱访问),然后通过mach_msg调用消息ID为40202的_XRegisterClient。
漏洞摘要
QuartzCore,也被称为CoreAnimation,是macOS和iOS使用的一个框架,用于构建动画场景图。CoreAnimation使用独特的渲染模型,其中grapohics操作在单独的进程中运行。在macOS环境中,其进程名称为WindowServer。在iOS环境中,其进程名称为backboardd。这两个进程都位于沙箱之外,并且有权调用setuid。服务名称QuartzCore通常被称为CARenderServer,该服务存在于macOS和iOS中,可以从Safarisandbox访问,因此被广泛在Pwn2Own中利用。在最新版本的macOS和iOS系统中,存在整数溢出漏洞,该漏洞可能会导致QuartzCore发生堆溢出问题。
厂商回应
· CoreAnimation影响:应用程序可能会使用系统权限执行任意代码。
· 说明:内存损坏漏洞,通过改进内存处理过程实现修复。
· 来源:由Beyond Security的SecuriTeam报告此漏洞。
· CVE编号:CVE-2018-4415
· 致谢:一位独立的安全研究员
· 受影响的系统:macOS 10.14、iOS 12.0.1
漏洞详细信息
这个漏洞的根本原因在于QuartzCore`CA::Render::InterpolatedFunction::InterpolatedFunction函数,该函数没有关注到整数溢出的问题。在本文中,将重点讨论macOS和iOS上关于此漏洞的详细信息。
macOS 10.14
在macOS上,有一个非常实用的API,用来打开名为CGSCreateLayerContext的CARenderService(该API在iOS上不存在)。攻击者可以使用ID为0x9C42或0x9C43向服务端口发送消息。当进程(server_thread)收到指定消息ID的消息时,会进入到反序列化的过程。在提供适当的数据后,执行流将会进入函数CA::Render::InterpolatedFunction::InterpolatedFunction中。
需要注意的是,(a)和(b)这两个成员的值可以由攻击者控制(CA使用诸如CA::Render::Decoder::decode*来反序列化对象),并且在CA::Render::InterpolatedFunction::allocate_storage函数中,这些值将用于决定要分配的内存的大小。
在(d)中,v3由(a)和(b)的值控制。并且(e)处的v4也可以由(c)处的攻击者控制。所以要分配的内存大小是4 * (v4 + v3)。但仔细观察(f),其传递给CA::Render::Decoder::decode_bytes的第三个参数实际上是4 * v3。(f)中的CA::Render::Decoder::decode_bytes的最简单形式,类似于memcpy(v2, v8, 4 * v3)或memset(v2, 0, 4 * v3)。因此,当4 * (v4 + v3)发生溢出并且4 * v3不溢出时,就会发生整数溢出导致的堆溢出。在本文的漏洞利用部分,可以具体查看能够成功导致整数溢出的攻击者控制值。
www.wnhack.com
在macOS环境中,要复现此漏洞,可按照如下步骤进行:
1. clang QuartzCoreFunctionIntOverFlow.c –o
quartz_core_function_over_flow -framework CoreGraphics
2. ./quartz_core_function_over_flow
1 Thread 0 Crashed:: Dispatch queue: com.apple.main−thread
com.apple.CoreFoundation 0x00007fff332e2daf __CFBasicHashAddValue + 2077
com.apple.CoreFoundation 0x00007fff332e33f5 CFDictionarySetValue + 187
com.apple.SkyLight 0x00007fff595ebfa9 CGXPostPortNotification + 123
com.apple.SkyLight 0x00007fff595eb947 notify_handler + 73
com.apple.SkyLight 0x00007fff595eb2d9 post_port_data + 237
com.apple.SkyLight 0x00007fff595eafba run_one_server_pass + 949
com.apple.SkyLight 0x00007fff595eab90 CGXRunOneServicesPass + 460
com.apple.SkyLight 0x00007fff595eb820 server_loop + 96
com.apple.SkyLight 0x00007fff595eb7b5 SLXServer + 1153
WindowServer 0x000000010011d4c4 0x10011c000 + 5316
libdyld.dylib 0x00007fff6036ced5 start + 1
Thread 2:: com.apple.coreanimation.render−server // CARenderServer thread 内容来自无奈安全网
libsystem_platform.dylib 0x00007fff6056ce09 _platform_bzero$VARIANT$Haswell
+ 41
com.apple.QuartzCore 0x00007fff3e8ebaa4 CA::Render::Decoder::
decode_bytes(void*, unsigned long) + 46
com.apple.QuartzCore 0x00007fff3e8c35f7 CA::Render::InterpolatedFunction
::InterpolatedFunction(CA::Render::Decoder*) + 191
com.apple.QuartzCore 0x00007fff3e8c3524 CA::Render::Function::decode(CA
::Render::Decoder*) + 224
com.apple.QuartzCore 0x00007fff3e8ecb8a CA::Render::Decoder::
decode_object(CA::Render::Type) + 946
com.apple.QuartzCore 0x00007fff3e8edc8e CA::Render::decode_commands(CA::
Render::Decoder*) + 871
com.apple.QuartzCore 0x00007fff3e896422 CA::Render::Server::
ReceivedMessage::run_command_stream() + 748
com.apple.QuartzCore 0x00007fff3e73d2e1 CA::Render::Server::
server_thread(void*) + 1841
com.apple.QuartzCore 0x00007fff3e91427c thread_fun(void*) + 25
libsystem_pthread.dylib 0x00007fff60572795 _pthread_body + 159
libsystem_pthread.dylib 0x00007fff605726e2 _pthread_start + 70
copyright 无奈人生
libsystem_pthread.dylib 0x00007fff605722a9 thread_start + 13
iOS 12.0.1
由于这一漏洞成因非常明显,因此针对iOS的代码与macOS的代码几乎相同。在这一章中,我们仅讨论iOS和macOS之间的不同之处。
1. 在macOS上,没有例如CGSCreateLayerContext这样的API,可以直接获取CoreAnimation渲染上下文,但通过深入研究,我们发现MIG函数_XRegisterClient可以用来替换CGSCreateLayerContext。首先,攻击者打开服务com.apple.CARenderServer(可以从沙箱访问),然后通过mach_msg调用消息ID为40202的_XRegisterClient。