Проблемы с безопасностью в криптовалютных кошельках обычно связаны с уязвимостями хранения, неправильной организацией доступа или ошибками в программном обеспечении. Однако в случае с уязвимостью под кодовым названием Milk Sad источник неприятностей лежит намного глубже — в процессе генерации приватных ключей, что немедленно нарушает фундаментальные принципы криптографической безопасности. Появление этой проблемы вызвало громкий резонанс в крипто-сообществе и послужило уроком о том, как критично важно использовать правильные и проверенные методы при создании кошельков. Libbitcoin Explorer (bx) — это широко известный opensource-инструмент, предназначенный для генерации и управления криптовалютными ключами и адресами. Необычайная популярность bx связана с удобством оффлайн-генерации ключей, что многие считают важным для безопасности, особенно при использовании аппаратных кошельков.
Однако уязвимость, выявленная в версии 3.x, выявила серьёзную недоработку. В основе лежала проблема использования небезопасного генератора псевдослучайных чисел (ПГСЧ) — алгоритма Mersenne Twister (mt19937), который является крайне уязвимым в контексте криптографии. Небезопасность Mersenne Twister объясняется тем, что он не является криптографически стойким генератором случайных чисел и может быть полностью восстановлен по достаточно большому количеству выводов. В частности, в bx seed, который отвечает за генерацию энтропии (случайных данных для создания приватных ключей), применялся именно этот ПГСЧ.
Более того, он инициализировался простой 32-битной меткой времени в качестве начального семени, что резко ограничивало число возможных вариантов приватных ключей вплоть до 2^32 — относительно небольшого пространства для взлома. Последствия такой уязвимости оказались катастрофическими. Использование bx для генерации приватных ключей означало, что многие пользователи могли использовать ключи с крайне ограниченной энтропией, легко поддающейся перебору злоумышленниками. Эксперимент с использованием библиотеки faketime показал, что при повторной генерации ключей с одинаковым системным временем получались идентичные BIP39 мнемонические фразы — почти 100% нарушение требований к случайности. Этот недостаток вскоре был использован злоумышленниками для масштабных краж криптовалюты.
Аналитика блокчейнов показала массовое разворовывание миллионов долларов в биткоинах и других монетах. Наиболее резонансным стал взлом 12 июля 2023 года, когда злоумышленники скомпрометировали более тысячи кошельков, похитив свыше 29 биткоинов, что на тот момент оценивалось более чем в 850 тысяч долларов США. Общий ущерб от атак с этим вектором оценивается в сумму около 900 тысяч долларов, включая эфир, Dogecoin, Ripple, Zcash и другие активы. Техническая команда расследователей установила, что жертвами были пользователи, которые строго следовали процедурам безопасности: создание кошельков на изолированных Linux-машинах с использованием BIP39 с мнемоническими фразами из 24 слов, ввод фраз в аппаратные кошельки Ledger и Trezor, а также тщательно защищенный резервный бэкап. Тем не менее, слабоcть генерации случайных чисел положила всё это под угрозу.
Проблема приобретала крайне тяжелый оттенок, так как засекреченность ключей нарушалась на этапе их рождения, и никакие дополнительные меры безопасности в дальнейшем не могли компенсировать фундаментальный дефект. Следствием этого стало появление многочисленных пострадавших кошельков с скомпрометированными приватными ключами в разных временных промежутках — кто-то пострадал несколько лет назад, а кто-то совсем недавно. Связь уязвимости Milk Sad с взломом Trust Wallet, описанным в CVE-2023-31290, ещё более укрепила понимание масштабности проблемы. Аналогично Trust Wallet, в котором для генерации случайных чисел также использовался mt19937, bx допускал возможность относительно простого перебора ключей. Однако детали реализации различались, что означало, что компрометированные кошельки двум проектам не пересекались, что указывает на широкий диапазон пострадавших.
Реакция команды Libbitcoin на сообщение о проблеме была довольно сдержанной: bx seed официально никогда не позиционировался как средство для безопасной генерации ключей для реальных активов и сопровождается предупреждениями о маленькой безопасности. Тем не менее, многие пользователи и публикации использовали примеры с bx seed без указания прямых предупреждений на недостаток криптографической устойчивости, что вызвало неоправданное доверие и, как результат, масштабные потери. Поиски пострадавших кошельков упростились благодаря анализу блокчейна: специалисты создали фильтры для быстрой идентификации подтекстов с потенциально уязвимыми адресами по типичным стандартам адресации (BIP44, BIP49, BIP84) и длинам мнемоник. Результаты показали, что только в Bitcoin-мейннете существует потребность в расследовании более двух с половиной тысяч сообществ с разными шаблонами использования и активности. Большинство таких кошельков имели общие признаки массового автоматизированного создания и использования, что напоминает внутренний тест или некий эксперимент.
Особенно тревожной была невозможность оперативного взаимодействия с далеко не коммерчески организованным проектом Libbitcoin, отсутствием прямых путей оповещения владельцев уязвимых кошельков и невозможностью заморозить компрометированные активы. В отличие от Trust Wallet, где были возможно масштабные программы компенсаций и предупреждения, в случае Milk Sad все оставалось фактически без контроля. Исследователи и пострадавшие оказались в ситуации отчаяния, и самым важным оставалось только своевременное информирование пользователей о последствиях и рекомендациях. Наученный опытом Milk Sad, криптосообщество получило ряд важных уроков. В первую очередь, стоит критически относиться к генерации приватных ключей, не доверяя стандартным «удобным» утилитам без подтверждённой криптографической стойкости случайных чисел.
Повышение безопасности можно достичь, используя BIP39 passphrase — дополнительную фразу, которая значительно увеличивает энтропию, а также используя только проверенное программное обеспечение с открытым исходным кодом и высокими стандартами аудита. Также важным моментом стало требование прозрачности для инструментов и образовательных материалов. Mастерская книга Mastering Bitcoin, в которой в приложениях представлены примеры использования bx seed, теперь будет исправлена, чтобы добавить явные предупреждения о небезопасности seeding через bx seed. Это поможет будущим пользователям избежать подобных ошибок. В итоге уязвимость Milk Sad стала проблемой не только технического характера, но и социального.
Она поставила под угрозу доверие многих пользователей к инструментам крипто-генерации, подчеркнула важность криптографической дисциплины и аккуратности в выборе программных компонентов. Защита криптовалютных средств — это не только про надежность блокчейнов, но и про то, насколько ответственно владелец относится к этапу создания своих приватных ключей. Пока расследование продолжается, а сообщество учится на этой ошибке, надежда возлагается на быстрое реагирование разработчиков и пользователей: обновление программ, переход к более криптографически защищённым генераторам случайных чисел, внимательность при создании кошельков и обязательное использование вспомогательных механизмов защиты. В противном случае риск повторения подобных инцидентов сохраняется, а для пользователей цена ошибки снова станет слишком дорогой.