Экосистема Cosmos, признанная по всему миру одной из крупнейших и наиболее заметных блокчейн-сетей, отдает предпочтение межсетевой совместимости блокчейнов. Этот фокус является ключевым для обеспечения беспрепятственного взаимодействия между различными блокчейнами. В экосистеме действуют несколько ведущих проектов, таких как Celestia и dYdX v4, все они разработаны с использованием Cosmos SDK и протокола IBC. Растущее предпочтение разработчиков компонентам Cosmos привело к увеличению влияния проблем безопасности в экосистеме. Примером является уязвимость Dragonfruit в Cosmos SDK, которая нарушила работу множества основных публичных блокчейнов.
Учитывая децентрализованный характер основных компонентов Cosmos, разработчикам часто требуется адаптировать и расширять эти компоненты на основе конкретных функциональных потребностей. Это приводит к фрагментации проблем безопасности в экосистеме Cosmos. Следовательно, существует настоятельная необходимость в структурированном подходе к пониманию и решению этих проблем безопасности. Целью данной статьи является предоставление всестороннего анализа текущего пейзажа безопасности в экосистеме Cosmos и определение эффективных стратегий реагирования.
Команда CertiK посвящена укреплению безопасности сети Cosmos и широкой экосистемы Web3 через постоянные исследования и разработки. Мы рады поделиться нашими результатами и идеями с вами через регулярные отчеты о безопасности и обновления технических исследований. Если у вас есть какие-либо вопросы, наша команда всегда доступна для связи.
Здесь приведен полный текст “Руководства по безопасности экосистемы Cosmos” 👇.
Cosmos отличается тем, что предлагает эффективную модель межцепочной связи, особенно выгодную для публичных цепей с определенной вертикальной направленностью. Его модульная блокчейн-инфраструктура дает возможность разработчикам приложений выбирать и использовать публичные цепи, соответствующие их конкретным требованиям.
В основе экосистемы Cosmos лежит протокол межблокчейновой связи (IBC), который соединяет приложения и протоколы различных независимых блокчейнов. Это облегчает не только беспрепятственный перевод активов и данных, но также соответствует видению Cosmos создания 'интернета блокчейнов'. Этот концепт предполагает обширную сеть автономных и легко развиваемых блокчейнов, взаимосвязанных для расширения и взаимодействия.
Участие и исследование CertiK в безопасности Cosmos
В течение длительного времени CertiK глубоко изучал экосистему Cosmos. Наша команда приобрела значительный опыт в решении проблем безопасности в этой среде. В этом отчете мы поделимся нашими идеями и открытиями о безопасности экосистемы Cosmos, сосредотачиваясь на четырех ключевых областях: безопасности Cosmos SDK, безопасности протокола IBC, безопасности CometBFT и безопасности CosmWasm. Наше обсуждение охватит все, начиная от фундаментальных компонентов экосистемы Cosmos до ее фундаментальных и прикладных цепочек. Анализируя и экстраполируя связанные проблемы, мы стремимся представить всеобъемлющий, сверху-вниз анализ критических аспектов безопасности в экосистеме Cosmos.
Учитывая сложность и разнообразие экосистемы Cosmos, она сталкивается с широким спектром проблем безопасности. В этом отчете основное внимание уделяется наиболее характерным и значительным угрозам экологической цепи Cosmos. Для получения дополнительной информации или обсуждения других аспектов безопасности мы призываем вас обратиться к инженерам по безопасности CertiK.
В основе масштабируемости Interchain лежит CometBFT, передовой алгоритм консенсуса, неотъемлемая часть обеспечения безопасности, децентрализации и целостности экосистемы Interchain. Этот алгоритм представляет собой комбинацию из двух основных компонентов: ядра CometBFT, служащего фундаментальным механизмом консенсуса, и универсального интерфейса блокчейна приложений (ABCI). Сочетая элементы PBFT (Practical Byzantine Fault Tolerance) и Bonded Proof of Stake (PoS), CometBFT синхронизирует узлы для поддержания точных записей транзакций, тем самым играя ключевую роль в консенсусе валидаторов в среде Interchain.
Космос SDK: Ускорение разработки блокчейна с помощью модульности
SDK Cosmos - это мощный инструментарий, который упрощает и ускоряет разработку блокчейна. Его модульная конструкция и возможность подключения функций позволяют разработчикам строить свои собственные блокчейны или функциональные компоненты поверх алгоритма консенсуса CometBFT. Этот подход не только облегчает разработку, но и значительно сокращает цикл разработки. Эффективность SDK подтверждается его использованием во многих проектах, включая Cronos, Kava и недавно запущенный dYdX V4. В будущем SDK Cosmos планирует улучшить свою модульность и внедрить новые функции, обеспечивая создание более сложных и модульных приложений, тем самым способствуя развитию более обширной и надежной экосистемы.
Протокол IBC: Обеспечение взаимодействия и масштабируемости между блокчейнами
Протокол межсетевого взаимодействия (IBC) является ключевым элементом в обеспечении безопасного, децентрализованного и разрешения-не требующего передачи данных между блокчейнами в сети Cosmos. Учитывая, что Cosmos является децентрализованной сетью, состоящей из нескольких независимых и параллельных блокчейнов, соединенных через технологию ретрансляции, роль протокола IBC в улучшении масштабируемости и совместимости центральна. Текущий акцент Фонда межцепочного взаимодействия направлен на улучшение этих аспектов протокола IBC с целью укрепления беспрепятственного взаимодействия между блокчейнами, приложениями и смарт-контрактами в экосистеме Cosmos.
CosmWasm: Упрощение развертывания децентрализованных приложений
CosmWasm (Cosmos WebAssembly) - это фреймворк смарт-контрактов, разработанный специально для экосистемы Cosmos. Основанный на WebAssembly, он позволяет разработчикам развертывать децентрализованные приложения без необходимости конкретных разрешений. Этот фреймворк позволяет разработчикам блокчейна отделить разработку продукта от разработки блокчейна, уменьшая нагрузку на обновления валидаторов. Особенности CosmWasm включают модульную архитектуру, интеграцию с Cosmos SDK и возможности межцепной коммуникации. Cosmos SDK и протокол IBC, будучи относительно зрелыми, широко используются в текущей экосистеме Cosmos.
Адаптация и настройка в экосистеме Космос
Для разработчиков цепочек в экосистеме Cosmos Cosmos SDK удовлетворяет большинство потребностей в настройке. Во время межцепочных операций разработчики цепочек могут настраивать свои модули IBC для специальных операций или оптимизации производительности. Хотя некоторые цепочки модифицируют базовые движки, такие как CometBFT Core, ограничения пространства не позволяют проводить подробное обсуждение таких модификаций в данном отчете. Поэтому данное исследование в основном фокусируется на технических нюансах и соображениях безопасности Cosmos SDK и протокола IBC.
В своей сущности Cosmos SDK разработан для упрощения создания индивидуальных блокчейн-приложений и облегчения безшовного взаимодействия между разнообразными блокчейнами. Его заметные особенности включают в себя модульную структуру, обширные возможности настройки, интеграцию с ядром CometBFT для достижения консенсуса и внедрение интерфейсов IBC, что всё вместе способствует привлекательности для разработчиков. Одним из ключевых преимуществ Cosmos SDK является его зависимость от движка консенсуса CometBFT Core, обеспечивающего надежные меры безопасности. Этот движок играет важную роль в защите сети от злонамеренных атак и в защите активов и данных пользователей. Модульная природа SDK дает пользователям возможность легко создавать индивидуальные модули. Однако разработчикам необходимо быть бдительными, поскольку уязвимости безопасности могут всё равно возникать при развёртывании приложений с использованием Cosmos SDK.
С точки зрения проверки безопасности крайне важно тщательно оценить потенциальные угрозы безопасности с различных точек зрения. В отличие от этого, в исследованиях безопасности акцент смещается на выявление уязвимостей, которые могут иметь серьезные последствия. Данный подход направлен на оперативное смягчение основных угроз безопасности, тем самым предлагая более эффективную помощь сервисам, интегрирующим SDK. Крайне важно выявлять и анализировать уязвимости, которые представляют серьезные риски и имеют широкие последствия.
Одной из ключевых точек в рамках Cosmos SDK является интерфейс ABCI, который является неотъемлемой частью экосистемы Cosmos. Этот интерфейс включает в себя четыре основных компонента: BeginBlock, EndBlock, CheckTx и DeliverTx. BeginBlock и EndBlock непосредственно участвуют в логике выполнения отдельных блоков. В отличие от них, CheckTx и DeliverTx занимаются обработкой sdk.Msg, базовой структурой данных для передачи сообщений в экосистеме Cosmos.
Для понимания и устранения упомянутых уязвимостей безопасности сначала необходимо осознать жизненный цикл транзакции в экосистеме Cosmos. Транзакции происходят от пользовательских агентов, где они создаются, подписываются, а затем транслируются в узлы блокчейна. Метод CheckTx используется узлами для проверки деталей транзакции, таких как подписи, баланс отправителя, последовательность транзакции и предоставленный газ. Действительные транзакции ставятся в очередь в пуле ожидания включения в блок, в то время как недействительные отклоняются, и пользователям передаются сообщения об ошибках. Во время обработки блока применяется метод DeliverTx для обеспечения транзакционной согласованности и детерминизма.
В SDK Cosmos жизненный цикл транзакции представляет собой многоэтапный процесс, охватывающий создание, валидацию, включение в блок, изменение состояния и окончательную фиксацию. Этот процесс можно разделить на следующие этапы:
Создание транзакции: Пользователи генерируют транзакции с помощью различных инструментов, таких как интерфейсы командной строки (CLI) или клиенты фронтенда.
Добавление в Mempool: После создания транзакции попадают в пул памяти (mempool). Здесь узлы отправляют сообщение ABCI (Application BlockChain Interface), известное как CheckTx, на уровень приложения для проверки валидности. Транзакции проходят декодирование из байтового формата в формат Tx. Каждый sdk.Msg внутри транзакции подвергается предварительной безсостоятельной проверке с помощью функции ValidateBasic(). Кроме того, если в приложение включен anteHandler, его логика выполняется перед функцией runTx, которая приводит к выполнению функции RunMsgs() для обработки содержимого sdk.Msg. Успешная проверка CheckTx приводит к тому, что транзакция ставится в очередь в локальном пуле памяти (mempool), готовая к включению в следующий блок, и одновременно транслируется на узлы пиров через P2P.
Включение в предложенный блок: В начале каждого раунда инициатор собирает блок, содержащий недавние транзакции. Валидаторы, ответственные за поддержание консенсуса, либо утверждают этот блок, либо выбирают пустой блок.
Изменения состояния: Подобно CheckTx, процесс DeliverTx итерирует через транзакции блока. Однако он работает в режиме «Deliver», выполняя изменения состояния. MsgServiceRouter направляет различные транзакционные сообщения в соответствующие модули, где каждое сообщение обрабатывается в Msg Server. После выполнения сообщения дополнительные проверки гарантируют допустимость транзакции. Если какая-либо проверка не проходит, состояние возвращается к предыдущему. Счетчик газа отслеживает потребленный газ во время выполнения. Ошибки, связанные с газом, такие как недостаточное количество газа, приводят к откату изменений состояния, аналогично сбоям выполнения.
Блоковое обязательство: После получения достаточного количества голосов валидатора узел фиксирует новый блок в блокчейне. Это действие завершает переходы состояний на уровне приложения, отмечая завершение процесса транзакции.
)
[Этот раздел включает диаграмму, изображающую жизненный цикл транзакций в экосистеме Cosmos.]
[В следующем разделе представлена конкретная логика выполнения ключа ABCI в Cosmos SDK, полезная для понимания и анализа уязвимостей, обсуждаемых позже.]
)
)
Учитывая уровень опасности и масштаб влияния, мы в основном сосредотачиваемся на критических и существенных уровнях уязвимостей безопасности, которые обычно могут вызвать следующие риски:
Операция остановки цепи- Финансовые потери- Влияющий на состояние системы или нормальную работуПричины этих опасностей часто являются следующими типами уязвимостей безопасности:
Отказ в обслуживании- Неверные настройки состояния- Отсутствие или неразумная верификация- Проблемы уникальности- Проблемы алгоритма консенсуса- Логические недочеты в реализации- Проблемы функционала языка### Анализ уязвимостей в экосистеме CosmosКосмос-экосистема, известная своей модульной структурой, часто сталкивается с межмодульным использованием и взаимным вызовом в своих цепочках. Эта сложность приводит к ситуациям, когда триггерная траектория уязвимости и местоположение переменных несогласованы. Понимание этих уязвимостей критично не только для рассмотрения триггерной траектории, но и для управляемой траектории критических переменных уязвимости. Этот двойной фокус помогает лучше определить и классифицировать модель уязвимости.
Первый тип часто встречается в уязвимостях отказа в обслуживании: они часто являются следствием недостаточной обработки сбоев и операций с границами цикла, оказываемые пользователем. Такие уязвимости могут привести к приостановке цепи или значительному замедлению.
Cosmos SDK и CometBFT, ключевая инфраструктура в экосистеме Cosmos, используются не только базовыми цепями в Cosmos, но и различными прикладными цепями на основе их архитектуры. Все они следуют правилам интерфейса ABCI CometBFT. Фокус их поверхности атак также находится на их интерфейсе ABCI, и большинство уязвимостей безопасности, которые могут вызвать остановку цепи, являются проблемами, которые могут непосредственно повлиять на выполнение блочного кода. Поэтому пути их возникновения обычно могут быть прослежены до интерфейсов BeginBlock и EndBlock.
Второй тип ситуации включает уязвимости, затрагивающие консенсус: они часто связаны с реализацией на различных цепочках и включают в себя проблемы валидации логики обработки, калибровки времени и случайности. Эти уязвимости ударяют в сердце принципа децентрализации блокчейна. Хотя они могут не казаться серьезными сначала, в руках зловредного актера они представляют существенную угрозу безопасности.
Примеры первого типа
Пример 1: Анализ уязвимости проекта SuperNova
Фон уязвимости: В процессе распределения эмиссии в рамках проекта SuperNova возникает критическая проблема из-за отсутствия проверки адреса. Это упущение может привести к сбоям в работе и, следовательно, к финансовым потерям. В частности, модуль эмиссии, который является ключевым для генерации токенов, зависит от суммы ставки. Однако этот процесс подвержен ошибкам. Например, если назначенный пул не существует или если в адрес контракта внесена ошибка, это может привести к сбоям в модуле эмиссии. Такие ошибки могут остановить всю операцию блокчейна. Кроме того, в модуле пула вознаграждений отсутствует проверка адреса контракта пула. Это упущение означает, что любой сбой в операции распределения может вызвать немедленную остановку блокчейна.
Местоположение уязвимости: Ссылка на GitHub SuperNova
Уязвимый фрагмент кода:
Путь запуска уязвимости:
BeginBlocker (/x/mint/keeper/abci.go)
Keeper.DistributeMintedCoin
Keeper.distributeLPIncentivePools
PoolIncentiveKeeper.GetAllIncentivePool (/x/mint/keeper/keeper.go)
Патч уязвимости:
https://github.com/Carina-labs/nova/commit/538abc771dea68e33fd656031cbcf2b8fe006be0
Патч находится в модуле обработки сообщений poolincentive (x/poolincentive/types/msgs.go), а не в модуле монетопечатания. Он добавил проверку адреса к сообщению MsgCreateCandidatePool, чтобы исключить возможность неправильных адресов из корня.
Пример 2: Проект по безопасности межцепочки Космоса
Project address: Ссылка на GitHub по безопасности межцепочки Cosmos
Фон уязвимости: Валидаторы могут замедлить цепочку поставщиков, отправляя несколько сообщений AssignConsumerKey в том же блоке. В функции AssignConsumerKey в файле x/ccv/provider/keeper/key_assignment.go валидаторы могут назначать разные consumerKeys для утвержденных цепочек потребителей. AddressList consumerAddrsToPrune увеличивается на один элемент для выполнения этой операции. Поскольку этот AddressList итерируется в EndBlocker в файле x/ccv/provider/keeper/relay.go, атакующие могут использовать это для замедления цепочки поставщиков. Для этой атаки злоумышленник может создавать транзакции с несколькими сообщениями AssignConsumerKey и отправлять их в цепочку поставщиков. Кардинальность AddressList consumerAddrsToPrune будет такой же, как у отправленных сообщений AssignConsumerKey. Следовательно, выполнение EndBlocker займет больше времени и ресурсов, чем ожидалось, замедляя или даже останавливая цепочку поставщиков.
Местоположение уязвимости: Ссылка на GitHub по безопасности межцепочного взаимодействия Cosmos
Уязвимый сегмент кода:


Путь запуска уязвимости:
msgServer.AssignConsumerKey
Keeper.AssignConsumerKey
AppModule.EndBlock
EndBlockCIS
Обработка принятых пакетов VSC Matured
ОбработатьVSCMaturedPacket
PruneKeyAssignments
Пример 3: Проект Quicksilver - Модуль Airdrop
Фон уязвимости: BeginBlocker и EndBlocker - это необязательные методы, которые разработчики модулей могут реализовать в своем модуле. Они запускаются в начале и в конце каждого блока соответственно. Использование сбоев для обработки ошибок в методах BeginBlock и EndBlock может привести к остановке цепочки в случае ошибок. EndBlocker не учитывал, достаточно ли у модуля токенов для завершения незавершенных роздач, что могло вызвать сбой и остановить цепочку.
Местоположение уязвимости: Ссылка на Quicksilver GitHub
Сегмент кода уязвимости:


Уязвимость патч: AppModule.EndBlock
Keeper.EndBlocker
Keeper.EndZoneDrop
Патч уязвимости: https://github.com/quicksilver-zone/quicksilver/blob/20dc658480b1af1cb323b4ab4a8e5925ee79a0ed/x/airdrop/keeper/abci.go#L16
Код обработки паники был удален и заменен журналированием ошибок.
Пример 4: Проект по безопасности межцепочечной связи Cosmos
Адрес проекта: Ссылка на GitHub Cosmos Interchain Security
Фон уязвимости: Злоумышленники могут осуществить атаку отказа в обслуживании, отправляя несколько токенов на адрес вознаграждения цепочки-поставщика. В потоке выполнения EndBlocker цепочки-потребителя функция SendRewardsToProvider, определенная в x/ccv/consumer/keeper/distribution.go, извлекает баланс всех токенов в tstProviderAddr и отправляет их на цепочку-поставщика. Для этого она должна перебирать все найденные токены в адресе вознаграждения и отправлять каждый из них через IBC на цепочку-поставщика. Поскольку любой может отправлять токены на адрес вознаграждения, злоумышленники могут создавать и отправлять большое количество токенов различных denom, например, используя цепочку с модулем фабрики токенов, чтобы инициировать атаку отказа в обслуживании. Поэтому выполнение EndBlocker займет больше времени и ресурсов, чем ожидалось, замедляя или даже останавливая цепочку-потребителя.
Местоположение уязвимости: Ссылка на GitHub по безопасности межцепочечного Cosmos
Уязвимый сегмент кода:

Путь запуска уязвимости:
AppModule.EndBlock
КонецБлока
EndBlockRD
Отправить вознаграждения поставщику
Пример 1
Фон уязвимости: Cosmos SDK Security Advisory Jackfruit
Недетерминированное поведение в методе ValidateBasic модуля x/authz в Cosmos SDK может легко привести к остановке консенсуса. Структура сообщения MsgGrant в модуле x/authz включает поле Grant, которое содержит время истечения, предоставленное пользовательским определением авторизации. В процессе проверки в ValidateBasic() в структуре Grant он сравнивает свою временную информацию с информацией о локальном времени узла, а не с информацией о времени блока. Поскольку локальное время недетерминировано, метки времени могут различаться между узлами, что приводит к проблемам консенсуса.
Объявление о уязвимости:
Уязвимый сегмент кода:

Патч уязвимости: Ссылка на сравнение GitHub Cosmos SDK
Проблемы, такие как метки времени, возникают не только в фундаментальных компонентах, таких как Cosmos SDK, но и происходили в различных прикладных цепочках.
Пример 2
Фон уязвимости: SuperNova, проект nova
Адрес проекта: Ссылка на GitHub SuperNova
Использование time.Now() возвращает метку времени операционной системы. Местное время субъективно и, следовательно, недетерминированно. Поскольку могут быть небольшие различия в метках времени отдельных узлов, цепь может не достичь консенсуса. В модуле ICAControl функция отправки транзакции использует time.Now() для получения метки времени.
Местоположение уязвимости: https://github.com/Carina-labs/nova/blob/932b23ea391d4c89525c648e4103a3d6ee4531d5/x/icacontrol/keeper/send_msgs.go#L14
Уязвимый сегмент кода:

Уязвимость исправлена:
Изменилось с использования локального времени на использование времени блока.
timeoutTimestamp := time.Now().Add(time.Minute * 10).UnixNano() _, err = k.IcaControllerKeeper.SendTx(ctx, chanCap, connectionId, portID, packetData, uint64(timeoutTimestamp))
timeoutTimestamp := uint64(ctx.BlockTime().UnixNano() + 10*time.Minute.Nanoseconds()) _, err = k.IcaControllerKeeper.SendTx(ctx, chanCap, connectionId, portID, packetData, uint64(timeoutTimestamp)
Случай Три:
Уязвимость фона: Модуль Oracle в проекте BandChain
Ссылка на проект: Репозиторий BandChain на GitHub
Комментарии в репозитории кода указывают, что модуль оракула должен быть выполнен перед стейкингом для внедрения мер наказания для нарушителей протокола оракула. Однако в коде последовательность обратная: в функции SetOrderEndBlockers модуль стейкинга запускается перед модулем оракула. Если модуль стейкинга запускается перед модулем оракула, невозможно применить штрафы на основе проверок, завершенных в модуле оракула.
Местоположение уязвимости: BandChain GitHub Кодовый сниппет
Уязвимый сегмент кода:

Уязвимость заключается в том, что фактическая реализация и комментарии противоречат друг другу, где модуль оракула должен быть размещен перед модулем стейкинга.
Случай Четыре:
Фон уязвимости: Модуль управления доступом в проекте Sei Cosmos
URL проекта: Репозиторий GitHub Sei Cosmos
В нескольких случаях в репозиториях кода, связанных с Cosmos, используется тип map языка Go и его итерация. Из-за недетерминированной природы итерации map в Go это может привести к тому, что узлы достигнут различных состояний, что потенциально может вызвать проблемы согласования и, следовательно, остановить работу цепочки. Более подходящим методом было бы сортировать ключи map в срез и итерироваться по отсортированным ключам. Такие проблемы являются распространенными и связаны с применением языковых особенностей.
При реализации BuildDependencyDag в x/accesscontrol/keeper/keeper.go происходит итерация по узлам anteDepSet. Из-за недетерминированного поведения итерации по карте в Go ValidateAccessOp может привести к двум разным типам ошибок, что потенциально может привести к сбою консенсуса.
Местонахождение уязвимости: Кодовый фрагмент GitHub Sei Cosmos
Уязвимый сегмент кода:

Из этих случаев очевидно, что уязвимости, которые приводят к пассивной остановке цепочки, часто являются наиболее вредоносными. Их вызывающая логика может быть прослежена до прямого влияния на исполнение отдельных блоков в блокчейне. В отличие от этого, уязвимости безопасности согласия обычно приводят к активной остановке цепочки для внедрения исправлений, и их вызывающая логика прослеживается до влияния общего операционного потока и состояния блокчейна. Это отличается от уязвимостей, которые приводят к финансовым потерям, где конкретное опасное воздействие не оценивается на основе логического пути возникновения проблемы, а скорее фокусируется на владельцах средств, сумме денег, вовлеченном объеме и методах, влияющих на средства.
Потери капитала часто встречаются в ситуациях, таких как потребление газа, блокировка средств и невозможность их вывода, потеря средств во время трансфера, ошибки в логике вычислений, приводящие к потере средств, и невозможность обеспечить уникальность идентификаторов хранения средств.
В качестве примера мы возьмем проект SuperNova для анализа трех взаимосвязанных уязвимостей.
Фон уязвимости: Проект SuperNova
URL проекта: https://github.com/Carina-labs/nova
Если десятичные разряды в зоне превышают 18, средства могут быть заблокированы. В коде этого проекта нет верхнего предела для десятичных разрядов зоны, которые могут превышать 18. При запросе ClaimSnMessage, когда пользователи хотят запросить свои доли токенов, используется ClaimShareToken. Однако, если десятичные разряды зоны превышают 18, конвертация завершится неудачей, и будет невозможно извлечь активы из системы. Таким образом, управляя десятичными разрядами зоны, можно напрямую вызвать сбой и отказ транзакции.
Местоположение уязвимости: https://github.com/Carina-labs/nova/blob/v0.6.3/x/gal/keeper/claim.go#L167
Фрагмент кода уязвимости:
Путь срабатывания уязвимости:
msgServer.ЗаявитьSnAsset
Keeper.ClaimShareToken
Keeper.ConvertWAssetToSnAssetDecimal
precisionMultiplier
Уникальность зоны не подтверждена. В зарегистрированных регионах используйте идентификатор региона, чтобы проверить уникальность базового токена (BaseDenom). BaseDenom для каждого региона должен быть уникальным. Если значение базового токена установлено неправильно, это приведет к потере средств. Прежде чем устанавливать базовый токен в RegisterZone, проект не гарантировал, что BaseDenom был уникален во всех основных зонах. В противном случае существует возможность хранения пользовательских средств в другой злонамеренной зоне, содержащей BaseDenom с тем же именем, что приведет к потере средств.
Местоположение уязвимости: https://github.com/Carina-labs/nova/blob/v0.6.3/x/icacontrol/keeper/msg_server.go#L99
Уязвимый фрагмент кода:

Исправление ошибки: Добавлена проверка DenomDuplicateCheck
Кроме того, первый случай, когда цепь прекращает работу, вызван аварией, приводящей к неудаче чеканки, что также является формой потери капитала.
Отсутствие обновлений статуса. В методе IcaWithdraw(), если транзакция завершается неудачно и статус версии не изменен, то WithdrawRecord будет недоступен, и соответствующие средства не могут быть выведены. Более популярное понимание заключается в том, что состояние устанавливается до SendTx, и после неудачи состояние не изменяется, что приводит к неудаче вывода средств и невозможности их повторного вывода в следующий раз.
Местоположение уязвимости: https://github.com/Carina-labs/nova/blob/932b23ea391d4c89525c648e4103a3d6ee4531d5/x/gal/keeper/msg_server.go#L356
Уязвимый фрагмент кода:


Исходя из этого отрывка, мы можем определить, что основная логика операций, связанных с фондами, в основном зависит от обработки различных сообщений. Конечно, есть и случаи, как, например, первый сценарий, связанный с операциями чеканки в процессе выполнения BeginBlock. Когда эти операции завершаются неудачно, это также может привести к финансовым потерям. В целом, сосредотачиваясь на аудите кодовых модулей, связанных с финансовыми операциями, мы можем значительно увеличить вероятность обнаружения таких уязвимостей.
Пример использования: Cosmos SDK Security Advisory Barberry
Фон уязвимости: У MsgCreatePeriodicVestingAccount.ValidateBasic отсутствуют механизмы для оценки статуса учетной записи, такие как то, активна ли она. В x/auth определенном PeriodicVestingAccount атакующий мог бы инициализировать учетную запись жертвы к злонамеренно принадлежащей учетной записи. Эта учетная запись позволяет вносить депозиты, но запрещает вывод средств. Когда пользователи вносят средства на свою учетную запись, эти средства будут навсегда заблокированы, и пользователь не сможет их вывести.
Защитный патч уязвимости:
https://forum.cosmos.network/t/cosmos-sdk-security-advisory-barberry/10825
https://github.com/cosmos/cosmos-sdk/security/advisories/GHSA-j2cr-jc39-wpx5
https://github.com/cosmos/cosmos-sdk/compare/v0.47.3-rc.0...v0.47.3
https://github.com/cosmos/cosmos-sdk/pull/16465
Уязвимый фрагмент кода:

Кроме того, проблемы на этапе ValidateBasic также присутствовали в Cosmos-SDK Security Advisory Elderflower и Cosmos-SDK Security Advisory Jackfruit. Первая столкнулась с прямым пропуском вызова ValidateBasic, в то время как вторая включала проблемы с проверкой переменной временной метки внутри сообщения. В прикладных цепях такие проблемы еще более распространены. Проекты типа ethermint, pstake-native и quicksilver столкнулись со схожими уязвимостями безопасности в своих мерах проверки обработки сообщений.
Помимо типов проверки, также возникают проблемы с логикой обработки sdk.Msg, такие как операции, требующие большого расхода газа, циклы и неразумное обращение с сбоями. Поскольку цепочка обработки сообщений имеет соответствующие механизмы восстановления, их уровень опасности немного ниже, чем полное отключение цепочки. Тем не менее, они все равно могут повлиять на нормальную работу системы или привести к потере средств в цепи.
Обратите внимание на уязвимости инфраструктуры: Основные компоненты, такие как CometBFT и Cosmos SDK, также могут иметь уязвимости, поэтому регулярные обновления и техническое обслуживание необходимы для обеспечения безопасности.
Быстро проверяйте сторонние библиотеки: Разработчики Cosmos часто используют сторонние библиотеки для расширения функциональности своих приложений. Эти библиотеки могут содержать потенциальные уязвимости, поэтому требуется проверка и обновление для снижения рисков.
Будьте осторожны с злонамеренными атаками узлов: Узлы консенсуса играют важную роль в экосистеме Cosmos. Алгоритмы бизантинской толерантности к отказам этих узлов могут быть уязвимыми для атак, поэтому обеспечение безопасности узла является важным для предотвращения злонамеренного поведения.
Рассмотрите физическую безопасность: Для обеспечения безопасности аппаратных средств и серверов, на которых работают узлы Cosmos, требуются физические меры безопасности, чтобы предотвратить несанкционированный доступ и потенциальные атаки.
Проводить необходимые кодовые обзоры: Учитывая открытость экосистемы Cosmos SDK и CometBFT, разработчики и аудиторы должны просматривать как основной код, так и код, написанный в пользовательских модулях, чтобы выявить и исправить потенциальные проблемы безопасности.
Обратите внимание на инструменты экосистемы: Экосистема Cosmos включает в себя множество инструментов и приложений, которые также должны пройти проверку безопасности и регулярные обновления, чтобы гарантировать их безопасность.
С момента появления Bitcoin блокчейн-сфера пережила взрывной рост. Появилось бесчисленное количество новых сетей, каждая из которых имеет свою уникальную концепцию ценности, механизмы консенсуса, идеологии, сторонников и причины существования. До введения IBC эти блокчейны работали независимо друг от друга, как в закрытых контейнерах, неспособные общаться друг с другом, что является фундаментально неустойчивой моделью.
Если блокчейны рассматривать как страны с растущим населением и суетливой коммерческой деятельностью, то некоторые выделяются в сельском хозяйстве, другие в животноводстве. Естественно, они стремятся к взаимовыгодной торговле и сотрудничеству, используя свои сильные стороны. Не преувеличение сказать, что Межблокчейновая коммуникация (IBC) открыла новый мир безграничных возможностей, позволяя различным блокчейнам взаимодействовать, передавать ценность, обмениваться активами и услугами, а также устанавливать связи, не сталкиваясь с врожденными проблемами масштабируемости сегодняшних крупных блокчейн-сетей.
Итак, как IBC удовлетворяет эти потребности и играет такую важную роль? Фундаментальные причины заключаются в том, что IBC:
Доверие минимизировано
Способен поддерживать гетерогенные блокчейны
Настроенный на уровне приложения
Зрелая, проверенная технология
Основой протокола IBC являются легкие клиенты и релеи. Цепи A и B, общающиеся через IBC, каждая обладает легкими клиентами другого учетного реестра. Цепь A, не нуждаясь в доверии к третьей стороне, может достигнуть консенсуса по состоянию цепи B, верифицируя заголовки ее блоков. Цепи, взаимодействующие через IBC (особенно модули), не отправляют сообщения друг другу напрямую. Вместо этого цепь A синхронизирует определенные сообщения в пакет данных со своим состоянием. Впоследствии релеи обнаруживают эти пакеты данных и передают их на целевую цепь.
В целом протокол IBC можно разделить на два уровня: IBC TAO и IBC APP.
IBC TAO: Определяет стандарты передачи пакетов данных, аутентификации и упорядочивания, в основном, на уровне инфраструктуры. В ICS (Стандарты межцепочных взаимодействий) это включает в себя основные, клиентские и ретрансляторские категории.
IBC APP: Определяет стандарты для обработчиков приложений пакетов данных, передаваемых через транспортный уровень. Сюда входят, в том числе, но не ограничиваясь, передачи обращаемых токенов (ICS-20), передачи необращаемых токенов (ICS-721) и межцепочечные счета (ICS-27), их можно найти в категории приложений ICS.

Протокол IBC (из портала разработчиков Cosmos)
Протокол межблокчейновой коммуникации (IBC) является угловым камнем видения экосистемы Cosmos о "Интернете блокчейнов". В этом контексте выборы дизайна IBC влияют на стандарты TCP/IP. Подобно тому, как TCP/IP устанавливает стандарты для компьютерной коммуникации, IBC определяет набор универсальных абстракций, которые позволяют блокчейнам обмениваться данными между собой. Как и TCP/IP, IBC не ограничивает содержание пакетов данных, передаваемых через сеть. Кроме того, подобно тому, как прикладные протоколы, такие как HTTP и SMTP, построены на основе TCP/IP, приложения, например, стандартизированные передачи активов/нефункциональных активов или вызовы смарт-контрактов между цепями, также используют протокол IBC в качестве основного уровня.
Основные проблемы, которые в настоящее время наблюдаются с протоколом IBC, связаны с передачей канала и обработкой пакетов. Были значительные проблемы с проверкой доказательств, но они относительно менее распространены. В этой статье рассматриваются общие проблемы протокола IBC. Благодаря модульному дизайну протокола IBC разработчикам приложений IBC не нужно беспокоиться о деталях, таких как клиенты, подключения и проверка доказательств. Однако им необходимо реализовать интерфейс IBCModule и соответствующие методы обработки хранителя. Поэтому многие проблемы, связанные с протоколом IBC, возникают в кодовых путях интерфейсов IBCModule для приема и обработки пакетов (onRecvPacket, OnAcknowledgementPacket, OnTimeoutPacket и т. д.).
Из-за ограничений места в этой статье не углубляется в детальный анализ каждого аспекта и компонента протокола IBC. Вместо этого он классифицирует некоторые из существующих уязвимостей безопасности. Для более детального и всестороннего анализа вы можете обратиться к нашим инженерам по безопасности CertiK для обсуждения.
Общие классификации уязвимостей:
① Уязвимости обработки строк
② Уязвимости обработки байткода
① Уязвимости порядка пакетов
② Уязвимости тайм-аута пакета
③ Уязвимости аутентификации пакета
④ Другие уязвимости пакетов
① Обновление уязвимостей государства
② Уязвимости голосования и консенсуса
③ Другие Логические Уязвимости
Существующий протокол МВК, с точки зрения аудита и анализа его безопасности, имеет много общего с процессами аудита протоколов Веб2. В данном анализе будут рассмотрены некоторые проблемы безопасности и потенциальные риски протокола МВК с точки зрения установки протокола, его реализации и расширения применения. Поскольку разработка протокола часто завершается несколькими отдельными лицами и организациями, для различных блокчейн-организаций большая часть работы связана с реализацией и расширением применения протокола. Поэтому в данной статье будет акцентировано внимание на проблемы безопасности в этих аспектах. Такой подход обусловлен учетом широкого спектра проблем безопасности, охватываемых протоколом МВК, что позволяет лучше классифицировать различные типы проблем безопасности в соответствующие этапы и модули.
Фон уязвимости: Неверное использование периода отвязки
В коде существует следующая проверка:
if currentTimestamp.Sub(consState.Timestamp) >= clientState.UnbondingPeriod
Согласно модели безопасности Tendermint, для блока (заголовка) в момент времени t валидаторы в NextValidators должны корректно работать до t+TrustingPeriod. После этого они могут демонстрировать другое поведение. Однако здесь проверяется UnbondingPeriod, а не TrustingPeriod, где UnbondingPeriod > TrustingPeriod. Если крайний срок consState находится между TrustingPeriod и UnbondingPeriod, то этот заголовок будет принят в качестве эталона для проверки одного из конфликтующих заголовков, представляющих собой неправомерное поведение. В течение этого периода валидаторы в consState.NextValidators больше не считаются надежными, и враждебно настроенные бывшие валидаторы могут закрыть клиент без какого-либо риска.
Адрес проекта: https://github.com/cosmos/ibc/tree/e01da1d1346e578297148c9833ee4412e1b2f254/spec/ics-007-tendermint-client
Местоположение уязвимости:
Уязвимый фрагмент кода:

функция определения протокола

Код
Недопонимания и нестандартные проблемы в реализации протокола.
Ошибки в настройках протокола.
Фон уязвимости: Конфликт кастодиального адреса. GetEscrowAddress()Функция генерирует усеченный SHA256 из 20 байт (идентификатор порта + идентификатор канала). У этого метода три проблемы:
Отсутствие разделения домена между портами и каналами. Метод объединения строк не разделяет домены порта и канала. Например, комбинации порта/канала («transfer», «channel») и («trans», «ferchannel») приведут к одному и тому же адресу кастодиал, т. е. усеченному SHA256 («transferchannel»). Если определенным модулям с библиотечными функциями разрешено выбирать идентификаторы порта и канала, могут возникнуть уязвимости.
Конфликты между адресами учетной записи модуля. В предварительном изображении SHA-256 используются произвольные буквенно-цифровые строки с размером пост-изображения 160 бит. Это небольшое пост-изображение в сочетании с быстрой хэш-функцией делает атаку дня рождения выполнимой, так как его безопасность снижается только до 80 бит. Это означает, что приблизительно 2^80 попыток требуется для нахождения коллизии между двумя разными адресами кастодиальных учетных записей. В 2018 году был проведен подробный анализ стоимости атаки на усечение SHA256 в контексте Tendermint, доказывающий, что такая атака выполнима с точки зрения стоимости. Нахождение коллизии означает, что две разные кастодиальные учетные записи сопоставляются с одним и тем же адресом учетной записи. Это может привести к рискам кражи средств с кастодиальных учетных записей. Дополнительные сведения см. в ICS20 GetEscrowAddress предварительное изображение домена пересекается с открытыми ключамиT:BUG.
Конфликты между адресами модуля и не-модуля. Построение общедоступных адресов счетов такое же, как 20-байтовый SHA-256 открытых ключей Ed25519. Хотя 160-битная защита достаточна для предотвращения атак столкновения на конкретные общедоступные адреса, безопасность от атак дня рождения составляет всего 80 бит. Эта ситуация напоминает полуденежную атаку, где один адрес генерируется быстрым SHA-256, а другой адрес генерируется относительно медленными вычислениями открытых ключей Ed25519. Хотя эта ситуация более безопасна, она все еще представляет потенциальные угрозы для кастодиальных и общедоступных счетов.
Адрес проекта: https://github.com/cosmos/ibc/tree/e01da1d1346e578297148c9833ee4412e1b2f254/spec/ics-020-fungible-token-transfer
Местоположение уязвимости: https://github.com/cosmos/cosmos-sdk/blob/6cbbe0d4ef90f886dfc356979b89979ddfcd00d8/x/ibc/applications/transfer/types/keys.go#L40-L47
Уязвимый фрагмент кода:

Обычная ситуация: Успех в пределах времени ожидания
Ситуация тайм-аута: сбой тайм-аута

Диаграмма потока передачи пакета заявки IBC
Когда происходит тайм-аут, это означает, что передача не удалась, и протокол IBC инициирует процесс возврата средств. Следует отметить, что у IBC есть настраиваемый пользователем механизм тайм-аута. Уязвимость Dragonberry происходит от ICS-23 (IBC). Основная причина этой уязвимости заключается в том, что пользователи могут подделывать доказательства отсутствия в процессе верификации (то есть ложные доказательства того, что пакеты данных не были получены), тем самым обходя проверки безопасности и подделывая «разумную» ситуацию тайм-аута IBC для обмана протокола IBC, вызывая повторителю отправлять тайм-аут пакеты с ложными сертификатами и возможно эскалировать до проблемы двойного расходования ICS-20. Конкретный процесс запуска уязвимости можно увидеть на рисунке ниже.

Принцип уязвимости Dragonberry на схеме потока
Адрес проекта: https://github.com/cosmos/ibc-go/tree/00a680cda52690a4ba835bf37f53acc41c01bc7a/modules/core/04-channel
Местоположение уязвимости: https://github.com/cosmos/ibc-go/blob/00a680cda52690a4ba835bf37f53acc41c01bc7a/modules/core/04-channel/keeper/timeout.go#L117C28-L117C54
Уязвимый фрагмент кода:


Серьезность этой проблемы невелика, потому что канал, передаваемый ICS-20 FT, в основном находится в беспорядке, и ретранслятор не полагается на этот конечный точку grpc для определения того, какие пакеты вызывают тайм-аут. Однако, если в целевой цепи большое количество пакетов, и для передачи IBC настроен упорядоченный канал, а ответ grpc не разбит на страницы, это может создать риск снижения производительности служебного узла или даже его сбоя. Специфика процесса, вызывающего триггер, можно увидеть на рисунке ниже.

Диаграмма потока принципа уязвимости Huckleberry
Адрес проекта: https://github.com/cosmos/ibc-go/blob/11297aaa61e651c16e6d4147a15be24ce55ba7cc/modules/core/04-channel/
Местоположение уязвимости: https://github.com/cosmos/ibc-go/blob/11297aaa61e651c16e6d4147a15be24ce55ba7cc/modules/core/04-channel/keeper/grpc_query.go#L408
Уязвимый фрагмент кода:

Попробуйте Обновить Представление Вознагражденияпреобразует адрес отправителя пакета IBC в адрес Stride с именемsenderStrideAddress, и извлекает идентификатор воздушного капельи новый адрес воздушного капельникаnewStrideAddressиз метаданных пакета. Затем вызываетОбновитьAirdropAddressобновитьадрес отправителя шага и ЗаписьПретензииС обновлением ЗаписьПретензии, newStrideAddressсможет запросить воздушную каплю. Однако эта функция обновления только проверяет, пустой ли адрес отправителя запроса, и не проверяетновыйАдресStrideПоскольку IBC позволяет одиночным машинным подключениям реализовывать цепи, поддерживаемые IBC, это создает риск безопасности, при котором возможно обновление любого другого адреса учетной записи как адреса для воздушного капельника.Адрес проекта: https://github.com/Stride-Labs/stride/tree/3a5c7bfcc3b8c5e7dd870f01bebeb9d949492203/x/autopilot
Местоположение уязвимости: https://github.com/Stride-Labs/stride/blob/3a5c7bfcc3b8c5e7dd870f01bebeb9d949492203/x/autopilot/module_ibc.go#L119
Уязвимый фрагмент кода:
- Case 2: уязвимость модуля neutron ibc, уязвимость потребления газаФон уязвимости: В контексте смарт-контрактов возникает проблема с проверкой комиссий для подтверждения или тайм-аута событий межблокчейн-коммуникации (IBC). Этот недочет позволяет зловредным смарт-контрактам вызывать сбой 'ErrorOutOfGas'. Этот сбой происходит во время обработки сообщений 'OnAcknowledgementPacket' и 'OnTimeoutPacket'. Когда происходит эта ошибка, невозможно решить ее обычным методом 'outOfGasRecovery'. В результате затронутые транзакции не удается включить в блокчейн. Это отказ может привести к тому, что межблокчейн-ретрансляторы будут пытаться повторно отправить эти сообщения. Такие повторные отправки могут привести к финансовым потерям для ретрансляторов и перегрузке сети из-за избыточного количества необработанных ('заброшенных') пакетов, что создает риск для стабильности сети.
Адрес проекта: https://github.com/neutron-org/neutron/blob/64868908b21f648ad5e8a9b48179134619544e2a/
Местоположение уязвимости:
Уязвимый фрагмент кода:


Помимо ранее упомянутых проблем безопасности в компоненте IBC, возникают новые вызовы, особенно в промежуточном программном обеспечении IBC. Ожидается, что эти эволюционирующие проблемы станут все более значительными в будущем, особенно в отношении общей безопасности экосистемы Cosmos. Этот сдвиг указывает на растущее внимание к обеспечению надежных мер безопасности в модуле IBC.
Этот отчет подчеркивает уникальные вызовы, стоящие перед гетерогенной сетью, такой как Cosmos, особенно учитывая ее поддержку взаимодействий между цепями. Сложность и разрозненность ее компонентов делают задачу обеспечения их безопасности сложной. Это требует не только применения наших существующих знаний о рисках безопасности, но и адаптации к новым сценариям безопасности для решения возникающих проблем.
Несмотря на эти препятствия, мы оптимистичны. Документируя и анализируя общие сценарии и проблемы безопасности, как мы сделали в этом отчете, мы готовим почву для постепенного улучшения общей системы безопасности в разнообразной экосистеме Cosmos.
* Информация не предназначена и не является финансовым советом или любой другой рекомендацией любого рода, предложенной или одобренной Gate.
* Эта статья не может быть опубликована, передана или скопирована без ссылки на Gate. Нарушение является нарушением Закона об авторском праве и может повлечь за собой судебное разбирательство.





