$293 млн за одну транзакцию. Что случилось с Kelp DAO и почему это важно
18 апреля хакеры вывели $293 млн из Kelp DAO. Атака заняла меньше минуты. Подготовка заняла несколько месяцев. Уязвимость была известна 15 месяцев. Разбираем, как это работало, с объяснением каждого термина с нуля.
К сожалению, результат вполне предсказуем. Это следствие известной уязвимости, о которой предупреждали публично за 15 месяцев до атаки. Никто ничего не сделал.
Что такое Kelp DAO и почему rsETH был везде
Kelp DAO — это протокол жидкого рестейкинга на блокчейне Ethereum. Чтобы понять, что это значит, нужно разобрать цепочку с самого начала.
Ethereum работает на механизме Proof of Stake. Держатели ETH могут «заморозить» свои монеты в сети, стать валидаторами и получать за это примерно 3-4% годовых. Минус: замороженные ETH недоступны. Ни продать, ни использовать как залог.
Протоколы вроде Lido решили эту проблему: пользователь вносит ETH, получает взамен stETH, цифровую расписку, которой можно свободно торговать. ETH работает, расписка тоже работает.
EigenLayer пошёл дальше: позволил использовать уже застейканный ETH (или stETH) для защиты ещё и других сетей, получая за это дополнительный доход. Kelp DAO — это интерфейс поверх EigenLayer: принимает stETH/cbETH, отправляет в EigenLayer, выдаёт в ответ rsETH, токен, который одновременно начисляет две награды: стейкинг Ethereum плюс рестейкинг EigenLayer.
Токен rsETH стал популярным залогом в DeFi: его принимали на Aave, SparkLend, Fluid, использовали в пулах ликвидности на десятках платформ. К моменту атаки он был развёрнут на 20+ сетях: Arbitrum, Base, Linea, Blast, Mantle, Scroll и других. Общий circulating supply составлял около 630 000 rsETH, из которых 116 500 (~18%) лежали в резервном мосту.
Что такое мост. Как его взломали
Блокчейн — это распределённый реестр транзакций. Ethereum, Arbitrum, Base, Solana — это разные независимые реестры. Они не знают друг о друге. Токен на Ethereum и токен на Arbitrum — это разные записи в разных системах, между которыми нет прямой связи.
Проблема: rsETH существовал на Ethereum, но пользователи хотели использовать его и на других сетях, там дешевле комиссии, быстрее транзакции. Как перенести токен из одного реестра в другой?
Мост — это программная связка между двумя блокчейнами. Работает по принципу камеры хранения: хочешь перенести токен из сети А в сеть Б, кладёшь его в камеру хранения на стороне А, получаешь квитанцию на стороне Б. Квитанция и есть твой токен в новой сети. Хочешь вернуть — сжигаешь квитанцию, забираешь оригинал.
Kelp DAO использовал для этого протокол LayerZero, инфраструктуру, которая доставляет верифицированные сообщения между блокчейнами. LayerZero работает как курьер: он не хранит деньги, он передаёт команды.
rsETH был развёрнут на 20+ сетях. Kelp DAO использовал схему Hub-and-Spoke, «ступица и спицы»: один центральный резерв на Ethereum держал все оригинальные rsETH, а в остальных сетях существовали только квитанции, токены без собственного обеспечения, ценность которых полностью зависела от того, что лежит в резерве на Ethereum.
Это важно: rsETH на Arbitrum или Base не является самостоятельным активом. Это обещание, что где-то на Ethereum лежит соответствующее количество настоящих rsETH. Если резерв пустеет, все квитанции становятся бумажками.
LayerZero позволяет настраивать DVN, Decentralized Verifier Network. Это сеть независимых валидаторов, которые подписывают каждое кросс-чейн сообщение прежде чем оно будет исполнено. Логика простая: чем больше независимых валидаторов должны согласиться, тем сложнее подделать сообщение.
Безопасная конфигурация: минимум 2-3 независимых валидатора. Kelp DAO использовал конфигурацию 1/1: одной подписи одного валидатора было достаточно. Один валидатор, одна точка отказа.
В январе 2025 года разработчики прямо написали об этом на форуме управления Aave, протокола, который принимал rsETH как залог. Kelp DAO использует конфигурацию 1/1 DVN — это критический риск, нужно расширить. Прошло 15 месяцев. Второй валидатор так и не был добавлен.
Команды LayerZero принимает специальная функция в контракте Kelp, lzReceive. Это входная точка: получила подтверждённое сообщение от LayerZero, выполни команду. Команды четыре: заблокируй, сожги, выпусти, разблокируй. Важно: контракт Kelp не проверяет событие в сети-источнике самостоятельно, он делегирует эту проверку DVN. Это не баг, это фича. Проблема в том, что DVN оказался единственным и скомпрометированным.
DVN — это не просто «подписант». Это инфраструктура, которая наблюдает за блокчейном-источником через RPC-узлы (специализированные серверы доступа к данным блокчейна) и на основании увиденного принимает решение: подписать сообщение или нет. Без подписи DVN контракт на стороне Б ничего не выполняет.
При конфигурации 1 из 1 достаточно скомпрометировать одного участника, и защита полностью снята. Нет второго независимого наблюдателя, который мог бы сказать «стоп, я ничего не видел». При конфигурации 2 из 3, которую используют надёжные протоколы, например подписи от LayerZero, Google Cloud и Polyhedra одновременно, нужно было бы одновременно скомпрометировать двух независимых участников. Это на порядок сложнее.
По данным расследования (финальный отчёт LayerZero и SEAL ещё не опубликован), наиболее вероятный вектор: атака на инфраструктуру DVN через RPC poisoning. Атакующий подменил источники данных, через которые валидатор читал состояние блокчейна, и одновременно создал нагрузку (DDoS), чтобы система переключилась на подконтрольные ему источники. Валидатор увидел несуществующую транзакцию как реальную и честно её подписал. LayerZero получил подписанный пакет, счёл его легитимным и доставил в lzReceive. Контракт увидел валидную подпись и выполнил команду. 116 500 rsETH ушли на адрес атакующего.
Есть и альтернативная версия: компрометация ключа оператора DVN через фишинг или социальную инженерию. Консенсуса пока нет. Но для понимания главного это не меняет ничего: система безопасности свелась к одному узлу, и этот узел был скомпрометирован. Если бы конфигурация была 2 из 3, атака в этом виде была бы невозможна.
Хронология: от первой транзакции до заморозки
За десять часов до атаки атакующий пополнил рабочие адреса через Tornado Cash, сервис-миксер, который разрывает видимую связь между адресом отправителя и получателя. Зачем это нужно: все транзакции в блокчейне публичны и отслеживаемы. Если бы атакующий пополнил кошельки напрямую, следователи смогли бы установить его личность или связать адреса с биржами, где он мог проходить верификацию. Tornado Cash обрывает эту цепочку. Использовались небольшие суммы (пул 1 ETH), чтобы минимизировать след. Сами технические приготовления, изучение кода и подготовка эксплойта, заняли, по всей видимости, недели или месяцы.
17:35 UTC. Атака. Вызов lzReceive через LayerZero EndpointV2. 116 500 rsETH (~$292 млн) переведены на адрес атакующего. Представляет 18% от всего circulating supply токена.
17:44 UTC. Блокчейн-детектив ZachXBT публикует алерт в своём Telegram, перечисляя шесть кошельков атакующего. Именно с этого момента начинается публичная реакция рынка.
~18:00 UTC. Атакующий депонирует rsETH в Aave V3 на Ethereum и Arbitrum как залог и занимает под него wETH (wrapped ether). Залог фактически ничем не обеспечен, но Aave ещё не знает об этом.
18:21 UTC. Kelp DAO исполняет pauseAll через multisig-кошелёк. Замораживаются: LRT Deposit Pool, контракт вывода, LRT Oracle, сами токены rsETH.
18:26 UTC. Атакующий пробует повторить атаку — 40 000 rsETH (~$100 млн). Транзакция откатывается: контракты уже заморожены.
18:28 UTC. Идентичный пакет LayerZero — снова откат. Итого сохранено: ~$100 млн.
20:10 UTC. Kelp DAO публикует пост в X, подтверждает расследование совместно с LayerZero, Unichain, аудиторами и внешними экспертами по безопасности.
Почему один взлом ударил по десяткам платформ
rsETH к моменту атаки не просто лежал в кошельках пользователей. Он активно использовался как залог в кредитных протоколах: пользователи вносили rsETH, получали под него кредиты в других токенах и использовали эти деньги дальше. Это называется rehypothecation: один актив одновременно служит обеспечением в нескольких местах.
Когда резерв моста опустел, rsETH на всех 20+ сетях перестал быть чем-либо обеспечен. Его цена начала падать. Все кредитные протоколы, которые держали rsETH как залог, одновременно обнаружили: залог, под который они выдали кредиты, стремительно обесценивается. Петля паники началась.
Aave V3 + V4 заморозил рынки rsETH в течение нескольких часов. Основатель Stani Kulechov подтвердил: контракты Aave не скомпрометированы, но bad debt по позициям атакующего оценивается в $236 млн. AAVE-токен упал на 10-13%. SparkLend и Fluid заморозили рынки rsETH превентивно. Ethena приостановила LayerZero OFT-мосты с Ethereum mainnet, несмотря на отсутствие прямой экспозиции к rsETH. Lido Earn заморозил депозиты в earnETH: продукт имел косвенную экспозицию к rsETH.
Атакующий не просто украл rsETH, он его сразу использовал. Внёс 116 500 rsETH в Aave как залог и занял под него wETH (wrapped ether, токен, эквивалентный ETH). В момент внесения рыночная цена rsETH ещё не отреагировала, залог выглядел нормальным. Потом rsETH потерял обеспечение и обесценился. Залог стал почти ничего не стоить, а кредит в wETH остался. Нормальная ликвидация невозможна: механизм ликвидации предполагает, что ликвидатор получит ценный залог, но rsETH больше не ценный. Итог: Aave держит долг на $236 млн, который никто не вернёт. Это и называется bad debt, безнадёжная задолженность.
Вывод
В криптоиндустрии устойчиво живёт представление, что открытый исходный код сам по себе является гарантией безопасности: любой может прочитать, любой может проверить, значит, уязвимостям негде спрятаться. Взлом Kelp DAO — очередное опровержение этого тезиса. Код моста был открыт. Уязвимость была публично описана на форуме Aave. Прошло 15 месяцев.
Проблема не в открытости кода. Проблема в том, что открытость кода — это свойство отдельного контракта, а не системы в целом. Уязвимость возникла не внутри кода Kelp DAO и не внутри кода LayerZero. Она возникла в конфигурации, которую команда выбрала при их совместном использовании, и в том, что эту конфигурацию не изменили, когда попросили. Никакой аудит не покрывает операционные решения, принятые после его проведения. Если бы команда добавила второй независимый валидатор, этот конкретный вектор атаки был бы закрыт. Скомпрометировать одновременно двух независимых операторов DVN принципиально сложнее. Но этого не произошло.
Это типичная проблема управления изменениями в любой сложной системе: технический долг накапливается не там, где за ним следят, а там, где за ним перестали следить. В большинстве зрелых индустрий существуют известные уязвимости, исправление которых занимает месяцы и годы. Причины бывают разные. Иногда исправление технически невозможно без полной перестройки архитектуры: классический пример — уязвимости в процессорах типа Spectre и Meltdown, которые встроены в само железо и не лечатся обновлением программного обеспечения. Иногда же исправление элементарно, но его просто не делают: нет процесса, который превращает предупреждение в обязательное действие. В случае Kelp DAO речь шла о втором варианте. В традиционных финансах существуют регуляторы, обязательные стандарты, периодические проверки конфигураций. В DeFi это до сих пор вопрос доброй воли команды.
DeFi-индустрия проходит то, что в корпоративном управлении называют взрослением через инциденты. Любая молодая инфраструктура, авиация, интернет, банковский процессинг, шла этим путём: сначала скорость и открытость, потом серия дорогостоящих сбоев, потом стандарты и регуляторика. Общая взаимосвязанность протоколов делает последствия каждой такой ошибки нелинейными: один скомпрометированный компонент мгновенно распространяет ущерб по всему графу зависимостей.
Именно поэтому индустрии, вероятно, предстоит прийти к частичной централизации ключевых инфраструктурных компонентов, прежде всего мостов и систем верификации. Не потому что децентрализация плохая идея, а потому что безопасные транзакции требуют предсказуемой ответственности. Если за валидацию отвечает один анонимный узел с одним ключом, это не децентрализация. Это иллюзия децентрализации с единой точкой отказа.
Bitcoin и Ethereum как сети не были скомпрометированы. Проблема в протоколах, построенных поверх них: в мостах, в протоколах рестейкинга, в кредитных платформах. Это отдельный слой с отдельными рисками. Смешивать их значит либо огульно пугать, либо огульно защищать. Ни то ни другое не помогает разобраться.
Криптоиндустрия проходит взросление. У этого взросления, судя по всему, будет ещё немало дорогостоящих уроков.