在Linux内核中,修复了以下漏洞: driver core:修复uevent_show() vs driver detach race uevent_show() wants to de-reference dev->driver->name. 没有干净的地方 way for a 设备 attribute to de-reference dev->driver unless that 属性通过(struct 设备_driver)定义.dev_groups. 相反, 在属性处理程序中使用设备_lock()的反模式存在风险 带有代码路径的死锁,在保持时删除设备属性 锁. 给定设备_lock(),此死锁通常对lockdeep不可见。 标记为lockdep_set_novalidate_class(),但有些子系统分配一个 local lockdep key for @dev->mutex to reveal reports of the form: ====================================================== 警告:检测到可能的循环锁定依赖 6.10.0-rc7+ #275污染:goe N ------------------------------------------------------ Modprobe /2374正在尝试获取锁: ffff8c2270070de0 (kn->active#6){++++}-{0:0}, at: x220 __kernfs_remove + 0 xde / 0 但任务已经锁定: ffff8c22016e88f8 (&cxl_root_key) {+.+.}-{3:3}, at: 设备_release_driver_internal+0x39/0x210 哪个锁已经依赖于新锁. 现有的依赖链(以相反的顺序)是: -> #1 (&cxl_root_key) {+.+.}-{3:3}: __mutex_lock + 0 x99/0xc30 x130 uevent_show + 0 xac / 0 dev_attr_show + 0 x18/0x40 sysfs_kf_seq_show + 0 0 xf0 xac / seq_read_iter + 0 x110/0x450 x340 vfs_read + 0 x25b / 0 ksys_read + 0 x67/0xf0 do_syscall_64 + 0 x75/0x190 entry_SYSCALL_64_after_hwframe + 0 x76/0x7e -> #0 (kn->active#6){++++}-{0:0}: x1fa0 __lock_acquire + 0 x121a / 0 lock_acquire + 0 xd6/0x2e0 kernfs_drain + 0 x1e9/0x200 x220 __kernfs_remove + 0 xde / 0 xa0 kernfs_remove_by_name_ns + 0 x5e / 0 设备_del + 0 x168/0x410 设备_unregister + 0 x13/0x60 devres_release_all + 0 xb8/0x110 x70 设备_unbind_cleanup + 0 xe / 0 设备_release_driver_internal + 0 x1c7/0x210 driver_detach + 0 x47/0x90 bus_remove_driver + 0 0 xf0 x6c / cxl_acpi_exit + 0 xc / 0 x11 [cxl_acpi] __do_sys_delete_module.伊斯拉.0+0x181/0x260 do_syscall_64 + 0 x75/0x190 entry_SYSCALL_64_after_hwframe + 0 x76/0x7e 但观察到的是,驱动对象通常要长得多 驻留的非设备对象. 执行无锁是合理的 取消@driver指针的引用,即使它正在从 设备. 鉴于驱动程序注销的频率不高,使用 module_remove_driver()中的Synchronize_rcu()关闭任何潜在的 比赛. 如果让synchronize_rcu()只是为了 处理罕见的模块移除竞赛uevent_show()事件. 感谢Tetsuo H和a对syzbot报告的调试分析[1].
使用Rapid7实时仪表板, 我对我的网络上的所有资产都有一个清晰的视图, 哪些是可以利用的, 以及我需要做些什么来实时减少环境中的风险. 没有其他工具能给我们这样的价值和洞察力.
- Scott Cheney, Sierra View医疗中心信息安全经理