
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バイトが初期化されずに漏洩します。