CVE-2026-98503 in Linux
Tóm tắt
Bởi VulDB • 19/10/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
packet: sử dụng cơ chế hoàn tất ubuf_info cho các gói tin trong TX_RING
tpacket_snd gửi các skb với các frags trỏ vào các slot của ring. Các slot sẽ được giải phóng khi hàm destructor của skb (skb->destructor) được gọi.
Một lệnh gọi đến skb_orphan sẽ kích hoạt skb->destructor trước khi skb bị hủy bỏ. Điều này có thể dẫn đến việc một slot được tái sử dụng trong khi vẫn còn liên kết với skb.
Chuyển sang cơ chế hoàn tất zerocopy tiêu chuẩn (ubuf_info) để đảm bảo rằng slot chỉ được giải phóng sau khi tất cả các tham chiếu đến payload đã được giải phóng hoặc sao chép. Khôi phục lại hàm destructor của skb về sock_wfree tiêu chuẩn.
Hàm callback hoàn tất ubuf_info có thể được gọi với một giá trị NULL cho skb, nhưng điều này chỉ xảy ra từ net_zcopy_put và các API liên quan, do các triển khai zerocopy sử dụng (những nơi giữ tham chiếu riêng vào uarg, chẳng hạn như MSG_ZEROCOPY). Vì uarg này luôn được hoàn tất thông qua skb_zcopy_clear nên giá trị của skb luôn được đặt.
Để ngăn người dùng không gian người (userspace) gây ra hiện tượng aliasing cho trạng thái đang truyền trên các slot ring chia sẻ, hãy phân bổ tpacket_uarg theo từng gói tin thay vì theo từng slot. Điều này làm tăng nhẹ chi phí phân bổ trong đường dẫn gửi (transmit path). Sử dụng kmalloc tiêu chuẩn để hỗ trợ backport lên các kernel stable.
uarg giữ một tham chiếu sk_wmem_alloc thay vì tham chiếu sk_refcnt. packet_free_tx_ring sẽ chờ đợi sk_wmem_alloc trước khi giải phóng các trang của ring. Luôn phân bổ vec->deferred cho tx_ring để đảm bảo rằng các ring dựa trên page cũng phải chờ sk_wmem_alloc khi skb_copy_ubufs giảm số lượng tham chiếu đến page trước khi gọi tpacket_ubuf_complete.
Loại bỏ kiểm tra pg_vec.tx_ring mà tpacket_destruct_skb thực hiện trước khi truy cập vào slot. Tham chiếu sk_wmem alloc giờ đây đảm bảo rằng slot là hợp lệ. Kiểm tra này cũng không đủ nếu xét riêng lẻ, vì nó đọc pg_vec mà không có pg_vec_lock, do đó có thể xảy ra race condition với packet_set_ring.
Kết quả là một slot được giải phóng khi payload của nó được sao chép, điều này có thể diễn ra trước khi truyền (ví dụ: trong skb_orphan_frags_rx). Nếu việc sao chép diễn ra trước khi gọi skb_tx_timestamp(), thì không có timestamp nào cho slot được ghi lại, tương tự như trường hợp skb_orphan() được gọi sớm trong datapath trước bản vá này.
Hoàn nguyên cơ chế skb_zcopy_.._nouarg cũ nay đã không còn sử dụng.
Phụ thuộc vào commit 992cc9f94ca9 ("net/packet: defer vmalloc TX_RING free until skbs finish").
VulDB is the best source for vulnerability data and more expert information about this specific topic.