Вернуться в блог
Безопасность

Уроки взлома 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, перекроивший логику кошелька. Аппаратные устройства для подписания тоже не закрывают этот зазор автоматически: устройство, показывающее лишь непрозрачный хеш, просит человека проверить то, что ни один человек разобрать не в силах. Это театр проверки, и он, пожалуй, хуже, чем ничего, потому что порождает уверенность, не добавляя никакого контроля.

Две дорожки от одних и тех же подписантов: на экране — проверенный перевод в хранилище, тогда как подписанные данные — это delegatecall, отдающий кошелёк злоумышленнику
То, что видели подписанты, и то, что подписал кворум, разошлись на уровне интерфейса.

Один фронтенд, один кворум, один провал

Подписанты Bybit держали независимые ключи на отдельных устройствах. Но все они проверяли транзакцию через один и тот же веб-фронтенд, поэтому единственный скомпрометированный интерфейс разом дотянулся до всего кворума. Независимость подписантов требует независимых каналов проверки, а не просто независимых ключей. Кошелёк 3-of-3, все подписанты которого доверяют одному экрану, на практике схлопывается в 1-of-1 — и этой «1» становится тот, кто контролирует интерфейс.

Урок не зависит от схемы. MPC-кошельки заменяют ончейн-контракт распределёнными долями ключа — компромиссы мы сравнивали в материале MPC или MultiSig: честное сравнение, — но кворум MPC заканчивается ровно в том же месте: люди одобряют данные, которые им отрисовал какой-то интерфейс. О приоритетах индустрии кое-что говорит и то, что столько сил уходит на далёкие, экзотические угрозы — в декабре мы разбирали, насколько далеки квантовые компьютеры от ключей Bitcoin, — тогда как крупнейшая кража в истории отрасли не потребовала вообще никакой новой криптографии. Ей понадобился JavaScript.

Практические уроки взлома Bybit

Ничто из перечисленного ниже не требует ни новой криптографии, ни нового оборудования. Это операционная дисциплина — именно поэтому её и пропускают.

  1. Считайте любой экран подписания недоверенным. Интерфейс, который собирает вашу транзакцию, становится мишенью в тот момент, когда ваш баланс оправдывает усилия. Исходите из того, что он может солгать вам ровно в тот день, когда это важнее всего.
  2. Проверяйте на второй, независимой поверхности. Раскодируйте сырую транзакцию — адрес назначения, сумму, calldata, тип операции — на устройстве, у которого нет ничего общего с машиной, где она была собрана. Заставить два экрана лгать одинаково — гораздо более сложная атака, чем когда лжёт один экран в одиночку.
  3. Отказывайтесь от непрозрачных данных. Если подписант не видит, параметр за параметром, что делает транзакция, правильное число подписей для неё — ноль. «Это, наверное, обычный перевод» — вот так и уходят $1,5 млрд.
  4. Ограничьте радиус поражения. Белые списки адресов, дневные и месячные лимиты и разделённые роли превращают одно неудачное одобрение в ограниченный убыток вместо тотального. Для того хранилища Bybit потеря была тотальной, потому что ничто не ограничивало, на что способна одна одобренная транзакция.
  5. Замедляйте рутину. Атаку нарядили в самую обыкновенную операцию, которую выполняла команда, потому что именно обыкновенные операции проверяют меньше всего. Рутина — не повод расслабляться; это костюм, который выберет злоумышленник.

Как это определяет подписание в Ownbit

Из перечисленных уроков взлома Bybit самый долговечный — структурный: финальная проверка должна жить там, куда скомпрометированная машина дотянуться не может. Сценарий холодного кошелька Ownbit построен вокруг этой идеи. Запасной телефон становится изолированным (air-gapped) подписантом; онлайн-телефон работает как watch-only кошелёк, который не хранит ключей, собирает неподписанную транзакцию и передаёт её в виде QR-кода. Офлайн-телефон показывает, что именно его просят подписать, ещё до того, как появится хоть одна подпись, а затем тем же способом возвращает подпись. Перескок через QR намеренно узок: каждая транзакция принудительно проходит через вторую, независимую поверхность, а устройство, хранящее ключи, никогда не загружает веб-страницу, которая могла быть отравлена.

Онлайн watch-only кошелёк собирает неподписанную транзакцию и передаёт её по QR-коду через воздушный зазор на офлайн-телефон, который проверяет её и возвращает по 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-дневный бесплатный период, и ваши ключи в любом случае остаются вашими.