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

Повторная атака на смарт-контрактыэто общая безопасностьлазейки,Особенно на блокчейне на базе 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
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.