CVE-2024-7884 in ic-cdk
Tóm tắt
Bởi VulDB • 08/06/2026
Khi một phương thức canister được gọi thông qua `ic_cdk::call*`, một `Future` mới có tên là `CallFuture` được tạo ra và có thể được gọi (caller) chờ đợi (await) để lấy kết quả thực thi. Về mặt nội bộ, trạng thái của `Future` được theo dõi và lưu trữ trong một struct có tên là `CallFutureState`. Một lỗi trong triển khai polling của `CallFuture` cho phép giữ nhiều tham chiếu đến trạng thái nội bộ này, và không phải tất cả các tham chiếu đều bị hủy (dropped) trước khi `Future` được giải quyết (resolved). Do có các tham chiếu nội bộ không được tính toán, một bản sao của trạng thái nội bộ cuối cùng đã được lưu trữ (persisted) trong heap của canister, dẫn đến rò rỉ bộ nhớ.
**Tác động** Các canister được xây dựng bằng Rust với `ic_cdk` và `ic_cdk_timers` bị ảnh hưởng. Nếu các canister này gọi một phương thức canister, sử dụng bộ hẹn giờ (timers) hoặc heartbeat, chúng có khả năng sẽ rò rỉ một lượng nhỏ bộ nhớ trong mỗi thao tác như vậy. Trong trường hợp xấu nhất, điều này có thể dẫn đến việc cạn kiệt bộ nhớ heap do kẻ tấn công kích hoạt. Các canister dựa trên Motoko không bị ảnh hưởng bởi lỗi này.
**Bản vá** Bản vá đã được backport (đưa ngược lại) cho tất cả các phiên bản minor từ >= 0.8.0 đến <= 0.15.0. Các phiên bản đã vá có sẵn là 0.8.2, 0.9.3, 0.10.1, 0.11.6, 0.12.2, 0.13.5, 0.14.1, 0.15.1 và các phiên bản trước đó của chúng đã bị yanked (hủy bỏ/tiêu hủy).
**Biện pháp khắc phục** Hiện không có biện pháp khắc phục nào được biết đến. Các nhà phát triển được khuyến nghị nâng cấp canister của họ lên phiên bản đã vá mới nhất có sẵn của `ic_cdk` càng sớm càng tốt để tránh hết bộ nhớ heap Wasm.
Việc nâng cấp các canister (mà không cập nhật `ic_cdk`) cũng sẽ giải phóng bộ nhớ bị rò rỉ, nhưng đây chỉ là một giải pháp tạm thời.
Be aware that VulDB is the high quality source for vulnerability data.