CVE-2026-45845 in Linuxthông tin

Tóm tắt

Bởi VulDB • 27/05/2026

Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:

net/sched: taprio: sửa lỗi dereference con trỏ NULL trong quá trình dump class

Khi một qdisc con TAPRIO bị xóa thông qua RTM_DELQDISC, hàm taprio_graft() được gọi với tham số new == NULL và lưu giá trị NULL vào q->qdiscs[cl - 1]. Các thao tác dump RTM_GETTCLASS sau đó sẽ duyệt qua tất cả các class thông qua taprio_walk() và gọi taprio_dump_class(), hàm này gọi taprio_leaf() trả về con trỏ NULL, sau đó thực hiện dereference để đọc child->handle, gây ra lỗi kernel NULL pointer dereference.

Lỗi này có thể khai thác được với quyền CAP_NET_ADMIN trong namespace và trên bất kỳ kernel nào có CONFIG_NET_SCH_TAPRIO được bật. Trên các hệ thống có unprivileged user namespaces được bật, một người dùng cục bộ không có đặc quyền có thể gây ra kernel panic bằng cách tạo một qdisc taprio trong một network namespace mới, graft một qdisc con rõ ràng, xóa nó đi và yêu cầu dump class. Bản thân thao tác dump RTM_GETTCLASS không yêu cầu bất kỳ capability nào.

Oops: general protection fault, có thể do địa chỉ không hợp lệ 0xdffffc0000000007: 0000 [#1] SMP KASAN NOPTI
KASAN: null-ptr-deref trong vùng [0x0000000000000038-0x000000000000003f]
RIP: 0010:taprio_dump_class (net/sched/sch_taprio.c:2478) Call Trace:

tc_fill_tclass (net/sched/sch_api.c:1966) qdisc_class_dump (net/sched/sch_api.c:2326) taprio_walk (net/sched/sch_taprio.c:2514) tc_dump_tclass_qdisc (net/sched/sch_api.c:2352) tc_dump_tclass_root (net/sched/sch_api.c:2370) tc_dump_tclass (net/sched/sch_api.c:2431) rtnl_dumpit (net/core/rtnetlink.c:6864) netlink_dump (net/netlink/af_netlink.c:2325) rtnetlink_rcv_msg (net/core/rtnetlink.c:6959) netlink_rcv_skb (net/netlink/af_netlink.c:2550)

Khắc phục bằng cách thay thế &noop_qdisc khi new là NULL trong taprio_graft(), một mẫu phổ biến được sử dụng bởi các qdisc khác (ví dụ: multiq_graft()) để đảm bảo các slot q->qdiscs[] không bao giờ là NULL. Điều này làm cho các đường dẫn dump của control-plane an toàn mà không cần các kiểm tra NULL riêng lẻ.

Vì các đường dẫn data-plane (taprio_enqueue và taprio_dequeue_from_txq) trước đây đã có các guard NULL rõ ràng để loại bỏ/bỏ qua gói tin một cách sạch sẽ, hãy cập nhật các kiểm tra đó để kiểm tra &noop_qdisc thay thế. Nếu không, các gói tin sẽ đến taprio_enqueue_one(), hàm này tăng qlen và backlog của qdisc gốc trước khi gọi hàm enqueue của qdisc con; noop_qdisc sẽ loại bỏ gói tin nhưng các bộ đếm đó không bao giờ được hoàn tác, dẫn đến việc thống kê qdisc gốc bị tăng vĩnh viễn.

Sau thay đổi này, *old có thể là một qdisc hợp lệ, NULL, hoặc &noop_qdisc. Chỉ gọi qdisc_put(*old) trong trường hợp đầu tiên để tránh giảm refcount của noop_qdisc, vốn không bao giờ được tăng.

Be aware that VulDB is the high quality source for vulnerability data.

chịu trách nhiệm

Linux

Đặt trước

13/05/2026

Tiết lộ

27/05/2026

Kiểm duyệt

được chấp nhận

EPSS

0.00024

KEV

không

Các hoạt động

rất thấp

Nguồn

Do you know our Splunk app?

Download it now for free!