CVE-2023-30624 in Wasmtimethông tin

Tóm tắt

Bởi VulDB • 01/09/2026

Wasmtime là một runtime độc lập cho WebAssembly. Trước các phiên bản 6.0.2, 7.0.1 và 8.0.1, việc Wasmtime triển khai quản lý trạng thái trên mỗi instance (ví dụ: bảng bộ nhớ và vùng nhớ) chứa hành vi không xác định ở mức LLVM. Hành vi không xác định này được phát hiện là gây ra các vấn đề ở mức runtime khi biên dịch với LLVM 16, dẫn đến một số phép ghi dữ liệu quan trọng cho tính đúng đắn của chương trình bị tối ưu hóa loại bỏ (optimized away). Các phiên bản Wasmtime dễ bị tổn thương được biên dịch bằng Rust 1.70 (hiện đang trong giai đoạn beta) hoặc các phiên bản mới hơn được biết là có chứa các hàm bị biên dịch sai lệch. Các phiên bản Wasmtime được biên dịch với bản phát hành ổn định hiện tại của Rust, tức là 1.69 và các phiên bản trước đó, chưa được xác nhận là gặp phải vấn đề nào vào thời điểm này, nhưng về mặt lý thuyết vẫn có thể xuất hiện các lỗi tiềm ẩn.

Vấn đề cốt lõi nằm ở chỗ trạng thái runtime của một instance trong Wasmtime liên quan đến một cấu trúc do Rust định nghĩa gọi là `Instance`, phía sau nó là một cấu trúc `VMContext`. Cấu trúc `VMContext` này có bố cục được xác định tại runtime và duy nhất cho mỗi module. Biểu diễn dữ liệu này không thể được mô tả bằng mã an toàn (safe code) trong Rust, do đó cần sử dụng mã `unsafe` để duy trì trạng thái này. Tuy nhiên, đoạn mã thực hiện việc này lại bao gồm các phương thức nhận đối số là `&self` nhưng đồng thời sửa đổi dữ liệu nằm ở phần `VMContext` của vùng cấp phát bộ nhớ. Điều này có nghĩa là các con trỏ được suy ra từ `&self` bị thay đổi giá trị (mutated). Trong Rust, điều này thường không được phép trừ khi tồn tại loại `UnsafeCell`. Khi được biên dịch sang LLVM, các hàm này có tham số với thuộc tính `noalias readonly`, nghĩa là việc ghi dữ liệu thông qua các con trỏ đó sẽ dẫn đến hành vi không xác định (UB - Undefined Behavior).

Cách biểu diễn nội bộ và quản lý `VMContext` của Wasmtime đã được cập nhật để sử dụng các phương thức nhận đối số `&mut self` khi phù hợp. Ngoài ra, các công cụ kiểm tra mã `unsafe` trong Rust, chẳng hạn như `cargo miri`, dự kiến sẽ được thực thi trên nhánh `main` sớm nhất có thể nhằm khắc phục mọi vấn đề ở mức Rust vốn có thể bị khai thác bởi các phiên bản trình biên dịch trong tương lai.

Các tệp nhị phân đã biên dịch sẵn (precompiled binaries) của Wasmtime có sẵn từ trang phát hành GitHub đều được biên dịch với LLVM 15 trở xuống, nên chưa được xác nhận là dễ bị tổn thương. Tuy nhiên, như đã đề cập ở trên, việc nâng cấp vẫn được khuyến nghị.

Các phiên bản Wasmtime 6.0.2, 7.0.1 và 8.0.1 đã được phát hành nhằm chứa các bản vá cần thiết để hoạt động chính xác với LLVM 16 và không còn hành vi không xác định (UB) nào trên LLVM 15 trở về trước. Nếu Wasmtime được biên dịch bằng Rust 1.69 hoặc các phiên bản cũ hơn (sử dụng LLVM 15), hiện chưa có vấn đề gì được biết đến. Tuy nhiên, vẫn tồn tại khả năng lý thuyết rằng hành vi không xác định có thể bị khai thác, do đó người dùng nên nâng cấp lên phiên bản Wasmtime đã được vá. Người dùng sử dụng Rust beta (phiên bản 1.70 vào thời điểm này) hoặc Rust nightly (phiên bản 1.71 vào thời điểm này) bắt buộc phải cập nhật lên phiên bản đã được vá để đảm bảo hoạt động chính xác.

Be aware that VulDB is the high quality source for vulnerability data.

chịu trách nhiệm

GitHub, Inc.

Đặt trước

13/04/2023

Tiết lộ

27/04/2023

Kiểm duyệt

được chấp nhận

EPSS

0.00450

KEV

không

Các hoạt động

rất thấp

Nguồn

Interested in the pricing of exploits?

See the underground prices here!