0x00 摘要

tpwn是国外安全研究人员基于在Yousemite上发现的两个0day做的漏洞利用。目前影响的系统主要是Mac OSX 10.10.5及以下的系统版本。透过这个利用可以看出目前针对这一类漏洞的利用的方式以及利用的基本原理。

0x01 漏洞分析

0xAA IOServiceOpen参数缺少检查

通过查看IOKitUser-1050.20.2xnu-2782.40.9代码, 可以知道IOServiceOpen的工作流程如下图所示:

<strong>pic1:</strong> IOServiceOpen Workflow

在函数is_io_service_open_extended中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
kern_return_t is_io_service_open_extended(
io_object_t _service,
task_t owningTask,
uint32_t connect_type,
NDR_record_t ndr,
io_buf_ptr_t properties,
mach_msg_type_number_t propertiesCnt,
kern_return_t * result,
io_object_t *connection )
{
IOUserClient * client = 0;
kern_return_t err = KERN_SUCCESS;
IOReturn res = kIOReturnSuccess;
OSDictionary * propertiesDict = 0;
bool crossEndian;
bool disallowAccess;

CHECK( IOService, _service, service );

...

res = service->newUserClient( owningTask, (void *) owningTask,
connect_type, propertiesDict, &client );

...

}

由于没检查owningTask的值的合法性, 就直接传递给了service。如果此时某个驱动中的IOService没有检查owningTask的有效性, 当用户传入NULL的时候, 可能会使内核驱动崩溃进而导致空指针利用。

0xBB IOHDIXController参数缺少检查

从pic1中, 可以得知IOService:: newUserClient中会调用如下的函数:

1.virtual bool initWithTask(
               task_t owningTask, 
               void * securityToken, UInt32 type,
               OSDictionary * properties);
   2. virtual bool attach( IOService * provider )
   3. virtual bool start( IOService * provider );

这些函数一般会被第三方驱动程序调用和覆盖。 如果在编写代码的时候, 没有正确的处理, 那么会导致空指针引用。一般来说,常见的空指针引用代码如下:

1
2
int *ptr = NULL;
ptr = 5;

结合代码IOService::newUserClient函数看, 未做安全检查的参数可能会被传递进initWithTask函数中, 并且作为initWithTask函数第一个和第二个参数。因此, 重点检查initWithTask函数是否正确处理其的第一个和第二个参数, 如果没有做安全检查, 直接使用将会造成系统panic。

Yousemite 10.10.5中的IOHDIXController驱动有如下的代码片段:

pic2: IOHDIXController::initWithTask

IOHDIXController::initWithTask将未做检查的第二个参数(存储在r14中), 直接传递给了内核函数bsd_set_dependency_capable。

pic3: bsd_set_dependency_capable

通过查看代码, 发现在函数get_bsdtask_info中发生了空指针引用。出问题的代码可以看做如下的形态:

1
2
proc_t p = task->bsd_info;		//task is null, os will panic
p->p_flag |= 0x10;

综上所述, 因为IOServiceOpen没有检查传入owningTaks的有效性, 导致IOHDIXController:: initWithTask中发生空指针引用,造成系统panic。

0x05 引用

  1. 作者博客:http://blog.qwertyoruiop.com/?p=69
  2. 360Nirvan团队分析:http://nirvan.360.cn/blog/?p=469