研究人员在macOS、iOS和iPadOS的CVM服务器中发现1个安全漏洞。
研究人员在CVM服务器(Core Virtual Machine Server,核心虚拟机服务器)中发现一个安全漏洞,漏洞CVE编号为CVE-2021-30724,攻击者利用该漏洞可以进行权限提升。受影响的设备包括运行macOS Big Sur 11.4、iOS 14.6和 iPadOS 14.6的设备。
CVMServer
CVMServer是XPC服务和以root运行的处理XPC请求的系统daemon。XPC是苹果实现的负责不同进程之间通信的低级通信机制。客户端通过XPC相关的API来发送XPC请求消息。然后,服务器会接收消息并处理。其中最常使用的客户端是用OpenCL框架编写的。其主要逻辑是使用switch结构来处理不同类型的XPC消息。图1是CVMServer switch结构逻辑的示例:
图1. CVMServer switch结构处理消息逻辑示例
CVE-2021-30724漏洞
该问题存在于XPC请求消息处理器中,具体来说是使用OpenCL源码来处理请求(case msgType=18)构造元素的过程中。
图2. CVMServer Case 18 逻辑
图2是存在漏洞的逻辑,item[3*count]是映射长度,会从xpc_shmem_map返回。同时,beginOffset是由XPC请求消息控制的(135行)。如果item[3*count]的值小于beginOffset,那么根据case 18的逻辑,remainLen的值就会出现整数溢出。引发144行的检查被绕过。因此,该漏洞可以通过指定item[count]=accessDataLen 为一个大整数的方式来触发,引发越界内存访问和潜在的权限提升。
漏洞触发
如图1所示,flag context->attached是在case 4中设置的。也就是说,要发送请求(case msgType=18),CVMS服务必须被附加,而且XPC请求msgType=4也要被发送。要发送XPC请求给服务,首先要建立连接。通过搜索到API调用_xpc_connection_create_mach_service的交叉引用,研究人员发现了一个名为com.apple.cvmsServ的服务,然后就可以建立了连接。
然后,就可以附加上服务和通过调试获得的参数。
在添加了CVMS服务和发送XPC请求msgType=4后,就可以发送请求存在漏洞的请求(case msgType=18)。为更好地帮助大家理解,研究人员给出了XPC消息结构图,如图3所示。
从97到105行,可以看到request[“source”]是一个XPC数组,其中保存了源码数据列表。第108行,每个数组项被分配了32字节的数据。
图3. source_data_array布局
111行到156行的do-while循环用每个数据源值填充了数组项。数据源值的类型是xpc_type_data或xpc_type_shmem。这里的逻辑表明地址范围[accessBeginPointer, accessBeginPointer+accessDataLength)必须是[mappedBaseAddress, mappedBaseAddress+mappedLength)的子集。然后会检查accessDataLength值是否小于mappedLength减去beginOffset值。要触发该漏洞就必须要绕过该检查。这些值都可以通过XPC请求消息来控制。
在第138行,有一个beginOffset值的检查,必须小于4k。但是从xpc_shmem_map 返回的mappedLength一般会被设置为4k。这就触发了该漏洞。
然后就可以绕过通过整数溢出的方式来绕过144行的检查,即通过指定大数值的方式触发越界内存访问。触发代码如图5所示。
图4. MappedLength被修改为更小的值
图5. 漏洞触发代码
完整PoC参见GitHub:https://gist.github.com/jhftss/1bdb0f8340bfd56f7f645c080e094a8b
本文翻译自:https://www.trendmicro.com/en_us/research/21/f/CVE-2021-30724_CVMServer_Vulnerability_in_macOS_and_iOS.html如若转载,请注明原文地址