Уроки взлома Bybit: интерфейс подписания — слабейшее звено мультиподписи
21 февраля около $1,5 млрд в ETH и токенах застейканного ETH покинули один из холодных кошельков Bybit в одной-единственной одобренной транзакции — крупнейшая кража криптовалюты за всю историю. Кошелёк был на мультиподписи. Все необходимые подписанты поставили подпись. И, насколько показало расследование, ни один приватный ключ так и не был украден. Если вы вынесете из уроков взлома Bybit только одно, пусть это будет вот что: криптография выстояла, а деньги всё равно ушли.
Это не аргумент против мультиподписи. Мы сами создаём кошелёк с мультиподписью и по-прежнему считаем подписание по схеме M-of-N самым независимо проверяемым способом хранить серьёзные средства. Это аргумент о том, где на самом деле находится поверхность атаки. Мультиподпись распределяет хранение ключей; но сама по себе она не распределяет проверку. Каждая подпись ровно настолько заслуживает доверия, насколько подписант понимает содержимое данных перед собой, — а 21 февраля это понимание сфабриковал злоумышленник.
Что известно спустя две недели
На момент написания этого текста картина, собранная из заявлений Bybit, раскрытия Safe после инцидента и публичной атрибуции ФБР, непротиворечива. Команда Bybit собиралась выполнить рутинный перевод с холодной мультиподписи Ethereum на «тёплый» кошелёк, используя веб-интерфейс Safe{Wallet}, которым пользовалась уже много раз. Каждый подписант видел легитимную на вид транзакцию: знакомый интерфейс, ожидаемый порядок действий, ничего, что нарушило бы мышечную память.
Но кворум на самом деле авторизовал совсем другое. Транзакция незаметно изменила логику самого смарт-контракта кошелька, подставив реализацию, которую контролировал злоумышленник. Как только подлинные подписи попали в блокчейн, хранилище подчинилось своей новой логике, и около 400 000 ETH и токенов застейканного ETH — примерно $1,5 млрд на тот момент — ушли наружу. Расследование Safe возвело компрометацию к машине разработчика: вредоносный код доставлялся через фронтенд и был нацелен именно на подписантов Bybit; для всех остальных интерфейс вёл себя нормально. В конце февраля ФБР публично приписало операцию северокорейской группировке Lazarus Group, отслеживаемой под названием TraderTraitor.
Ещё два факта заслуживают такого же внимания. Bybit сохранила платёжеспособность и продолжала обрабатывать выводы всё это время. И ни на одном этапе не был извлечён ключевой материал: ни одну seed-фразу не выудили фишингом, ни одно подписывающее устройство не изъяли, ни один порог не был математически обойдён.
Ключи выстояли — и в этом вся суть
Кошелёк с мультиподписью требует, чтобы M из N независимых ключей одобрили транзакцию, прежде чем средства смогут сдвинуться с места. 21 февраля это свойство сработало безупречно. Подписи были подлинными, кворум — легитимным, а контракт исполнил ровно то, что было подписано. Злоумышленник и не пытался одолеть математику; он устроил так, чтобы кворум добровольно подписал ложь. Взлом Bybit был провалом проверки транзакции, а не криптографии мультиподписи.
Подпись — это мнение о содержимом данных. Если данные, которые вы проверили, — не те данные, которые вы подписали, число подписантов не имеет значения.
Заголовки в духе «взломали холодный кошелёк» упускают это различие, а различие важно, потому что именно оно определяет, что чинить. Холодное хранение сделало свою узкую работу: ключи ни разу не коснулись машины с выходом в интернет. Мультиподпись сделала свою узкую работу: ни один подписант не мог действовать в одиночку. Подвёл же тот компонент, который почти никто не вписывает в свою модель угроз, — экран.
Слепое подписание — точное определение
Слепое подписание — это одобрение транзакции, истинное содержимое которой подписант не может проверить самостоятельно. В Ethereum то, что подписант криптографически одобряет, — это хеш структурированных данных транзакции, а не понятная человеку сводка на экране. Какая-то программа должна раскодировать эти данные обратно в намерение — адрес назначения, сумму, вызов контракта — и подписант наследует всё, что эта программа заявляет. Если интерфейс лжёт, человек подтверждает вымысел, а блокчейн исполняет правду.
Транзакция Bybit использовала именно этот зазор. Единственное поле, которое большинство интерфейсов не выводят на видное место, — тип операции — превратило внешне обычный перевод в delegatecall, перекроивший логику кошелька. Аппаратные устройства для подписания тоже не закрывают этот зазор автоматически: устройство, показывающее лишь непрозрачный хеш, просит человека проверить то, что ни один человек разобрать не в силах. Это театр проверки, и он, пожалуй, хуже, чем ничего, потому что порождает уверенность, не добавляя никакого контроля.
Один фронтенд, один кворум, один провал
Подписанты Bybit держали независимые ключи на отдельных устройствах. Но все они проверяли транзакцию через один и тот же веб-фронтенд, поэтому единственный скомпрометированный интерфейс разом дотянулся до всего кворума. Независимость подписантов требует независимых каналов проверки, а не просто независимых ключей. Кошелёк 3-of-3, все подписанты которого доверяют одному экрану, на практике схлопывается в 1-of-1 — и этой «1» становится тот, кто контролирует интерфейс.
Урок не зависит от схемы. MPC-кошельки заменяют ончейн-контракт распределёнными долями ключа — компромиссы мы сравнивали в материале MPC или MultiSig: честное сравнение, — но кворум MPC заканчивается ровно в том же месте: люди одобряют данные, которые им отрисовал какой-то интерфейс. О приоритетах индустрии кое-что говорит и то, что столько сил уходит на далёкие, экзотические угрозы — в декабре мы разбирали, насколько далеки квантовые компьютеры от ключей Bitcoin, — тогда как крупнейшая кража в истории отрасли не потребовала вообще никакой новой криптографии. Ей понадобился JavaScript.
Практические уроки взлома Bybit
Ничто из перечисленного ниже не требует ни новой криптографии, ни нового оборудования. Это операционная дисциплина — именно поэтому её и пропускают.
- Считайте любой экран подписания недоверенным. Интерфейс, который собирает вашу транзакцию, становится мишенью в тот момент, когда ваш баланс оправдывает усилия. Исходите из того, что он может солгать вам ровно в тот день, когда это важнее всего.
- Проверяйте на второй, независимой поверхности. Раскодируйте сырую транзакцию — адрес назначения, сумму, calldata, тип операции — на устройстве, у которого нет ничего общего с машиной, где она была собрана. Заставить два экрана лгать одинаково — гораздо более сложная атака, чем когда лжёт один экран в одиночку.
- Отказывайтесь от непрозрачных данных. Если подписант не видит, параметр за параметром, что делает транзакция, правильное число подписей для неё — ноль. «Это, наверное, обычный перевод» — вот так и уходят $1,5 млрд.
- Ограничьте радиус поражения. Белые списки адресов, дневные и месячные лимиты и разделённые роли превращают одно неудачное одобрение в ограниченный убыток вместо тотального. Для того хранилища Bybit потеря была тотальной, потому что ничто не ограничивало, на что способна одна одобренная транзакция.
- Замедляйте рутину. Атаку нарядили в самую обыкновенную операцию, которую выполняла команда, потому что именно обыкновенные операции проверяют меньше всего. Рутина — не повод расслабляться; это костюм, который выберет злоумышленник.
Как это определяет подписание в Ownbit
Из перечисленных уроков взлома Bybit самый долговечный — структурный: финальная проверка должна жить там, куда скомпрометированная машина дотянуться не может. Сценарий холодного кошелька Ownbit построен вокруг этой идеи. Запасной телефон становится изолированным (air-gapped) подписантом; онлайн-телефон работает как watch-only кошелёк, который не хранит ключей, собирает неподписанную транзакцию и передаёт её в виде QR-кода. Офлайн-телефон показывает, что именно его просят подписать, ещё до того, как появится хоть одна подпись, а затем тем же способом возвращает подпись. Перескок через QR намеренно узок: каждая транзакция принудительно проходит через вторую, независимую поверхность, а устройство, хранящее ключи, никогда не загружает веб-страницу, которая могла быть отравлена.
Для команд Корпоративный MultiSig применяет уроки о радиусе поражения напрямую: белые списки адресов, чтобы средства не могли попасть на неуказанный адрес назначения независимо от того, кто подписывает, дневные и месячные лимиты трат, роли Owner, Signer и Security Admin и экстренная пауза. Эти механизмы не делают обман невозможным — полностью не делает ничто, — но ограничивают то, во что может обойтись одно подделанное одобрение.
И одно честное замечание о нас самих. Серверы Ownbit координируют подписание, но никогда не хранят ключи пользователей; каждый ключ в мультиподписи Ownbit — это стандартная seed-фраза BIP39, а восстановление работает без нашей инфраструктуры. Минимизированное доверие режет в обе стороны: та же конструкция, что ограничивает вред, который мог бы причинить вам скомпрометированный координатор, — это и есть причина, по которой мы можем писать о худшей неделе Bybit, не притворяясь, будто мы невосприимчивы к целенаправленным атакам. Ограниченный ущерб, а не заявленная неуязвимость, — вот стандарт, которого стоит требовать от вендоров.
Часто задаваемые вопросы
Был ли взлом Bybit провалом мультиподписи?
Нет. Контракт мультиподписи корректно обеспечил соблюдение своего порога, и ни один приватный ключ не был украден. Необходимых подписантов обманом заставили одобрить транзакцию, изменившую собственную логику кошелька, — провал заключался в проверке транзакции, а не в криптографии мультиподписи. Правильный ответ — добавить независимую проверку, а не отказываться от мультиподписи.
Что такое слепое подписание в крипте?
Слепое подписание — это одобрение транзакции, истинное содержимое которой вы не можете проверить самостоятельно. Технически подписанты одобряют хеш данных транзакции и зависят от того, честно ли интерфейс их раскодирует. Если этот интерфейс скомпрометирован, подписант подтверждает то, что видит, авторизуя при этом нечто совершенно иное.
Сколько украли при взломе Bybit?
Около $1,5 млрд в ETH и токенах застейканного ETH — примерно 400 000 ETH, — что делает это крупнейшей кражей криптовалюты за всю историю по состоянию на начало марта 2025 года. ФБР приписало атаку северокорейской группировке Lazarus Group. Bybit сохранила платёжеспособность и продолжала обрабатывать выводы клиентов.
Как подписантам мультиподписи защититься от скомпрометированного фронтенда?
Проверяйте каждую транзакцию на втором устройстве, у которого нет ничего общего с машиной, где она была собрана, и отказывайтесь подписывать данные, которые не можете раскодировать параметр за параметром. Затем добавьте структурные ограничения — белые списки адресов, лимиты трат, разделение ролей, — чтобы одно обманутое одобрение не могло опустошить весь кошелёк.
Если эти уроки взлома Bybit подтолкнули вас пересмотреть собственный процесс подписания, этот инстинкт верен — а проверить более надёжный процесс стоит одного вечера, а не целого казначейства. Сценарий холодного кошелька Ownbit позволяет запасному телефону проверять и подписывать транзакции полностью офлайн, а Корпоративный MultiSig добавляет белые списки, лимиты и роли для средств, которые подотчётны более чем одному человеку. Каждый новый пользователь получает 7-дневный бесплатный период, и ваши ключи в любом случае остаются вашими.