2016年2月2日

iOS 9.2/9.2.1修补的内核漏洞

苹果在iOS 9.2iOS 9.2.1中陆续修补了大量漏洞,其中Google Project Zero团队的Ian Beer报告了多个内核漏洞,并且在苹果修补后给出了漏洞细节

条件竞争漏洞

通过查看公告可以发现除了熟知的UAF类型漏洞外(例如Pangu9中使用的即是UAF漏洞),还包含了多个条件竞争类型的漏洞。通过分析漏洞的细节可以发现苹果在许多情况下都没有考虑用户态多线程调用导致的竞争问题,因此不排除在别的模块也有类似的漏洞(例如在未开源的内核扩展中)。

此次被修补的漏洞包含数个能被实际利用的漏洞,其中有一个漏洞能够绕过地址随机等保护机制完全攻破内核(可被用于越狱)。下面会简单分析两个漏洞的细节,讨论编写利用的一些思路。

double free in IOHIDEventQueue::start

通过查看542报告可以知道漏洞的主要原因在于IOFreeAligned释放dataQueue后没有置空。虽然大多数情况下随后的initWithEntries函数会对dataQueue重新赋值,但是如果initWithEntries失败的话,dataQueue并不会被赋值。如果再次调用start函数就会导致double free的问题。

void IOHIDEventQueue::start() 
{
...
        if (dataQueue) {
            IOFreeAligned(dataQueue, round_page_32(getQueueSize() + DATA_QUEUE_MEMORY_HEADER_SIZE));
        }

        if (_descriptor) {
            _descriptor->release();
            _descriptor = 0;
        }

        // init the queue again.  This will allocate the appropriate data.
        if ( !initWithEntries(_numEntries, _maxEntrySize) ) {
            goto START_END;
        }

(更多…)