Проект Wintermute стал жертвой взлома, потери составили более 160 млн долларов. Первопричиной стало компрометирование закрытого ключа проекта Wintermute из-за уязвимости в инструменте Profanity, который использовался Wintermute для генерации закрытого ключа и аккаунта Ethereum.
В этом блоге мы опишем первопричину уязвимости в Profanity и расскажем, как её можно эксплуатировать.
Адрес Ethereum
Адрес Ethereum генерируется из Keccak-256 хеша публичного ключа и представляется в виде шестнадцатеричных чисел. Публичный ключ генерируется из закрытого ключа с помощью умножения на эллиптической кривой, этот процесс необратим. Мы можем получить публичный ключ из закрытого, однако мы не можем получить закрытый ключ, имея публичный, без метода перебора (brute force). Заметим, что длина закрытого ключа составляет 256 бит. Имея публичный ключ, вам потребуется максимум 2^256 операций, чтобы найти соответствующий закрытый ключ.
Одним словом, взаимосвязь между закрытым/публичным ключом и адресом Ethereum показана на следующем рисунке.

Первопричина уязвимости
Цель Profanity — найти специальный адрес Ethereum, например, адрес, пять начальных символов которого равны нулю. Для этого Profanity использует следующий метод.

Детальная реализация может немного отличаться.
Обратите внимание, что длина private_key составляет 256 бит (2^256 различных значений). Однако существует уязвимость при генерации закрытого ключа. В частности, начальное значение (seed) (на шаге 1) составляет всего 32 бита, а процесс от seed на шаге 1 до private_key на шаге 2 является детерминированным.
Каково влияние этого на безопасность?
Как эксплуатировать
Допустим, у нас есть адрес Ethereum с большим количеством ценных активов. Если мы сможем получить его закрытый ключ, то мы сможем завладеть этим аккаунтом и вывести все активы. Однако, как обсуждалось ранее, мы должны перебрать всё пространство ключей 2^256, чтобы найти закрытый ключ, что практически невозможно.
Но что, если адрес Ethereum был сгенерирован с помощью инструмента Profanity? Мы можем использовать перебор, чтобы найти закрытый ключ со значительно меньшей сложностью. Нам нужно всего лишь задать seed от 0 до 2^32-1 и повторять тот же процесс, пока мы не найдем закрытый ключ, который может генерировать тот же публичный ключ (и адрес Ethereum). Поскольку нам нужно выполнить максимум 2^32 * порог_цикла операций, это вполне выполнимо за несколько часов, дней или недель при наличии мощного GPU-кластера.
Тем не менее, это все еще оптимизированный алгоритм. Вы можете обратиться к статье от Slowmist для получения более подробной информации.
Выводы
Обеспечение безопасности DeFi-проекта — непростая задача. Помимо аудита кода, мы считаем, что сообществу следует использовать проактивный подход для мониторинга состояния проекта и блокировать атаку еще до того, как она произойдет.
О компании BlockSec
BlockSec — передовая компания в сфере блокчейн-безопасности, основанная в 2021 году группой всемирно известных экспертов по безопасности. Компания стремится повысить безопасность и удобство использования развивающегося мира Web3 для содействия его массовому внедрению. С этой целью BlockSec предоставляет услуги аудита безопасности смарт-контрактов и EVM-сетей, платформу Phalcon для безопасной разработки и проактивной блокировки угроз, платформу MetaSleuth для отслеживания и расследования средств, а также расширение MetaSuites для эффективной работы Web3-разработчиков в криптомире.
На сегодняшний день компания обслужила более 300 уважаемых клиентов, таких как MetaMask, Uniswap Foundation, Compound, Forta и PancakeSwap, и привлекла десятки миллионов долларов США в рамках двух раундов финансирования от выдающихся инвесторов, включая Matrix Partners, Vitalbridge Capital и Fenbushi Capital.
Официальный сайт: https://blocksec.com/
Официальный аккаунт в Twitter: https://twitter.com/BlockSecTeam



