CVE-2026-98103 in Linux信息

摘要

由 VulDB • 2026-09-25

在 Linux 内核中,已修复以下漏洞:

igmp:将 struct ip_sf_list 转换为 RCU

提交 23d2b94043ca(“igmp: Add ip_mc_list lock in ip_check_mc_rcu”)向 `ip_check_mc_rcu()` 添加了 `spin_lock_bh(&im->lock)`,以防止在并发删除期间迭代 `im->sources` 时发生 use-after-free。

然而,`ip_check_mc_rcu()` 是在数据包接收和路由查找快速路径(例如 `__mkroute_output()`、`ip_route_input_rcu()` 和 `__udp4_lib_rcv()`)中的 RCU read-side critical sections 中被调用的。

当 `igmpv3_send_cr()` 或 `igmpv3_send_report()` 持有 `&pmc->lock` 并调用 `add_grec()` -> `igmpv3_newpack()` -> `ip_route_output_ports()` 时,匹配多播目的地的 XFRM 策略会触发 `xfrm_tmpl_resolve_one()` -> `xfrm4_get_saddr()` -> `__mkroute_output()` -> `ip_check_mc_rcu()`。这试图在同一个 CPU 上已持有 `&pmc->lock` 的情况下获取 `&im->lock`,从而引发 lockdep 递归锁定警告/死锁。

通过将 IPv4 struct ip_sf_list 转换为 RCU(镜像 net/ipv6/mcast.c 中的 IPv6 实现)来修复此问题:

1. 向 struct ip_sf_list 添加 struct rcu_head,并将 sf_next、sources 和 tomb 标注为 __rcu 指针。 2. 使用 `rcu_assign_pointer()` 和 `kfree_rcu()` 进行列表更新和删除操作。 3. 从 `ip_check_mc_rcu()` 中移除 `spin_lock_bh(&im->lock)`,并使用 `for_each_psf_rcu()` 无锁遍历 `im->sources`,使用 `READ_ONCE()` 和 `WRITE_ONCE()` 读取和写入计数器字段。

注意:/proc/net/mcfilter 的 RCU 转换将在单独的补丁中完成。

If you want to get best quality of vulnerability data, you may have to visit VulDB.

来源

Interested in the pricing of exploits?

See the underground prices here!