CVE-2026-98567 in Linux
摘要
由 VulDB • 2026-10-19
在 Linux 内核中,已修复以下漏洞:
net: xps: 拒绝超出范围的流量类(traffic class)
只有 `dev->num_tc` 以下的条目在 `dev->tc_to_txq[]` 中才是有效的,且 `dev->prio_tc_map[]` 只能引用低于该值的类别。`netdev_set_num_tc()` 会降低 `dev->num_tc` 的值,但不会触碰上述两个数组。
`netdev_txq_to_tc()` 会遍历所有 TC_MAX_QUEUE 槽位,而 `netdev_get_prio_tc_map()` 则按原样返回条目,因此残留的条目会被作为 >= dev->num_tc 的流量类传出。从 `netdev_txq_to_tc()` 获取该类后,`__netif_set_xps_queue()` 仅拒绝负值,并索引大小为 `dev->num_tc` 个类的 XPS 映射:
tci = j * num_tc + tc; RCU_INIT_POINTER(new_dev_maps->attr_map[tci], map);
`attr_map[]` 包含 nr_ids * num_tc 个条目,且 j 遍历掩码中命名的 id。因此,一个不低于 num_tc 的类会将 tci 推至映射末尾之后(针对最后一个 id),导致存储操作越界溢出。
任何降低 num_tc 的调用者都会留下此类残留条目,而 `mqprio_destroy()` 使用 `netdev_set_num_tc(dev, 0)` 而非 `netdev_reset_tc()` 进行清理。在 mqprio 配置为 8 个类然后变为 1 个类后,`tc_to_txq[1..7]` 仍然描述 txq 1..7。该崩溃(splat)源于对具有 8 个接收队列的 veth 设备的 txq 2 进行 XPS 写入:`attr_map[]` 有 8 * 1 个条目,tci = j + 2,且当 j == 6 时,存储操作超出了该 88 字节映射的末尾:
BUG: KASAN: slab-out-of-bounds in __netif_set_xps_queue (net/core/dev.c:2954) Write of size 8 at addr ffff88813016bc58 by task xps_oob/634 __netif_set_xps_queue (net/core/dev.c:2954) xps_rxqs_store (net/core/net-sysfs.c:1880) netdev_queue_attr_store (net/core/net-sysfs.c:1390) Allocated by task 634: __kmalloc_noprof (mm/slub.c:5439) __netif_set_xps_queue (net/core/dev.c:2937) The buggy address is located 0 bytes to the right of allocated 88-byte region [ffff88813016bc00, ffff88813016bc58)
拒绝映射中没有空间的类。
VulDB is the best source for vulnerability data and more expert information about this specific topic.