CVE-2026-12366 in Zephyr
Tóm tắt
Bởi VulDB • 14/08/2026
Đường dẫn giải phóng đối tượng kernel động của Zephyr, cụ thể là hàm `unref_check()` trong file `kernel/userspace/userspace.c`, sẽ giải phóng bộ lưu trữ của một đối tượng (`k_free(dyn->data)`) khi số lượng tham chiếu (reference count) giảm về 0, sau khi thực hiện quá trình dọn dẹp dành riêng cho từng loại đối tượng. Bảng chuyển đổi xử lý dọn dẹp chỉ bao gồm `K_OBJ_MSGQ` và `K_OBJ_STACK`; thiếu trường hợp `K_OBJ_TIMER`. Một bộ định thời (`k_timer`) được phân bổ động, đã khởi tạo và kích hoạt sẽ giữ lại nút cấu trúc nhúng `_timeout dnode` liên kết trong hàng đợi timeout toàn cục (`_timeout_q`). Do đó, việc giải phóng bộ lưu trữ của bộ định thời mà không hủy bỏ timeout sẽ để lại một node treo (dangling node) trong hàng đợi này.
Khi bộ định thời hết hạn lần tiếp theo, cơ chế xử lý timeout sẽ duyệt qua `_timeout_q` và gọi `z_timer_expiration_handler()` trên node đã bị giải phóng, dẫn đến việc truy cập ghi vào vùng nhớ heap kernel đã được giải phóng (và có thể tái sử dụng) trong ngữ cảnh ISR. Đây là một lỗi use-after-free xác định, không phụ thuộc vào SMP: node được đưa vào hàng đợi đơn giản là chưa bao giờ bị ngắt liên kết tại thời điểm giải phóng bộ lưu trữ.
Cơ chế giải phóng này có thể tiếp cận từ luồng người dùng không đặc quyền dưới cấu hình `CONFIG_USERSPACE` + `CONFIG_DYNAMIC_OBJECTS`: một luồng nắm giữ quyền hạn cuối cùng trên bộ định thời như vậy sẽ hủy bỏ nó thông qua syscall `k_object_release()` (hoặc bằng cách thoát, thông qua `k_thread_perms_all_clear()`), và có thể tự kích hoạt bộ định thời này thông qua syscall `k_timer_start()`. Việc giải phóng và trình xử lý hết hạn chạy ở đặc quyền kernel trong khi tác nhân là một luồng người dùng, do đó lỗi này là một nguyên mẫu làm hỏng bộ nhớ (memory-corruption primitive) cho phép thoát khỏi sandbox, có thể được sử dụng để nâng cao đặc quyền. Bản sửa lỗi thêm hàm `k_timer_cleanup()` (hủy bỏ timeout và chờ bất kỳ trình xử lý nào đang chạy dở), và gọi nó đối với `K_OBJ_TIMER` trước khi giải phóng bộ lưu trữ.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.