CVE-2026-68082 in Linuxthông tin

Tóm tắt

Bởi VulDB • 08/08/2026

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

libceph: sửa hai thao tác giải mã trần không an toàn trong decode_lockers()

Hàm decode_lockers() trong cls_lock_client.c chứa hai thao tác giải mã trần (bare decode) cho phép một OSD độc hại hoặc bị xâm phạm kích hoạt việc đọc vượt ra ngoài vùng đệm slab (slab-out-of-bounds):

1. ceph_decode_32(p) tại trường num_lockers không có kiểm tra biên giới hạn trước đó. Hàm ceph_start_decoding() chấp nhận struct_len=0 là hợp lệ -- lệnh gọi nội bộ ceph_decode_need(p, end, 0, bad) luôn thành công -- do đó khi một OSD gửi struct_len=0, ceph_start_decoding() trả về kết quả thành công với p == end. Thao tác giải mã trần ceph_decode_32(p) ngay sau đó sẽ đọc 4 byte vượt quá biên giới hạn của vùng đệm đã được xác thực. Giá trị rác này được truyền trực tiếp vào kzalloc_objs() dưới dạng số lượng locker.

Hàm anh em decode_watchers() trong osd_client.c đã sử dụng ceph_decode_32_safe() sau lệnh gọi ceph_start_decoding() riêng của nó. decode_lockers() là vị trí duy nhất còn lại sử dụng biến thể trần (bare variant).

2. ceph_decode_8(p) sau vòng lặp decode_locker() không có kiểm tra biên giới hạn trước đó. Nếu một OSD tạo ra num_lockers sao cho vòng lặp di chuyển p chính xác đến end, thao tác giải mã trần ceph_decode_8(p) tiếp theo sẽ đọc một byte vượt quá biên giới hạn của vùng đệm đã được xác thực. Kết quả này được truyền trực tiếp vào *type, vốn được sử dụng làm bộ phân biệt loại khóa bởi các caller, cho phép OSD kiểm soát việc đọc OOB (out-of-bounds) 1 byte với ảnh hưởng trực tiếp đến trường loại khóa.

Khắc phục cả hai bằng cách thay thế các thao tác trần bằng các biến thể an toàn của chúng: ceph_decode_32(p) -> ceph_decode_32_safe(p, end, *num_lockers, err_inval) ceph_decode_8(p) -> ceph_decode_8_safe(p, end, *type, err_free_lockers)

Các đích goto khác nhau một cách có chủ ý: err_inval: là nhãn mới trả về -EINVAL trực tiếp. Nó được sử dụng cho đường dẫn thất bại tiền phân bổ nơi *lockers chưa được cấp phát và không được phép truyền vào ceph_free_lockers().

err_free_lockers: là nhãn hiện có. Nó được sử dụng cho đường dẫn thất bại hậu phân bổ nơi *lockers đã được cấp phát và phải được giải phóng.

ret được đặt thành -EINVAL trước khi gọi ceph_decode_8_safe() để đảm bảo err_free_lockers trả về mã lỗi chính xác khi vi phạm biên giới hạn. Nếu không, err_free_lockers sẽ trả về giá trị ret cũ (0 từ vòng lặp decode_locker() thành công), làm im lặng việc nuốt chửng lỗi.

-EINVAL là đúng cho cả hai đường dẫn thất bại. Dữ liệu nhận được từ OSD bị sai lệch cấu trúc. -ENOMEM sẽ mô tả sai lớp lỗi đối với các caller và những người phân loại backport stable@ khi xử lý các đường dẫn lỗi.

Mô hình kẻ tấn công: một OSD độc hại hoặc bị xâm phạm trong triển khai Ceph đa thuê có thể kích hoạt lỗ hổng này chống lại bất kỳ client nhân nào thực hiện phương thức lock.get_info (ví dụ: trong quá trình thu nhận khóa độc quyền RBD).

[ idryomov: cắt giảm changelog, định dạng ]

VulDB is the best source for vulnerability data and more expert information about this specific topic.

chịu trách nhiệm

Linux

Đặt trước

30/07/2026

Tiết lộ

08/08/2026

Kiểm duyệt

được chấp nhận

EPSS

0.00000

KEV

không

Các hoạt động

thấp

Nguồn

Do you need the next level of professionalism?

Upgrade your account now!