Уязвимость: Price Oracle Manipulation
Это критическая уязвимость может быть обнаружена/использована в контрактах, которые зависят от внешних источников данных о цене актива.
Схема действия достаточно проста: пользователь собирается купить ETH через ваш контракт за USDC/USDT, контракт принимает сумму, на которую следует совершить обмен, а для расчета покупки используется функция, возвращающая текущую стоимость актива при его покупке например на Uniswap
Перед тем, как транзакция выполняется, происходит покупка большого количества одного токена из пары (часто с использованием flash loan буквально на миллиарды долларов), что искажает пропорцию активов в пуле —> искажает цену —> покупка проходит по невыгодной цене —> внесенная ранее ликвидность выносится из пула
Либо наоборот, атакующий покупает актив по очень выгодной цене, в зависимости от стратегии атаки
Пример
Схему на изображении надо читать следующим образом: красные стрелки это путь средств "вглубь" атакуемого контракта, зеленые - это вынос. Все действия происходят в рамках одной транзакции. Схема упрощенная, но суть от этого не меняется
Атакуемый контракт называется NFT Protocol, он позволяет купить NFT за 10 долларов
1. Атакующий (Flash Loan Receiver), получает займ
2. Первоначальная цена NFT при составляет 10 USDC или 1 ETH
4. Атакующий свапает на TSwap USDC на WETH (то есть выкупает ETH, эфира остается мало в пуле), меняя таким образом первоначальную пропорцию с 100 к 10 на 1000 к 1
5. 1 ETH теперь стоит 1000 USDC
6. Так как атакующий контракт берет информацию о цене эфира с TSWAP, то продажа NFT с контракта атакующему происходит за 0.01 ETH вместо 1 ETH
7. Атакующий продает NFT в другом месте за полную стоимость
8. Атакующий свапает ETH на USDC обратно, возвращая TSWAP пул в нормальное состояние
9. Атакующий возвращает Flash Loan + комиссии за использование средств
10. Профит атакующего равен цена NFT - комиссии за флешлоан
Как защититься
- Собирать данные по цене из нескольких источников
- Установить пороговые значения для цен
- Поставить таймлок на обновление цены, чтобы не допустить мгновенных колебаний
- Запрашивать подписи от поставщиков цен
Схему взял отсюда
Post #27
309

- ❤ 6