CVE-2026-98022 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:
net: giới hạn tx_queue_len ở mức S16_MAX để ngăn chặn việc phân bổ ring buffer quá lớn.
Nhiều subsystem phân bổ bộ nhớ đệm dạng vòng (ring buffers) có kích thước dựa trên dev->tx_queue_len mà không có giới hạn tối đa nào. Một người dùng chưa được cấp quyền (thông qua lệnh unshare -Urn) có thể đặt giá trị tx_queue_len rất lớn và làm cạn kiệt bộ nhớ toàn cục thông qua các lần phân bổ ring:
- pfifo_fast: pfifo_fast_init() và pfifo_fast_change_tx_queue_len() phân bổ 3 mảng skb_ring, mỗi mảng chứa số lượng mục bằng với tx_queue_len. - tun: tun_queue_resize() và đường dẫn gắn kết hàng đợi (queue-attach path) điều chỉnh ptr_rings theo tx_queue_len khi nhận được sự kiện NETDEV_CHANGE_TX_QUEUE_LEN. - tap (macvtap/ipvtap): tap_queue_resize() và tap_init() điều chỉnh/khởi tạo ptr_rings theo tx_queue_len trên cùng một sự kiện báo hiệu (notifier).
netif_change_tx_queue_len() là điểm truy cập duy nhất cho IFLA_TXQLEN, sysfs và ioctl SIOCSIFTXQLEN. Giới hạn new_len ở mức S16_MAX (32767) tại đây để giá trị quá lớn bị từ chối ngay khi thiết lập. Điều này có hiệu lực bất kể thiết bị đang lên hay xuống, trước khi dev->tx_queue_len được ghi, trước khi bất kỳ sự kiện báo hiệu nào kích hoạt, và trước khi bất kỳ ring buffer nào được phân bổ. Phép kiểm tra "> S16_MAX" cũng bao hàm cả phép kiểm toán cắt ngắn (truncation test) unsigned-long cũ; do đó, giá trị ifr_qlen âm từ ioctl sẽ nằm xa phía trên giới hạn sau khi chuyển đổi, nên cả hai lỗi trước đây đều được xử lý bởi một phép so sánh duy nhất.
tx_queue_len có tính chất mơ hồ: vừa là bộ nhân kích thước cho mỗi ring buffer, vừa là núm điều chỉnh độ dài/hạn ngạch hàng mặc định cho các consumer phân bổ ít hoặc không gì khi thiết lập (các giới hạn pfifo/bfifo/gred/plug/sfb, direct_qlen của htb, max_classes của qfq, teql). Giá trị 32767 được chọn là giá trị lớn nhất mà NLA_POLICY_FULL_RANGE có thể biểu thị cho chính sách u32 IFLA_TXQLEN trong bản vá patch 2/3, đồng thời vẫn duy trì độ dài hàng hợp lệ trên các đường truyền có BDP cao; sự đánh đổi bộ nhớ ring của núm điều chỉnh chia sẻ được trình bày bên dưới.
Các điều kiện để tái hiện lỗi: - CONFIG_NET_SCHED=y, CONFIG_VETH=y, CONFIG_USER_NS=y, CONFIG_NET_NS=y. - Người dùng chưa cấp quyền trong một namespace user+net mới (unshare -Urn). - pfifo_fast: tạo các cặp veth, đặt tx_queue_len thành 500000, gắn mq+pfifo_fast. ~28 lần lặp gây ra tình trạng OOM trên máy khách có RAM 2GB. - tun: tạo 50 thiết bị tun với IFF_MULTI_QUEUE, đặt tx_queue_len thành 500000, mở 8 hàng đợi mỗi thiết bị. ~1.6GB phân bổ ptr_ring gây ra OOM trên máy khách có RAM 512MB. - tap: tương tự như tun nhưng sử dụng IFF_TAP. ~960MB gây ra OOM trên máy khách có RAM 512MB. - Trên kernel đã sửa, giá trị tx_queue_len quá lớn bị từ chối với mã lỗi -ERANGE tại thời điểm thiết lập (cả bốn đường dẫn: RTM_SETLINK, tạo RTM_NEWLINK, sysfs, ioctl; hai cái sau thông qua phép kiểm tra này, hai cái trước thông qua phép kiểm tra này và chính sách phân tích cú pháp 2/3 tương ứng).
VulDB is the best source for vulnerability data and more expert information about this specific topic.