Cosmos Labs предупредила о критической уязвимости в обработке балансов в общем модуле Cosmos EVM. С 20 по 25 августа 2026 года она была использована для вывода средств с шести блокчейнов. Проблема получила идентификатор GHSA-7g4w-cg88-2cq2 и оценку Critical, однако публикация не содержит CVE-идентификатора, классификации слабости или CVSS-балла.
Уязвимы версии младше 0.6.2, а также все версии от 0.7.0 до 0.7.2. Исправление вышло в релизах v0.6.2 и v0.7.2 19 августа. Операторам цепочек настоятельно рекомендуется обновиться до одной из этих версий или более поздней. Это изменение ломает состояние сети и требует скоординированного обновления.
Хронология: от отчёта до эксплуатации
В опубликованном 28 августа разборе инцидента (post-mortem) Cosmos Labs сообщила, что уязвимость была обнаружена в рамках программы bug bounty 25 апреля. Тогда её оценили как не представляющую риска для средств в живых сетях.
«Мы не смогли воспроизвести уязвимость в сетях с 18-значными десятичными числами и ошибочно заключили, что она затрагивает только сети с другими настройками», — говорится в отчёте.
К 13 августа команда подтвердила, что уязвимы все цепочки Cosmos EVM, независимо от конфигурации десятичных чисел. Исправление затем направили через тот же публичный «тихий» процесс патчинга, который компания использует для проблем, не приводящих к потере средств в производственных сетях.
«На этом этапе для уязвимости, которая, как известно, угрожает средствам пользователей в производственных сетях, команда обычно использует защищённые каналы для частного распространения патча. Поскольку патч уже был публично доступен в основной ветке без известной эксплуатации, команда решила, что безопасно продолжить процесс тихого патчинга», — пояснили в Cosmos Labs.
Однако собственная опубликованная политика компании по «тихим» исправлениям предусматривает иной порядок действий для такого класса проблем.
«Когда проблема представляет немедленный или сетевой риск, Cosmos Labs инициирует экстренные меры, частное распространение исправлений или скоординированные обновления до любого публичного раскрытия», — говорится в политике bug bounty, последний раз синхронизированной 27 июля.
Технические детали уязвимости
Ошибка находится в коде, который согласует состояние Ethereum Virtual Machine (EVM) с модулем Cosmos SDK x/bank. EVM StateDB отслеживает только расходуемый баланс аккаунта, в то время как vesting-аккаунты (счёта с поэтапным распределением средств) в состоянии SDK хранят как расходуемый, так и заблокированный баланс. При этом и x/staking, и staking precompile позволяют делегировать заблокированную часть.
Когда vesting-аккаунт делегирует больше, чем его расходуемый баланс, обратная запись после делегирования вычитает полную делегированную сумму из меньшего расходуемого баланса. Это вычитание не проверяется, и баланс заворачивается примерно до 2^256.
Согласование затем начисляет средства при положительной дельте и сжигает при отрицательной. Атакующий может вывести конечную сумму из «завёрнутого» аккаунта или отправить на счёт жертвы 2^256 минус его баланс, чтобы согласование сожгло реальные средства жертвы.
Цепочки на версиях 0.6.x начисляют и сжигают в базовом реестре SDK, поэтому крупная эмиссия вызывает переполнение предложения и останавливает цепочку. Сети на версиях 0.7.x устанавливают балансы напрямую в x/bank и принимают изменения, переживающие преобразование uint256 в int256.
Обе части выполняются в рамках одной транзакции с нулевым чистым изменением предложения, с контракта, развёрнутого на предвычисленном адресе, который сначала был превращён в vesting-аккаунт. Для эксплуатации требуется, чтобы цепочка разрешала создание vesting-аккаунтов без разрешения.
Рекомендации для операторов
Операторам Cosmos EVM рекомендуется предпринять следующие шаги:
- Обновиться до v0.6.2 или v0.7.2 или более поздней версии, применяя обновление как скоординированное изменение сети, поскольку оно ломает состояние.
- Остановить, а не голосовать. Цепочкам, которые не могут обновиться немедленно, предписано остановить производство блоков вместо запуска скоординированного обновления через управление. В рекомендации указано, что не существует митигирования только конфигурацией, а отключение staking precompile устраняет основной путь запуска, но не заменяет патч.
- Закрыть предусловие. Отклонять
MsgCreateVestingAccount,MsgCreatePermanentLockedAccountиMsgCreatePeriodicVestingAccountв ante handler. Vesting-аккаунты, определённые в генезисе, не затрагиваются. - Проверить код на форке. Cherry-pick, который патчит только экспортируемый хелпер, может оставить дублирующуюся неэкспортируемую копию, при этом все тесты будут проходить.
- Применить два исправления, которые рекомендация опускает. Снимок заблокированного баланса и защита модульных аккаунтов — это отдельные изменения, причём защита модульных аккаунтов отклоняет их безусловно, что ломает вызовы EVM из модульного аккаунта.
- Зарегистрировать контакт безопасности в Cosmos Labs, которая во время инцидента узнала о одиннадцати развёртываниях Cosmos EVM, никогда не регистрировавшихся в её каналах безопасности.
Три исправления вместо одного
Рекомендация документирует только одно изменение в апстриме — защиту от переполнения SubBalance, объединённую с main 15 мая как pull request #1176 и перенесённую 13 августа. Ещё два исправления балансов находятся в том же репозитории и не упомянуты в ней.
Pull request #1187, объединённый 20 мая, делает снимок заблокированного баланса аккаунта, чтобы баланс банка корректно восстанавливался после его изменения precompile. Бэкпорты #1187 в обе линии релизов были открыты в тот же день и объединены в течение двадцати четырёх часов, в то время как бэкпорт #1176, столь же ломающее состояние изменение, последовал примерно через девяносто дней.
Коммит 3524ebc под названием «Merge commit from fork» отклоняет любую попытку установить баланс модульного аккаунта.
Участник ZetaChain morde08 в порте всех трёх исправлений, опубликованном 21 августа, заявил, что cherry-pick-патч оставил живой путь форка незапатченным, поскольку форк содержал дублирующиеся неэкспортируемые хелперы, в то время как апстрим-изменение затрагивало только экспортируемый.
Warden Protocol пошёл другим путём два дня спустя, заблокировав создание vesting-аккаунтов полностью.
«Vesting-аккаунты — единственный источник заблокированных балансов в Warden, и ничто не зависит от возможности пользователей создавать их, поэтому удаление этого пути закрывает предусловие, а не полагается на корректность реконструкции», — сказал участник Warden Protocol jlehtimaki в сообщении коммита.
Публичный pull request в форке Cosmos EVM от Push Chain подробно описывал уязвимость и путь её эксплуатации в 07:16 UTC 20 августа, через восемь часов пятнадцать минут после выхода релизов. Первая атака на MANTRA началась одиннадцатью часами пятьюдесятью минутами позже, в 19:06 UTC. Первое частное уведомление по защищённой электронной почте Cosmos Labs отправила в 03:36 UTC 21 августа, примерно через два часа после того, как MANTRA сообщила об эксплуатации.
«За последние 13 месяцев Cosmos Labs выпустила патчи для 37 уязвимостей молча, без точного описания путей эксплуатации публично разработчиками ниже по цепочке», — заявили в Cosmos Labs.
Примечания к релизам v0.6.2 и v0.7.2 оба утверждают, что релиз содержит важные исправления безопасности и должен быть применён как можно скорее, и оба опускают бэкпорт безопасности из своих журналов изменений. The Hacker News подтвердил 29 августа, что ни один из релизов не упоминает pull request, несущие исправление.
Масштаб атаки
По словам Cosmos Labs, ей известно о шести цепочках, на которых была использована уязвимость. Атакующие продали на децентрализованных биржах активы на сумму примерно 2,87 миллиона долларов США по ценам на 19 августа. Эта цифра, по заявлению компании, была предоставлена пострадавшими цепочками и не была независимо проверена. Ещё 2,85 миллиона долларов было продано на централизованных биржах — это оценка Cosmos Labs, основанная на публично доступных данных об объёмах.
Экосистема Cosmos насчитывает более 115 известных публичных блокчейнов, и компания заявила, что не располагает полным реестром сетей, работающих на её программном обеспечении. Этот же пробел ранее привёл к тому, что разработчики ниже по цепочке самостоятельно патчили встроенные уязвимости файловых систем в июле — похожая ситуация сложилась с критической уязвимостью в cPanel, которая даёт root-доступ к серверу, и с уязвимостью в Ruby on Rails Active Storage, позволяющей выполнять код удалённо.
The Hacker News обратилась к Cosmos Labs за комментарием о том, почему патч не был распространён приватно после того, как команда подтвердила, что все цепочки уязвимы, и обновит материал при получении ответа.
Частые вопросы
Какие версии Cosmos EVM уязвимы?
Уязвимы все версии младше 0.6.2, а также версии от 0.7.0 до 0.7.2 включительно. Исправление вышло в релизах v0.6.2 и v0.7.2.
Что делать, если я не могу обновиться немедленно?
Cosmos Labs рекомендует остановить производство блоков, а не пытаться провести скоординированное обновление через управление. Конфигурационных мер, полностью устраняющих уязвимость, не существует.
Можно ли закрыть уязвимость, отключив staking precompile?
Отключение staking precompile устраняет основной путь запуска атаки, но не является заменой патча. Это лишь временная мера.
Что такое vesting-аккаунты и при чём они тут?
Vesting-аккаунты — это счета с поэтапным распределением средств. Именно они создают условия для эксплуатации: уязвимость возникает при делегировании заблокированной части баланса. Операторы могут временно запретить их создание через ante handler.
Мой блокчейн использует Cosmos EVM. Как мне узнать, атакован ли он?
Cosmos Labs известно о шести атакованных цепочках, но полного реестра сетей у компании нет. Если вы подозреваете атаку, проверьте логи на предмет необычных транзакций с vesting-аккаунтами и немедленно свяжитесь с Cosmos Labs.
Почему уязвимость не имеет CVE-идентификатора?
Cosmos Labs опубликовала уязвимость с идентификатором GHSA-7g4w-cg88-2cq2, но без CVE, классификации слабости и CVSS-балла. Это не влияет на серьёзность проблемы.
Что такое «тихий» патч и почему он опасен?
«Тихий» патч — это исправление, которое публикуется в основной ветке без широкого оповещения. В данном случае он позволил атакующим изучить исправление и разработать эксплойт до того, как операторы цепочек узнали о проблеме.
Какие ещё исправления нужно применить, кроме указанных в рекомендации?
Рекомендация упоминает только одно исправление, но в репозитории есть ещё два: снимок заблокированного баланса (PR #1187) и защита модульных аккаунтов (коммит 3524ebc). Без них патч может быть неполным.
Источник: thehackernews.com