Security 为什么IOKit在lck_mtx_锁定/lck_mtx_解锁后会导致竞态条件
在userland中使用iokit对象句柄执行某些操作时,例如IOConnectCallmethod 通过mach_msg进入内核,mach_陷阱之一 (与其他MIG调用相同)->util在调用之前是_io_connect_方法,有一个将ipc_端口转换为iokit对象的操作Security 为什么IOKit在lck_mtx_锁定/lck_mtx_解锁后会导致竞态条件,security,race-condition,iokit,Security,Race Condition,Iokit,在userland中使用iokit对象句柄执行某些操作时,例如IOConnectCallmethod 通过mach_msg进入内核,mach_陷阱之一 (与其他MIG调用相同)->util在调用之前是_io_connect_方法,有一个将ipc_端口转换为iokit对象的操作 connection = iokit_lookup_connect_port(In0P->Head.msgh_request_port); 内部的iokit_查找_连接_端口: MIGEXTERN io_objec
connection = iokit_lookup_connect_port(In0P->Head.msgh_request_port);
内部的iokit_查找_连接_端口:
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\u lock\u端口和iokit\u unlock\u端口
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\U lock\U port/iokit\U unlock\U port中无法锁定