Повторная атака на смарт-контракты
Повторная атака на смарт-контракты

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

Основные принципы:

  1. первоначальный звонок:Злоумышленник сначала звонит уязвимомусмарт-контрактодин изфункция,Например, функция вывода средств,Обычно это сопровождается передачей некоторых токенов Ethereum.
  2. Внешний звонок перед изменением статуса:существоватьсмарт-контрактвнутренний,Может быть момент, когда существование обновит свои переменные состояния (например, баланс) перед выполнением внешнего вызова.,Например, используйте .call() или .delegatecall() Метод переводит деньги на контракт злоумышленника и выполняет код.
  3. рекурсивный вызов:Нападающий тщательно разработал свой контракт,При поступлении средств за звонок,Немедленно перезвоню уязвимой договорной той же или другой депозитной функции, действующей на данный момент.,Исходный договорной статус еще не обновлен,Таким образом, злоумышленник может снова получить доступ к вызову.,и выполнить одно и то же действие несколько раз,То есть запросить перевод средств еще раз.
  4. Обновление статуса не выполнено:потому чторекурсивный вызов, первоначальное обновление статуса договора (например, уменьшение баланса злоумышленника) может никогда не быть выполнено, поскольку злоумышленник может снова вызывать договор каждый раз, когда существует обновление статуса.
  5. Бесконечный цикл до исчерпания средств:этотрекурсия Процесс может продолжаться,Пока договорной все средства не исчерпаны,или пока не будет достигнут какой-то внешний предел,Например предел газа.

Ключом к повторной атаке является то, что злоумышленник может использовать порядок выполнения контракта и время обновления состояния. Чтобы предотвратить этот тип атаки, разработчикам необходимо убедиться, что все обновления внутреннего состояния завершены, прежде чем совершать какие-либо внешние вызовы. Кроме того, используйте .transfer() и .send() вместо этого метод .call() Также может снизить риск, поскольку по умолчанию он ниже. gas лимит, которого может быть недостаточно для выполнения сложного вредоносного кода.

Демонстрационный случай

Вероятно, наиболее известен своей работой над The ДАО-атака,Хотя это не совсем повторная атака,Но это показывает, как злоумышленники могут использовать контракт для незаконного получения средств. но,Ниже я приведу упрощенный пример реентерабельной атаки смарт-контракт.,Это часто используется в образовательных и исследовательских сценариях для объяснения концепции повторных атак.

Допустим, у нас есть простой смарт-контракт, который позволяет пользователям вносить и снимать средства:

Язык кода:javascript
копировать
pragma solidity ^0.8.0;

contract SimpleBank {
    mapping(address => uint256) public balances;

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint256 _amount) public {
        if (_amount <= balances[msg.sender]) {
            // Это экономит существованиелазейки, поскольку сначала проверяет баланс, а затем вызывает внешний контракт.
            (bool success, ) = msg.sender.call{value: _amount}("");
            require(success, "Transfer failed.");
            balances[msg.sender] -= _amount;
        }
    }
}

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

Далее злоумышленник договорной Простой пример:

Язык кода:javascript
копировать
pragma solidity ^0.8.0;

contract Attacker {
    address private target;

    constructor(address _target) {
        target = _target;
    }

    function attack() public payable {
        (bool success, ) = target.call{value: msg.value}("");
        require(success, "Attack failed.");
    }

    fallback() external payable {
        // При поступлении средств контракт жертвы немедленно аннулируется.
        (bool success, ) = target.call{value: 1 ether}("");
        require(success, "Recursive call failed.");
    }
}

существуют в контракте этого злоумышленника,fallback Функция автоматически активируется при получении эфира. Когда злоумышленник звонит attack функцияи отправить средства жертве контракта,Как только средства поступят,fallback Функция будет активирована, что вызовет виктимизацию рекурсия договорной withdraw функцию, чтобы попытаться снова вывести средства.

пожалуйста, обрати внимание,Этот пример предназначен для демонстрации концепции повторных атак.,Не рекомендуется использовать в производственных средах. существовать в реальном мире,Разработчики умной договорной программы принимают многочисленные меры безопасности для предотвращения таких атак.,Например, существует обновление статуса перед внешним вызовом.,Используйте атомарные операции,или Используйте более безопасные переводы, предоставляемые Ethereumфункция .transfer() и .send()

Процесс атаки

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

Во-первых, вот функция атаки договорной конструкции:

Язык кода:javascript
копировать
constructor(address _target) {
    target = _target;
}

Вот _target Параметр указывает на адрес смарт-контракта жертвы, о котором мы упоминали выше. SimpleBank договор. При развертывании контракта атаки вам необходимо указать этот адрес, чтобы контракт атаки знал, какой контракт атаковать.

Далее attack функция:

Язык кода:javascript
копировать
function attack() public payable {
    (bool success, ) = target.call{value: msg.value}("");
    require(success, "Attack failed.");
}

Эта функция получает эфир в качестве параметра (через payable ключевое слово). Когда вы вызываете эту функцию и отправляете эфир, она переводит деньги на _target,То есть SimpleBank договор. Здесь используется низкоуровневый .call() метод, который может выполнять вызовы произвольных данных, включая передачу эфира.

сейчассуществовать,Вот и ключевая часть,fallback функция:

Язык кода:javascript
копировать
fallback() external payable {
    // При поступлении средств контракт жертвы немедленно аннулируется.
    (bool success, ) = target.call{value: 1 ether}("");
    require(success, "Recursive call failed.");
}

существовать Solidity середина,fallback Функция автоматически выполняется, когда существующий контракт получает данные или эфир без указанного вызова функции. В нашем случае, когда. SimpleBank Когда контракт пытается вернуть средства злоумышленнику, он фактически называет атаку договорной. fallback функция.

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

Подводя итог, процесс лечения выглядит следующим образом:

  1. Злоумышленник звонит attack Функционируйте и отправляйте эфир на SimpleBank договор.
  2. SimpleBank договорной withdraw Вызывается функция, пытающаяся вернуть деньги злоумышленнику.
  3. существует Процесс возврата средств,fallback Функциясуществовать Контракт злоумышленника сработал, поскольку он получил эфир.
  4. fallback Функция обратного вызова немедленно SimpleBank договорной withdraw Функция, повторная попытка вывода денег.
  5. Этот процесс можно повторить,Пока все средства не будут исчерпаны и транзакция не завершится.

Это основной принцип повторных атак. существуют в практическом применении,Контракту злоумышленника может потребоваться некоторая дополнительная логика, чтобы избежать бесконечных циклов.,и обеспечить успешную атаку. также,В современных практиках разработки смарт-контрактов используются более безопасные методы предотвращения подобных атак.,Например, сначала спишите остаток, а затем переведите деньги.,Используется или .transfer() или .send() методы, они сразу же генерируют исключение, не продолжая выполнять остальную часть кода.

резервная функция

fallback ФункциясуществоватьSolidityсмарт-контракт — это особый тип Функции, которая автоматически выполняет существование в следующих ситуациях:

  1. Когда контракт получает эфир (Ethereum):Если кто-то отправляет эфир на ваш контракт,и не указывает какой-либо вызов функции,Такfallbackфункциябудет выполнено автоматически。
  2. При получении неизвестного вызова функции:Если отправить вдоговорной Сообщение содержитфункциявызовданные,Но подпись функции не соответствует ни одной функции в контракте.,Такfallbackфункциявстречаодеяловызов。
  3. при использовании.call()метод:Когда в вашем контракте используется низкоуровневый.call().delegatecall()или.staticcall()методвызовеще один контракт,Если целевой контракт не возвращает никаких данных,Так Цельдоговорнойfallbackфункция将встречаодеялоосуществлять。

Следует отметить, что существует Solidity После версии 0.6.0,fallbackфункцияодеялоразделен на две части:fallbackиreceivereceiveфункция Обращайтесь только с чистымEtherприема,Нет случая, когда данные прикрепляются,иfallbackфункциязатем справиться сданныеизEtherперениматьилинеизвестныйфункциявызов。это означаетсуществоватьновая версияизSolidityсередина,Если вы хотите заниматься только получением чистого эфира,ты можешь использоватьreceiveфункция,Нет необходимости писать тело кода,Он автоматически получит эфир, не делая ничего другого.

Например,простойизreceiveфункцияможно определить так:

Язык кода:javascript
копировать
receive() external payable {}

Это означает, что ваш контракт может получать эфир.,и不встреча触发任何额外издействовать。иодинfallbackфункция可能встреча包含更多излогика,Напримериметь дело сперениматьприезжатьизданныеили Выполнить некоторую бизнес-логику。

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

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose