Согласно финансовому отчету Thorchain за первый квартал 2022 года, опубликованному 1 апреля, сеть зарегистрировала рост выручки, несмотря на двойное влияние постоянной вялости рынка и крайне нестабильной геополитической обстановки. Публичные данные показывают, что в первом квартале 2022 года Thorchain зафиксировала выручку в размере 2,17 млрд долларов. Thorchain, получившая признание как «кроссчейн версия Uniswap», закрепилась на рынке кроссчейн-трейдинга, опираясь на свои уникальные преимущества, и получила широкое признание среди инвесторов.

Помимо всего этого гламура, THORChain также серьезно обеспокоен хакерскими атаками. Сеть часто подвергалась нарушениям безопасности с момента запуска на Ethereum, что ставит под сомнение ее безопасность. 11 апреля THORChain написал в Твиттере о фишинговых атаках, предупредив пользователей, чтобы они не взаимодействовали с [DeTHOR] или другими неизвестными токенами в своих кошельках, что еще раз вызвало обеспокоенность по поводу проблем с безопасностью.

Создавая надежную систему безопасности для продуктов CoinEx, команда безопасности CoinEx также отслеживает инциденты безопасности в пространстве блокчейна, чтобы помочь пользователям лучше понять безопасность различных проектов с точки зрения технической безопасности и снизить инвестиционный риск. Стремясь улучшить критерии безопасности для сектора блокчейна, команда безопасности CoinEx проанализировала риски безопасности THORChain (RUNE). Команда надеется, что THORChain сможет выявить и смягчить следующие риски, оптимизировав соответствующие коды смарт-контрактов. Кроме того, эта статья также является предупреждением для пользователей, напоминая им о необходимости быть более осведомленными о безопасности активов и избегать их потери.

Насколько безопасен THORChain (RUNE)?

Проанализировав код контракта и логику THORChain (RUNE), команда безопасности CoinEx обнаружила следующие риски:

Для начала проверим код контракта THORChain (RUNE):

https://etherscan.io/address/0x3155ba85d5f96b2d030a4966af206230e46849cb#code

Мы можем сказать, что RUNE — довольно стандартный токен ERC-20. Следует отметить, что помимо интерфейса ERC-20, THORChain (RUNE) предлагает дополнительный интерфейс:

Согласно данным TransferTo (как показано на рисунке выше), THORChain (RUNE) использует tx.origin, что является одной из причин его угроз безопасности. Здесь мы должны объяснить разницу между tx.origin и msg.sender:

На картинке ниже показано, что происходит, когда обычный адрес вызывает смарт-контракт:

В таких случаях msg.sender = account.address, а tx.origin = account.address, что означает, что msg.sender — это то же самое, что и tx.origin.
В таких случаях msg.sender = account.address, а tx.origin = account.address, что означает, что msg.sender — это то же самое, что и tx.origin.

Вот что происходит, когда учетная запись вызывает контракт А, а контракт А вызывает контракт Б:

Когда контракт A вызывает контракт B (как показано выше), мы можем сказать, что msg.sender равен tx.origin в контракте A.
Когда контракт A вызывает контракт B (как показано выше), мы можем сказать, что msg.sender равен tx.origin в контракте A.

Однако в контракте B msg.sender = contractA.address, а tx.origin = account.address. Таким образом, tx.origin похожа на глобальную переменную, которая проходит через весь стек вызовов и возвращает адрес учетной записи, изначально отправившей транзакцию. Это ключевой вопрос: на сегодняшний день почти все известные атаки на THORChain (RUNE) связаны с tx.origin.

Давайте теперь выясним, как злоумышленники воруют токены RUNE пользователей через tx.origin:

Атака №1: украсть козу из стада

Адреса в Ethereum делятся на внешние адреса и контрактные адреса. Передача ETH на эти два типа адресов через внешние адреса принципиально отличается. В официальной документации Solidity указано, что адрес контракта должен реализовать функцию получения эфира перед выполнением переводов.

В свете особенностей tx.origin хакеры могут создать контракт на атаку:

Когда контракт Attack получает перевод ETH от пользователя, он «украдет козла из стада» — в процессе контракт украдет токены пользователя RUNE.
Когда контракт Attack получает перевод ETH от пользователя, он «украдет козла из стада» — в процессе контракт украдет токены пользователя RUNE.

Атака №2: Внутренняя атака

Внутренняя атака — это особый тип атаки. При попытке украсть RUNE пользователя с помощью внутренней атаки хакеру необходимо иметь токен среднего размера. Более того, токен также должен вызывать сторонние контракты. Согласно записям о передаче RUNE на Ethereum, некоторые злоумышленники взломали RUNE посредством передачи токенов AMP.

Токен AMP использует стандарт ERC-1820 для управления регистрацией хука и проверки того, зарегистрирован ли хук при каждой передаче. Если хук был зарегистрирован, то будет вызван хук.

Код контракта токена AMP показывает, что окончательная реализация передачи: _transferByPartition. При этом есть два вызова с участием transferHook: _callPreTransferHooks (до передачи) и _callPostTransferHooks (после передачи). В частности, _callPreTransferHooks предназначен для адреса отправителя, а _callPostTransferHooks — для адреса получателя (т. е. адреса получателя).

Для обычных пользователей воровать токены у самих себя бессмысленно. Поэтому злоумышленники могут использовать _callPostTransferHooks. Давайте теперь проверим коды _callPostTransferHooks.

IAmpTokensRecipient(recipientImplementation).tokensReceived()
IAmpTokensRecipient(recipientImplementation).tokensReceived()

Мы можем сказать, что единственным обратным вызовом, который могут использовать злоумышленники, является IAmpTokensRecipient(recipientImplementation).tokensReceived().

Далее мы покажем, как этот вызов можно использовать для передачи RUNE пользователя при передаче токена AMP.

Шаг 1: Необходим договор вызова (как показано ниже):

Шаг 2: Разверните контракт, чтобы получить адрес атаки.
Шаг 2: Разверните контракт, чтобы получить адрес атаки.

Шаг 3: Вызовите интерфейс контракта ERC-1820 (setInterfaceImplementer), чтобы зарегистрировать интерфейс.

Адрес ERC-1820: 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24.

Интерфейс контракта: setInterfaceImplementer (адрес toAddr, bytes32 interfaceHash, реализация адреса)

В частности, toAddr — адрес получателя AMP-передачи,

interfaceHash为AmpTokensRecipient的хеш:

0xfa352d6368bbc643bcf9d528ffaba5dd3e826137bc42f935045c6c227bd4c72a

interfaceHash — это хэш AmpTokensRecipient:

0xfa352d6368bbc643bcf9d528ffaba5dd3e826137bc42f935045c6c227bd4c72a

Implementer — это адрес атаки, полученный на шаге 2.

Шаг 4: Заманите пользователя перевести AMP на адрес toAddr, чтобы вызвать обратный вызов, и одновременно украсть его RUNE.

Атака №3: ​​фишинговая атака

Как следует из названия, при фишинговой атаке злоумышленник обещает предоставить невероятные преимущества, чтобы заманить пользователей к выполнению определенных контрактных операций. Здесь мы представим распространенную фишинговую атаку.

Шаг 1: Злоумышленник выпускает токен ERC-20 и может записать его в любой контрактный интерфейс, который включает подписи.

Шаг 2: Создайте торговую пару на Uniswap или любом другом свопе;

Шаг 3: Предложите раздачу всем пользователям/адресам, у которых есть токены RUNE;

Первоначальная работа фишинговой атаки в основном завершается с помощью описанных выше шагов. Далее злоумышленнику нужно только дождаться, пока пользователи совершят обмен по свопу, а пользователи рискуют потерять свои RUNE после выполнения таких операций, как одобрение, перевод и т. д.

Кроме того, чтобы дополнительно проверить риск безопасности кода контракта THORChain, CoinEx обсудил с командой безопасности из SlowMist и PeckShield, двух известных агентств безопасности в отрасли. SlowMist и PeckShield подтвердили, что упомянутая выше угроза безопасности действительно существует.

До сих пор мы рассмотрели несколько типов атак, а также риски безопасности, которым подвергаются пользователи.

Как команда проекта должна оптимизировать код контракта, чтобы повысить свою безопасность и защитить активы пользователей?

Единственный ответ — будьте осторожны при использовании tx.origin.

Как обычные пользователи могут снизить риски и защитить свои активы перед лицом атак, которые кажутся неизбежными? Команда безопасности CoinEx предлагает следующие предложения:

  1. Для Атаки №1: При переводе следите за расчетным расходом Газа. Для обычного перевода ETH комиссии за газ в размере 21 000 более чем достаточно. Будьте осторожны, если потребление газа намного превышает это значение.
  2. Для атаки № 2: изолируйте свои токены, приняв разные кошельки. Вы можете хранить разные токены по разным адресам. Особая осторожность необходима, когда речь идет об адресе горячего кошелька, предлагаемом биржами.
  3. Для атаки № 3: Жадность — источник всего зла. Не участвуйте вслепую в каких-либо аирдропах.

Безопасность всегда была главной заботой в секторе блокчейнов. Все игроки, включая проектные команды и биржи, должны уделять первоочередное внимание безопасности во время работы проекта, обеспечивать безопасность и безопасность активов пользователей и совместно способствовать здоровому росту индустрии блокчейнов.

Источник