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

Двенадцать лет разработчики держали дверь приоткрытой. Никто и не заметил.


uhq9ihzpaqau1fplsvjj3x24r6li6pqy.jpg

Двенадцать лет функция, которая должна была создавать случайность, подсовывала кошелькам предсказуемые числа — и теперь стало известно, сколько на этом потеряли пользователи. Компания 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, стоит считать такие фразы восстановления скомпрометированными, даже если они позже были перенесены в другое место, включая аппаратные кошельки. Единственный надёжный способ защититься — сгенерировать новую фразу в актуальной версии приложения и перевести все средства на адреса нового кошелька.