为什么IOKit会在lck_mtx_lock / lck_mtx_unlock之后导致竞争条件

时间:2016-11-21 05:47:21

标签: security race-condition iokit

在userland中使用iokit对象句柄执行某些操作时,例如IOConnectCallmethod

通过mach_msg(Mach_trap,

之一)进入内核

(与其他MIG电话相同) - >在调用is_io_connect_method之前的util,有一个将ipc_port转换为iokit对象的操作

connection = iokit_lookup_connect_port(In0P->Head.msgh_request_port);

和iokit_lookup_connect_port里面:

MIGEXTERN io_object_t
iokit_lookup_connect_port( ipc_port_t   port){
register io_object_t    obj;

if (!IP_VALID(port))
    return (NULL);

iokit_lock_port(port);
if (ip_active(port) && (ip_kotype(port) == IKOT_IOKIT_CONNECT)) {
    obj = (io_object_t) port->ip_kobject;
    iokit_add_connect_reference( obj );
}
else
    obj = NULL;

iokit_unlock_port(port);

return( obj );
}

每次成功通话都必须调用iokit_lock_port和iokit_unlock_port

EXTERN void
iokit_lock_port( __unused ipc_port_t port )
{
    lck_mtx_lock(&iokit_obj_to_port_binding_lock);
}

EXTERN void
iokit_unlock_port( __unused ipc_port_t port )
{
    lck_mtx_unlock(&iokit_obj_to_port_binding_lock);
}

但是为什么即使调用相同的IOKit方法仍会导致竞争条件?

我试过如果我在IOKit方法中添加锁代码,或者在竞争条件的方法之前,锁可以保护成功, 但为什么锁定iokit_lock_port / iokit_unlock_port不能?

0 个答案:

没有答案