CVE-2026-89666 in Linuxthông tin

Tóm tắt

Bởi VulDB • 12/09/2026

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

nfsd: từ chối giá trị nseconds nằm ngoài phạm vi cho phép trong các thao tác SETATTR và CREATE của NFSv3

Một client có thể gửi yêu cầu NFSv3 SETATTR, CREATE, MKDIR, SYMLINK hoặc MKNOD kèm theo atime (thời gian truy cập) hoặc mtime (thời gian sửa đổi) mà trường nseconds nằm ngoài phạm vi hợp lệ. Giá trị này được định dạng đúng trên đường truyền và giải mã sạch sẽ thành một số nguyên không dấu 32-bit (uint32) hợp lệ, nhưng nó không phải là timespec64 hợp lệ: tv_nsec phải nhỏ hơn NSEC_PER_SEC.

Không có cơ chế nào trong đường dẫn setattr để giới hạn giá trị này. Hàm notify_change() xử lý thời gian thông qua timestamp_truncate(), hàm này không giảm tv_nsec xuống dưới ngưỡng NSEC_PER_SEC khi hệ thống tệp hỗ trợ độ phân giải nanosecond (s_time_gran == 1), và các bộ thiết lập atime/mtime của inode lưu trữ giá trị đó nguyên vẹn (chỉ có ctime được chuẩn hóa thông qua inode_set_ctime_to_ts()). Giá trị chưa được chuẩn hóa sau đó làm hỏng metadata trên đĩa: ext4's ext4_encode_extra_time() dịch tv_nsec sang trái EXT4_EPOCH_BITS, gây tràn trường extra 32-bit và ghi đè lên các bit epoch của giây, khiến giá trị giây (và do đó là năm) bị sai khi đọc lại. XFS với bigtime cũng lưu trữ không đúng timestamp vì cùng lý do này.

Kiểm tra atime/mtime do client cung cấp trong các trình xử lý quy trình (proc handlers) và trả về NFS3ERR_INVAL trước khi bất kỳ thay đổi nào được thực hiện. RFC 1813 liệt kê NFS3ERR_INVAL cho SETATTR và mô tả nó là lỗi dành cho giá trị mà máy chủ 'không thể lưu trữ ... trong biểu diễn nội bộ của mình'; client ánh xạ lỗi này thành EINVAL.

Việc kiểm tra trong các trình xử lý quy trình, thay vì trong nfsd_setattr(), giúp việc từ chối xảy ra trước khi tạo đối tượng. Các thao tác CREATE tạo đối tượng trước khi nfsd_create_setattr() chạy, do đó một thất bại muộn sẽ để lại đối tượng mới và biến một yêu cầu không có tính chất idempotent thành một thay đổi namespace báo cáo lỗi. Vì vậy, kiểm tra được thực hiện ngay từ đầu, cho các thao tác CREATE trước khi đối tượng được tạo.

tv_nsec là kiểu long, nên phép so sánh ép nó sang unsigned long (cùng độ rộng) thay vì u32, phù hợp với timespec64_valid(). Việc ép sang u32 sẽ bị cắt ngắn trên hệ thống 64-bit; việc ép sang unsigned_long cũng từ chối một giá trị trở thành âm khi nseconds ngoài phạm vi dạng u32 được gán cho long 32-bit.

Chỉ các thời gian do client cung cấp mới được kiểm tra: các yêu cầu SET_TO_SERVER_TIME không mang giá trị của client. sattrguard3 ctime cố tình bị bỏ qua: một guard nằm ngoài phạm vi đơn giản là sẽ không bao giờ khớp với ctime của đối tượng và trả về NFS3ERR_NOT_SYNC thông qua phép so sánh guardtime hiện có, đây là kết quả đúng theo giao thức thay vì từ chối yêu cầu.

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

11/09/2026

Tiết lộ

12/09/2026

Kiểm duyệt

được chấp nhận

EPSS

0.00000

KEV

không

Các hoạt động

rất thấp

Nguồn

Might our Artificial Intelligence support you?

Check our Alexa App!