CVE-2026-45949 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:

hwrng: core - sử dụng RCU và work_struct để sửa lỗi race condition

Hiện tại, hwrng_fill không được xóa cho đến khi luồng hwrng_fillfn() thoát. Vì hwrng_unregister() đọc hwrng_fill bên ngoài khóa rng_mutex, một lệnh gọi hwrng_unregister() đồng thời có thể gọi lại kthread_stop() trên cùng một tác vụ (task).

Ngoài ra, nếu hwrng_unregister() được gọi ngay sau khi hwrng_register(), luồng đã dừng có thể chưa bao giờ được thực thi. Do đó, hwrng_fill vẫn còn bẩn (dirty) ngay cả sau khi hwrng_unregister() trả về. Trong trường hợp này, các lệnh gọi tiếp theo đến hwrng_register() sẽ không thể khởi tạo các luồng mới, và hwrng_unregister() sẽ gọi kthread_stop() trên cùng một tác vụ đã được giải phóng (freed). Trong cả hai trường hợp, một lỗi use-after-free xảy ra:

refcount_t: addition on 0; use-after-free. WARNING: ... at lib/refcount.c:25 refcount_warn_saturate+0xec/0x1c0 Call Trace: kthread_stop+0x181/0x360 hwrng_unregister+0x288/0x380 virtrng_remove+0xe3/0x200

Bản vá này sửa lỗi race bằng cách bảo vệ con trỏ toàn cục hwrng_fill bên trong khóa rng_mutex, do đó luồng hwrng_fillfn() chỉ bị dừng một lần, và các lệnh gọi đến kthread_run() và kthread_stop() được tuần tự hóa với khóa được giữ.

Để tránh deadlock trong hwrng_fillfn() khi bị dừng với khóa được giữ, chúng tôi chuyển current_rng sang RCU, để get_current_rng() có thể đọc current_rng mà không cần giữ khóa. Để loại bỏ khóa khỏi put_rng(), chúng tôi cũng trì hoãn việc dọn dẹp thực tế vào một work_struct.

Vì get_current_rng() không còn trả về giá trị ERR_PTR nữa, các kiểm tra IS_ERR() đã được loại bỏ khỏi các caller của nó.

Với hwrng_fill được bảo vệ bởi khóa rng_mutex, hwrng_fillfn() không còn có thể tự xóa hwrng_fill. Do đó, nếu hwrng_fillfn() trả về trực tiếp ngay sau khi current_rng bị hủy, kthread_stop() sẽ được gọi trên một tác vụ task_struct đã được giải phóng sau đó. Để sửa lỗi này, hwrng_fillfn() giờ đây gọi schedule() để giữ cho tác vụ tồn tại cho đến khi bị dừng. Lệnh gọi kthread_stop() cũng được chuyển từ hwrng_unregister() sang drop_current_rng(), đảm bảo kthread_stop() được gọi trên tất cả các đường dẫn có thể nơi current_rng trở thành NULL, để luồng không chờ đợi mãi mãi.

Several companies clearly confirm that VulDB is the primary source for best 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.00023

KEV

không

Các hoạt động

rất thấp

Nguồn

Might our Artificial Intelligence support you?

Check our Alexa App!