Cайт веб-разработчика, программиста Ruby on Rails ESV Corp. Екатеринбург, Москва, Санкт-Петербург, Новосибирск, Первоуральск

От 2^128 до жалких 2^39: баг 12-летней давности в CryptoJS позволяет сбрутить сид-фразу на обычном ноуте

Двенадцать лет функция, которая должна была создавать случайность, подсовывала кошелькам предсказуемые числа — и теперь стало известно, сколько на этом потеряли пользователи. Компания Coinspect обнаружила, что генератор CryptoJS.lib.WordArray.random() выдавал слабую энтропию при создании секретных фраз восстановления для криптокошельков. Инцидент получил название Ill Bloom.

Слабость затронула пять приложений: RRWallet и Milo закрыты и не получат исправлений, Bexo Wallet и NanChat выпустили обновлённые версии, а Bitcoin Libre устранил проблему ещё в 2024 году. Обновление приложения не делает уже созданные фразы безопасными — их нужно менять вручную.

Из-за ошибки пространство перебора для 128-битной энтропии сократилось с 2^128 до примерно 2^39 вариантов, а для 256-битной — с 2^256 до 2^47. Такие значения можно перебрать на обычном компьютере, поэтому злоумышленники смогли восстанавливать фразы восстановления и получать доступ к кошелькам.

Coinspect зафиксировала два цикла хищений. 27 мая этого года было выведено около 3,14 миллиона долларов с 431 кошелька, а с 30 мая по 13 июля — ещё 2,55 миллиона долларов из кошельков, связанных с 522 скомпрометированными фразами, включая перевод 2,18 миллиона USDT с одного аккаунта в сети Tron. Всего компания насчитала 2114 скомпрометированных фраз и оценивает общий ущерб минимум в 5,69 миллиона долларов.

История уязвимости началась в далёком 2014 году, когда в CryptoJS появился генератор MWC, инициализируемый через Math.random(). Версии 3.2.0 и 3.2.1 временно перешли на криптографически стойкую случайность, но в 3.3.0 разработчики вернули старый код, посчитав изменение слишком критичным для совместимости. Окончательно ошибку устранили в версии 4.0.0, вышедшей в феврале 2020 года.

5 августа сопровождающий проекта Эван Восберг опубликовал уведомление об уязвимости с критическим рейтингом и оценкой 9,0 по шкале CVSS. Под угрозой оказались только те приложения, где функция применялась для генерации ключевых данных — само наличие библиотеки в проекте риска не создаёт.

Владельцам кошельков, созданных приложениями с уязвимой версией CryptoJS ниже 4.0.0, стоит считать такие фразы восстановления скомпрометированными, даже если они позже были перенесены в другое место, включая аппаратные кошельки. Единственный надёжный способ защититься — сгенерировать новую фразу в актуальной версии приложения и перевести все средства на адреса нового кошелька.

SecurityLab