CVE-2026-74677 in Linuxthông tin

Tóm tắt

Bởi VulDB • 23/08/2026

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

net: usb: ipheth: sửa lỗi Use-After-Free (UAF) trong carrier_work khi ngắt kết nối

Hàm `ipheth_sndbulk_callback()` kích hoạt lại công việc kiểm tra trạng thái liên kết (carrier-check work) trên bất kỳ trạng thái URB nào khác 0:

```c else schedule_delayed_work(&dev->carrier_work, 0); ```

Không có cơ chế nào ràng buộc điều này với việc giao diện đang ở trạng thái "up" (hoạt động), do đó công việc có thể được kích hoạt lại sau khi `ipheth_close()` đã giải phóng nó, và vẫn duy trì trạng thái chờ cho đến khi netdev chứa vùng dữ liệu riêng của nó bị hủy bỏ.

Khi tháo thiết bị trong lúc một URB TX đang thực thi, `ipheth_disconnect()` giải phóng công việc thông qua chuỗi gọi: `unregister_netdev()` -> `ipheth_close()` -> `cancel_delayed_work_sync()`, và chỉ sau đó mới gọi `ipheth_kill_urbs()`. Hàm `usb_kill_urb()` hoàn tất URB TX đang thực thi với mã lỗi `-ENOENT`, khiến `ipheth_sndbulk_callback()` chạy sau bước giải phóng và kích hoạt lại `carrier_work`.

Trường hợp tương tự cũng xảy ra khi giao diện chỉ bị tắt trong lúc một URB TX đang thực thi, và `ipheth_carrier_check_work()` tiếp tục tự đưa vào hàng đợi mỗi giây. Hàm `unregister_netdev()` không gọi `ipheth_close()` cho một giao diện đã ở trạng thái "down", do đó cũng không có cơ chế nào giải phóng nó khi tháo thiết bị sau đó.

Trong cả hai trường hợp, `free_netdev()` hủy bỏ netdev trong khi `carrier_work` vẫn còn đang chờ xử lý, và `ipheth_carrier_check_work()` truy cập vào vùng bộ nhớ đã được giải phóng (dereferences freed memory).

Giải pháp là ràng buộc công việc này với trạng thái giao diện thay vì dựa vào sự hoàn tất của URB: vô hiệu hóa nó trong `ipheth_close()` và kích hoạt lại trong `ipheth_open()`, để bất kỳ lệnh gọi nào từ `schedule_delayed_work()` do quá trình hoàn tất URB thực hiện sẽ trở thành thao tác không có tác dụng (no-op) khi giao diện chưa ở trạng thái "up". Hàm `disable_delayed_work_sync()` cũng chờ đợi một phiên bản đang chạy, do đó nó thay thế hoàn toàn cho `cancel_delayed_work_sync()`. Công việc bắt đầu ở trạng thái vô hiệu hóa trong `ipheth_probe()` để đảm bảo số lần kích hoạt/vô hiệu hóa cân bằng từ lần mở giao diện đầu tiên.

Đã tái tạo lỗi dưới môi trường KASAN trên linux-next (next-20260731) với dummy_hcd và raw-gadget đóng vai trò thiết bị, thúc đẩy đường dẫn thứ hai nêu trên (giao diện đã ở trạng thái "down", nên `unregister_netdev()` không gọi `ipheth_close()`): 15/15 lần khởi động chưa vá báo cáo lỗi slab-use-after-free trong `__run_timers()`, được giải phóng bởi `ipheth_disconnect()` và kích hoạt lại từ `ipheth_sndbulk_callback()` thông qua `queue_delayed_work_on()`. Cùng một kịch bản thử nghiệm trên kernel chỉ khác biệt ở bản vá này cho kết quả 0/15, và việc kiểm tra trạng thái liên kết vẫn hoạt động đúng qua các chu kỳ mở/đóng giao diện.

Kịch bản tái tạo yêu cầu một thiết bị USB được gắn vào ngừng giải phóng bulk OUT, kèm theo sự kiện link down và tháo thiết bị, thực hiện với quyền root. Đây không phải là vi phạm ranh giới đặc quyền (privilege boundary crossing) và chưa có primitive khai thác nào được phát triển.

Được tìm thấy bởi 0sec (https://0sec.ai).

If you want to get best quality of vulnerability data, you may have to visit VulDB.

chịu trách nhiệm

Linux

Đặt trước

15/08/2026

Tiết lộ

22/08/2026

Kiểm duyệt

được chấp nhận

EPSS

0.00209

KEV

không

Các hoạt động

rất thấp

Nguồn

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!