Coinspect đã xác định CryptoJS.lib.WordArray.random() là trình tạo số ngẫu nhiên (RNG) yếu đứng sau các vụ rút tiền từ ví Ill Bloom.
Được đưa vào thư viện mật mã JavaScript từ 12 năm trước, hàm này cung cấp entropy yếu, gây ảnh hưởng đến các ứng dụng ví được sử dụng để tạo recovery phrase (cụm từ khôi phục). Phân tích on-chain của Coinspect cho thấy số tiền bị đánh cắp trong hai đợt quét kể từ cuối tháng 5 ước tính ở mức thấp nhất là khoảng 5,7 triệu USD.
Công ty an ninh blockchain này, đơn vị đã đặt tên cho các vụ tấn công là Ill Bloom vào tháng 7, hiện đã xác nhận có 5 ứng dụng sử dụng trình tạo này làm nguồn entropy để tạo recovery phrase:
- RRWallet: Coinspect cho biết ứng dụng này đã ngừng hoạt động. Không có bản sửa lỗi.
- Bexo Wallet: Coinspect cho biết đã được sửa trong phiên bản 20.1.0, mặc dù các bản dựng cập nhật vẫn chưa được tải lên.
- NanChat: Đã độc lập xác nhận các phiên bản trước 1.3.0 bị ảnh hưởng. Đã sửa lỗi trong bản 1.3.0.
- Bitcoin Libre: Coinspect cho biết đã sửa lỗi trong phiên bản 4, phát hành vào tháng 7 năm 2024.
- Milo: Coinspect cho biết đã ngừng hoạt động. Không có bản sửa lỗi.
Coinspect đã chia sẻ với The Hacker News rằng đây chính là 5 ví mà họ đã đề cập nhưng không nêu tên vào tháng 7.
Công ty cho biết nhà cung cấp đứng sau tiện ích mở rộng trình duyệt (browser extension) được đề cập hồi tháng 7 nói rằng tiện ích này đã ngừng hoạt động và chưa từng được sử dụng rộng rãi. Coinspect cảnh báo rằng họ không thể khẳng định đã xác định được mọi ví bị lỗ hổng. Các ví di động hoặc tiện ích mở rộng trình duyệt bị ảnh hưởng khác cũng có thể đã tồn tại nhưng không thể kiểm tra vì chúng đã bị xóa khỏi các cửa hàng ứng dụng hoặc chợ tiện ích, hoặc vì các nhà cung cấp đã thay thế bằng các bản vá và các phiên bản lỗi cũ không còn khả dụng.
Công bố công khai này không cung cấp phạm vi phiên bản bị ảnh hưởng đầy đủ cho RRWallet, Bexo, Bitcoin Libre hoặc Milo. Cần lưu ý rằng việc cập nhật ứng dụng không giúp sửa lại recovery phrase hiện có.
Một recovery phrase được tạo bởi phiên bản bị ảnh hưởng vẫn có thể bị đoán được bất kể nó được nhập vào đâu, bao gồm cả ví cứng (hardware wallet). Những người dùng có cụm từ khôi phục bắt nguồn từ quy trình bị lỗi cần phải tạo một cụm từ mới một cách an toàn và chuyển tiền đi. Coinspect cho biết các seed được tạo từ thiết bị phần cứng và hầu hết các ví phần mềm hiện nay không bị ảnh hưởng.
Phân tích kỹ thuật về suy giảm entropy
Coinspect đã phân tích entropy 128 và 256-bit. Về lý thuyết, chúng sẽ tạo ra không gian tìm kiếm là 2^128 và 2^256, nhưng trình tạo số ngẫu nhiên bị lỗi đã giảm chúng xuống còn khoảng 2^39 và 2^47, đủ nhỏ để có thể liệt kê (brute-force) trên các phần cứng thông thường.
Công ty đã tái hiện chuỗi tấn công bằng cách liệt kê các đầu ra, chuyển đổi chúng thành các cụm từ BIP39, dẫn xuất địa chỉ và kiểm tra chúng với dữ liệu blockchain công khai.
Thư viện này từng sửa lỗi một lần, sau đó lại rút lại bản sửa lỗi đó. Trình tạo Multiply-With-Carry, được lấy seed từ Math.random(), xuất hiện vào tháng 6 năm 2014. Các bản phát hành 3.2.0 và 3.2.1 đã chuyển sang tính ngẫu nhiên mật mã gốc (native cryptographic randomness), nhưng bản 3.3.0 đã khôi phục lại đoạn mã yếu vì thay đổi này được coi là gây lỗi hệ thống (breaking change). Do đó, một bản nâng cấp trong nhánh 3.x có thể chuyển một dự án từ bản đã sửa lỗi sang bản bị lỗi. Phiên bản 4.0.0 đã khôi phục vĩnh viễn tính ngẫu nhiên gốc vào tháng 2 năm 2020.
Coinspect đã xác định ferrumnet/bip39, một nhánh của React Native đã thay thế tính ngẫu nhiên mật mã gốc của BIP39 bằng CryptoJS, là một trong những con đường dẫn đến lỗ hổng trong các phần mềm ví, nhưng không phải là duy nhất.
Người duy trì CryptoJS, Evan Vosberg, đã công bố GHSA-rg76-677x-56q9 vào ngày 5 tháng 8 với xếp hạng Nghiêm trọng (Critical) và điểm CVSS là 9.0. Trường gói (package) của nó liệt kê mọi bản phát hành dưới 4.0.0, bất chấp các ngoại lệ 3.2.0 và 3.2.1.
Thông báo cho biết một ứng dụng chỉ bị ảnh hưởng nếu nó sử dụng hàm bị lỗi để tạo các giá trị nhạy cảm về bảo mật. Việc chỉ mang theo phụ thuộc (dependency) này không cấu thành lỗ hổng, vì vậy phạm vi gói bị ảnh hưởng rộng hơn so với tập hợp các ứng dụng có thể bị khai thác.
Khi một recovery phrase đã được tạo từ đầu ra của hàm lỗi, các quá trình băm (hashing) hoặc xử lý PBKDF2 sau đó không thể khôi phục lại entropy đã mất, và việc cập nhật gói phần mềm sau này cũng không có tác dụng.
Thiệt hại thực tế và khuyến nghị
Coinspect cho biết lỗ hổng đã bị khai thác trong hai đợt rút tiền. Một đợt quét vào ngày 27 tháng 5 đã lấy đi khoảng 3,14 triệu USD từ 431 tài khoản. Đợt thứ hai từ ngày 30 tháng 5 đến ngày 13 tháng 7 đã lấy đi 2,55 triệu USD từ các địa chỉ gắn liền với 522 seed, bao gồm khoảng 2,18 triệu USDT từ một tài khoản Tron vào ngày 4 tháng 7.
Phân tích sau đó đã theo dõi 2.114 seed được xác định và các địa chỉ liên quan trên các mạng Bitcoin, Ethereum, Tron, Rootstock và Polygon. Tổng cộng, các phân tích cho thấy thiệt hại đo lường được là 5.690.922 USD tính đến ngày 13 tháng 7, con số mà Coinspect mô tả là mức thấp nhất.
Coinspect ước tính từ dữ liệu blockchain rằng số lượng người dùng bị ảnh hưởng lên tới hàng nghìn người trên các mạng tương thích với Ethereum Virtual Machine (EVM) và Bitcoin, nhưng không cung cấp bảng phân tích chi tiết từng ví. Tính đến ngày 6 tháng 8, NanChat là ứng dụng duy nhất được nêu tên đã công bố cảnh báo công khai.
Coinspect đã tư vấn cho người dùng các ví vẫn đang hoạt động nên tham khảo các kênh chính thức của dự án để biết phiên bản hiện tại và hướng dẫn di chuyển tiền. The Hacker News cũng đã liên hệ với Bexo để làm rõ thông tin.
Cảnh báo của NanChat yêu cầu những người dùng đã tạo ví trước phiên bản 1.3.0 nên coi ví đó là đã bị xâm nhập và cần di chuyển tiền. Phiên bản 1.3.0 bao gồm một công cụ để tạo seed mới và chuyển tiền. Người sáng lập và CEO của Coinspect, Juliano Rizzo, đã báo cáo vấn đề này vào ngày 10 tháng 6; bản sửa lỗi đã được tung ra hai ngày sau đó.
Coinspect cho biết họ đã giữ kín các chi tiết kỹ thuật trong hai tháng trong khi thông báo cho các nhà cung cấp và tìm kiếm các địa chỉ bị lộ.
Công cụ kiểm tra công khai của Coinspect chấp nhận các địa chỉ ví, không phải recovery phrase hay private key. Nếu có kết quả khớp (match), điều đó có nghĩa là tài sản gắn liền với cùng một cụm từ đó có thể gặp rủi ro ngay lập tức.