TGViewer
Из Solidity в AI и дальше Из Solidity в AI и дальше @solidityset · 2.49K subscribers
Post #1463 547
Griefing атаки. Часть 2

Могут ли операции контракта быть манипулированы с помощью точного указания лимита газа?

Злоумышленники могут указывать тщательно рассчитанные объемы газа, чтобы принудительно направить выполнение контракта по определенному пути, тем самым манипулируя его поведением неожиданным образом.

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

Ярким примером такой манипуляции является "груминг" (намеренное причинение вреда) из-за недостаточного газа при внешних вызовах. Хотя в рекомендациях по устранению упоминаются «явные проверки газа», которые часто означают require(gasleft() > MIN_GAS_NEEDED), данная конкретная атака, связанная с внешними вызовами, наиболее эффективно предотвращается иным способом.

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

Продемонстрируем это на примере контракта Relayer:

1. Функция forward контракта Relayer предназначена для выполнения действия через внешний вызов контракта Target.

2. Ключевой момент: функция forward обновляет внутреннее состояние (помечает запрос _data как выполненный для защиты от повторного выполнения), прежде чем совершается внешний вызов или подтверждается его успешность.

3. Функция не проверяет статус успешности, возвращаемый вызовом target.call(...).

4. Злоумышленник вызывает forward, указывая тщательно рассчитанный лимит газа: достаточно для прохождения проверки require и обновления executed[_data] = true, но недостаточно для успешного завершения последующего вызова target.call(...) внутри контракта Target.

5. Вызов target.call исчерпывает выделенный газ и молча завершается с ошибкой (с точки зрения контракта Relayer, поскольку его успешность не проверяется). Однако функция forward завершается «успешно».

6. В результате возникает несогласованное состояние: отображение executed в контракте Relayer показывает, что действие выполнено, но необходимая внешняя операция в контракте Target фактически не произошла. Конкретная транзакция легитимного пользователя (_data) теперь навсегда заблокирована из-за механизма защиты от повторного выполнения, который по сути подвергся цензуре со стороны злоумышленника, воспользовавшегося механикой газа и отсутствием проверки ошибок.
  • 👍 3
  • 🔥 1
More from @solidityset
  1. Sep 22, 2026Какой язык программирования учить сейчас? На днях в Твиттере увидел небольшой пост о разви…
  2. Sep 18, 2026Интересная модель Jev Буквально пару дней назад в Твиттере многие начали обсуждение новой…
  3. Sep 14, 2026Графы повсюду Если вы также следите за новостями в мире ИИ, то наверняка уже все чаще встр…
  4. Sep 10, 2026GTA6, Cyberleek, блокчейн и безопасность Увидел несколько постов (тут и тут) про Cyberleek…
  5. Sep 9, 2026Работа с чистой энергией Дисклеймер Сегодня ава и название канала, наконец, поменялись. Я…
  6. Sep 9, 2026Channel name was changed to «Из Solidity в AI и дальше»
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →