CVE-2026-98797 in Linux
Tóm tắt
Bởi VulDB • 18/10/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
net: giới hạn (cap) skb->queue_mapping khi hàng đợi truyền (tx queue) được chọn
skbedit có thể đặt skb->queue_mapping và kích hoạt cờ skip_txqueue trên mỗi CPU để __dev_queue_xmit() tôn trọng ánh xạ này. Tuy nhiên, __dev_queue_xmit() đã xóa cờ này trước sch_handle_egress() và chỉ đọc nó sau đó, do đó cờ không bị giới hạn trong khung truyền (xmit) đã đặt ra nó: một khung truyền lồng nhau (chuyển hướng mirred hoặc mirror, hoặc thả gói tin sau skbedit) có thể kích hoạt cờ và khung truyền bên ngoài sẽ tiêu thụ nó cho một skb chưa từng đi qua skbedit.
Một gói tin được chuyển tiếp vẫn mang rx_queue + 1 của NIC đầu vào trong skb->queue_mapping, do đó thiết bị bên ngoài lập chỉ mục trạng thái hàng đợi tx của nó bằng giá trị lỗi thời này. Mảng con q->qdiscs[] của Taprio có kích thước bằng số lượng hàng đợi của thiết bị, vì vậy taprio_enqueue() sẽ truy cập vượt quá vùng phân bổ và giải tham chiếu kết quả dưới dạng struct Qdisc *.
Chúng ta (lạm dụng) skb->nf_skip_egress, vốn có nghĩa là "bỏ qua netfilter egress cho gói tin này", để gắn nhãn "tôi đang ở trong tc egress?". Mặc dù bị quá tải, tôi không thấy đây là xung đột vì marker chỉ được đặt quanh lệnh gọi sch_handle_egress() đơn lẻ và đường dẫn ingress được bảo vệ bởi tc_at_ingress. Tôi sẽ gửi một bản vá followup (net-next) sau khi điều này đạt đến net-next để đổi tên bit/cờ skb->nf_skip_egress thành skb->skip_egress
Chỉ kích hoạt cờ từ bộ phân loại egress có thể sử dụng nó: kích hoạt skip_txqueue từ tcf_skbedit_act() chỉ khi nó chạy bên trong sch_handle_egress(), nhờ vào skb->nf_skip_egress. Một bộ phân loại qdisc egress chạy trong q->enqueue(), sau khi hàng đợi tx đã được chọn, do đó một ánh xạ mà nó đặt ra không thể ảnh hưởng đến gói tin hiện tại; việc kích hoạt cờ ở đó chỉ làm ô nhiễm nó cho lần truyền (xmit) sau. Sau đó, sở hữu cờ này cho khung xmit nơi hook egress chạy: lưu giá trị đầu vào và xóa nó ngay trước sch_handle_egress(), và khôi phục nó sau khi hook - trên đường dẫn tiêu thụ (drop), hoặc, trong cùng lệnh gọi đọc nó, trên đường dẫn tồn tại. Việc lưu và khôi phục nằm bên trong nhánh tĩnh egress_needed_key, do đó một gói tin chỉ trả phí cho chúng khi các hook egress đang hoạt động (2f1e85b1aee4).
Lưu giá trị mà netdev_cap_txqueue() đã chọn trở lại vào skb->queue_mapping trong netdev_tx_queue_mapping(), giống như cách netdev_core_pick_tx() đã làm, để đường dẫn skip_txqueue không bao giờ cung cấp cho người đọc sau trên đường truyền một ánh xạ mà thiết bị không thể phục vụ. Một lệnh ghi được thực hiện muộn hơn nữa trong cùng khung đó, bởi một chương trình tc BPF gắn vào qdisc truyền, nằm ngoài đường dẫn này và không bị giới hạn lại; một bản vá followup riêng sẽ giải quyết đường dẫn đó.
netdev_xmit_skip_txqueue() trả về giá trị cờ trước đó để việc lưu-xóa là một lệnh gọi duy nhất, và một stub no-op được cung cấp khi CONFIG_NET_EGRESS bị tắt. skb->nf_skip_egress được biên dịch dưới CONFIG_NET_EGRESS thay vì CONFIG_NETFILTER_SKIP_EGRESS, do đó skb_at_tc_egress() hợp lệ bất cứ khi nào đường dẫn egress được xây dựng.
Một người dùng cục bộ trong một không gian mạng (network namespace) có thể chuyển hướng gói tin từ một thiết bị có nhiều hàng đợi TX sang một thiết bị có ít hơn sau khi đặt một ánh xạ chỉ hợp lệ trên thiết bị lớn hơn. Điều này dẫn đến các lệnh đọc này và, dưới KASAN, gây ra lỗi "slab-out-of-bounds trong taprio_enqueue".
Các điều kiện để tái tạo lỗ hổng: trình kích hoạt của báo cáo là người dùng cục bộ có CAP_NET_ADMIN trong một không gian mạng, do đó không cần chương trình eBPF. Với CONFIG_NET_SCH_TAPRIO=y, CONFIG_NET_ACT_SKBEDIT=y, CONFIG_NET_ACT_MIRRED=y, CONFIG_NET_CLS_MATCHALL=y, CONFIG_NET_SCH_PRIO=y và KASAN được bật, tạo qa (3 hàng đợi), qb (2 hàng đợi) và qc (1 hàng đợi) dưới dạng các thiết bị dummy; đặt taprio root trên qb (num_tc 1, queues 2@0) và clsact trên cả ba; sau đó thêm bộ lọc matchall egress trên mọi thiết bị. Trên qa: "action skbedit queue_mapping 2 pipe action mirred egress redirect dev qb". Trên qb: "action mirred egress mirror dev qc". Trên qc: "action skbedit queue_mapping 0 pipe". Gửi một gói tin ra khỏi qa. skbedit của qc kích hoạt cờ trong khi khung truyền bên ngoài của qb đang bay; nếu không có bản vá, qb sẽ tiêu thụ nó và đọc mảng con taprio hai mục của nó bằng ánh xạ lỗi thời của gói tin được chuyển tiếp. Một qc mà skb ---bị cắt ngắn---
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.