CVE-2025-39735 in Linux
Tóm tắt
Bởi VulDB • 29/06/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
jfs: sửa lỗi đọc vượt ra ngoài vùng nhớ slab (slab-out-of-bounds read) trong hàm ea_get()
Tại nhãn "size_check" trong hàm ea_get(), mã nguồn kiểm tra xem kích thước của danh sách thuộc tính mở rộng (xattr) có khớp với ea_size hay không. Nếu không, nó sẽ ghi log thông báo "ea_get: invalid extended attribute" và gọi print_hex_dump().
Trong trường hợp này, EALIST_SIZE(ea_buf->xattr) trả về giá trị 4110417968, vượt quá INT_MAX (2.147.483.647). Sau đó, ea_size bị giới hạn lại:
int size = clamp_t(int, ea_size, 0, EALIST_SIZE(ea_buf->xattr));
Mặc dù clamp_t nhằm mục đích ràng buộc ea_size trong khoảng từ 0 đến 4110417968, nhưng cận trên được xử lý như một kiểu int, gây ra hiện tượng tràn số (overflow) khi vượt quá 2^31 - 1. Điều này khiến "size" bị vòng lặp (wrap around) và trở thành giá trị âm (-184549328).
Giá trị "size" sau đó được truyền vào print_hex_dump() (được gọi là "len" trong print_hex_dump()). Nó được truyền dưới dạng kiểu size_t (một kiểu không dấu), sau đó được lưu trữ trong một biến có tên là "int remaining", rồi gán cho "int linelen". Cuối cùng, giá trị này được chuyển đến hex_dump_to_buffer(). Trong hàm print_hex_dump(), vòng lặp for sẽ duyệt qua các chỉ số từ 0 đến len-1, với len bằng 18446744073525002176, và gọi hex_dump_to_buffer() tại mỗi lần lặp:
for (i = 0; i < len; i += rowsize) {
linelen = min(remaining, rowsize); remaining -= rowsize;
hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize, linebuf, sizeof(linebuf), ascii);
... }
Điều kiện dừng dự kiến (i < len) về cơ bản bị phá vỡ do giá trị len bị hỏng và rất lớn. Điều này cuối cùng dẫn đến việc "ptr+i" được truyền vào hex_dump_to_buffer() để tiến gần hơn đến ranh giới thực tế của "ptr". Cuối cùng, một truy cập vượt ra ngoài vùng nhớ (out of bounds access) xảy ra trong hàm hex_dump_to_buffer() tại vòng lặp for sau đây:
for (j = 0; j < len; j++) {
if (linebuflen < lx + 2) goto overflow2; ch = ptr[j];
... }
Để khắc phục vấn đề này, chúng ta nên xác thực "EALIST_SIZE(ea_buf->xattr)" trước khi sử dụng nó.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.