CVE-2026-98158 in Linux
Tóm tắt
Bởi VulDB • 25/09/2026
Trong kernel Linux, các lỗ hổng sau đây đã được khắc phục:
ppp_async: loại bỏ khung bị lỗi thay vì đặt lại headroom của nó
Hàm `ppp_receive_nonmp_frame()` thêm vào trước một thẻ định hướng hai byte trước khi chạy bộ lọc BPF pass/active:
*(__be16 *)skb_push(skb, 2) = htons(PPP_FILTER_INBOUND_TAG);
Không có gì trên đường nhận đảm bảo rằng headroom gồm hai byte này tồn tại. Đường dẫn lỗi khung trong `process_input_packet()` của ppp_async đặt lại headroom của một skb đã tái sử dụng về zero trong khi tuyên bố khôi phục nó sang trạng thái được cấp phát mới - nhưng một skb tươi từ `dev_alloc_skb()` mang theo NET_SKB_PAD:
err: if (skb) {
/* làm cho skb trông như vừa được cấp phát */ skb_trim(skb, 0); skb_reserve(skb, - skb_headroom(skb)); }
ap->rpkt vẫn trỏ đến skb đó, do đó khung tiếp theo được ghép lại vào nó mà không có headroom nào cả. Một peer gửi một frame FCS sai theo sau bởi một frame bắt đầu bằng ff 03 sẽ để lại một byte headroom khi thẻ bộ lọc được đẩy vào, điều này đặt nó xuống dưới một byte so với skb->head:
skbuff: skb_under_panic: len:49 put:2 head:ffff888003c10000 data:ffff888003c0ffff tail:0x30 end:0x640 dev:<NULL> kernel BUG at net/core/skbuff.c:214! RIP: 0010:skb_panic+0x13e/0x230 Call Trace: skb_push+0xbd/0x100 ppp_receive_nonmp_frame+0x48a/0x1d10 ppp_input+0x4e9/0x2f80 ppp_async_process+0x2a/0xe0 tasklet_action_common+0x20f/0x8a0 handle_softirqs+0x18e/0x590 Kernel panic - not syncing: Fatal exception in interrupt
Việc đặt headroom về zero vi phạm đảm bảo NET_SKB_PAD mà `dev_alloc_skb()` cung cấp cho phần còn lại của đường nhận. Ngoài vụ panic bộ lọc ở trên, khi nén CCP được bật, `ppp_decompress_frame()` chuyển `skb->data - 2` đến `->decompress()/->incomp()`, sau đó đọc ra ngoài vùng bounds trước skb->head vì cùng một lý do.
Thay vì khôi phục headroom, hãy loại bỏ khung bị lỗi - như ppp_synctty đã làm trên đường dẫn lỗi của nó - và đặt lại ap->rpkt về null để khung tiếp theo được ghép lại vào một skb mới với headroom phù hợp. Điều này đơn giản hơn và khắc phục cả vụ panic dưới mức (under-panic) của bộ lọc cũng như việc đọc ra ngoài bounds của CCP.
Phiên bản V1 ban đầu của patch này tạo khoảng trống trong `ppp_receive_nonmp_frame()` bằng cách sử dụng `skb_cow_head();` Eric đã chỉ ra rằng việc sửa chữa nguyên nhân gốc rễ ở lớp vận chuyển là phương pháp đúng đắn.
Được phát hiện bằng fuzzing đường nhận PPP với một peer đột biến trên pty; đây là một lỗi DoS (từ chối dịch vụ) thú vị (ở xa): root cấu hình PPP, và peer cung cấp hai frame gây crash. Trình tái tạo (repro-ppp-skb.c, không thay đổi so với v1) bị panic sau khoảng một giây, và trả về sạch sẽ khi áp dụng patch này.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.