exportObjectToClient 函数中的内核栈信息泄露
漏洞详情:
macOS<=10.14.3 && iOS < 12.2
在 IOKit 类的 exportObjectToClient 函数中存在一个漏洞,可导致内核栈的 4 字节信息泄露。 exportObjectToClient 正如其名,它使任意 OSObject 对客户端任务可用。这是一个基础函数,许多其他内核函数都会使用它。
IOReturn IOUserClient::exportObjectToClient(task_t task, OSObject *obj, io_object_t *clientObj)
{
mach_port_name_t name; name = IOMachPort::makeSendRightForTask( task, obj, IKOT_IOKIT_OBJECT );
*(mach_port_name_t *)clientObj = name; // (1). force the type convert to mach_port_name_t
if (obj) obj->release();
return kIOReturnSuccess;
}
我们知道 io_object_t 长度为 8 字节,而在 (1) 处被强制转换为 mach_port_name_t(4 字节),因此导致高 4 字节未初始化。