CVE-2025-71079CVE-2025-71079是Linux内核中NFC(近场通信)子系统的一个本地死锁漏洞,CVSS评分为5.5(中危)。该漏洞源于nfc_unregister_device()函数与rfkill_fop_write()之间存在的锁顺序反转问题,形成经典的ABBA死锁场景。具体而言,当一个线程执行设备注销操作时持有device_lock,而尝试获取rfkill_global_mutex;同时另一个线程持有rfkill_global_mutex并通过回调尝试获取device_lock,导致两个线程相互等待永久阻塞。此漏洞影响系统的可用性,可能导致内核恐慌或系统冻结。由于攻击向量为本地且需要低权限,主要威胁场景为本地恶意程序或特权提升后的攻击行为。
该漏洞是典型的内核并发控制死锁问题。在Linux内核的NFC子系统中,存在两个关键的同步机制:device_lock(设备锁)和rfkill_global_mutex(射频kill全局互斥锁)。
死锁形成路径如下:
线程A(rfkill操作路径):rfkill_fop_write() -> mutex_lock(&rfkill_global_mutex) -> rfkill_set_block() -> nfc_rfkill_set_block() -> nfc_dev_down() -> device_lock(&dev->dev),此时线程A等待获取device_lock。
线程B(设备注销路径):nfc_unregister_device() -> device_lock(&dev->dev) -> rfkill_unregister() -> mutex_lock(&rfkill_global_mutex),此时线程B等待获取rfkill_global_mutex。
修复方案将rfkill_unregister()和rfkill_destroy()调用移出device_lock临界区。具体做法是:在持有device_lock期间先将rfkill指针保存到局部变量,释放device_lock后再调用rfkill_unregister()。这种做法是安全的,因为rfkill_fop_write()在持有rfkill_global_mutex期间调用回调函数,而rfkill_unregister()也会获取rfkill_global_mutex进行清理,因此可以确保任何进行中的回调都会在rfkill_unregister()继续之前完成,避免了use-after-free问题。