Манипуляция оракулами и защита цены
Если протокол верит неверной цене, он сам отдаёт деньги — без всякого взлома кода.
Манипуляция оракулом — искажение цены, на которую опирается протокол, чтобы заставить его принять невыгодное для себя решение (выдать слишком большой заём, неверно ликвидировать, неправильно посчитать выплату).
Суть атаки концептуально
Многие протоколы спрашивают «сколько стоит залог?» у источника цены. Если этот источник — спот одного AMM-пула, его можно временно сдвинуть крупной сделкой (часто финансируемой флеш-займом). Логика атаки: исказить цену → пока она искажена, провести операцию, выгодную при этой цене (например, занять под раздутый залог) → вернуть цену. Код контракта при этом «не взломан» — он честно сделал то, что ему велела неверная цена. Уязвимость не в синтаксисе, а в доверии к манипулируемому источнику.
// УЯЗВИМО: цена из спота одного пула
function collateralValue(uint qty) public view returns (uint) {
uint price = ammPool.getSpotPrice(); // двигается одной сделкой
return qty * price;
}Защита 1: усреднение во времени (TWAP)
TWAP берёт среднюю цену за окно (минуты), а не мгновенную. Чтобы сдвинуть среднее, атакующему придётся удерживать искажение много блоков подряд, теряя деньги на арбитраже всё это время — обычно невыгодно. TWAP не идеален (запаздывает, плох на низколиквидных парах), но резко поднимает стоимость атаки.
Защита 2: децентрализованные оракулы (Chainlink)
Сеть независимых нод собирает цену с множества бирж и публикует агрегат. Сдвинуть один пул бесполезно — оракул берёт цену по рынку в целом. Это золотой стандарт для ценных активов.
// БЕЗОПАСНЕЕ: внешний агрегированный оракул + проверки качества
(uint80 roundId, int answer, , uint updatedAt, ) = feed.latestRoundData();
require(answer > 0, "bad price"); // здравый смысл
require(updatedAt > block.timestamp - 3600, "stale"); // свежесть
// при желании: разумные нижний/верхний пределы ценыКак работает под капотом: проверки качества данных
Даже правильный оракул нужно использовать защищённо: проверять, что цена положительна (защита от сбоя), что она свежая (не устарела — старая цена опасна не меньше неверной), и что укладывается в разумные пределы. Никогда не используйте цену «как есть» без санитарных проверок.
Частые ошибки
- Spot-цена одного пула как оракул. Самая частая причина «оракульных» взломов.
- Игнорировать свежесть. Зависший фид отдаёт старую цену — протокол принимает решения по прошлому.
- Один источник без резерва. Единая точка отказа; для крупных протоколов нужен запасной фид/санити-чек.
Итоги
- Манипуляция оракулом обманывает протокол неверной ценой — код при этом «не взломан».
- Корень — доверие к манипулируемому источнику (спот одного пула).
- Защита: TWAP (дорого удерживать) и агрегированные оракулы (Chainlink).
- Всегда проверяйте цену на положительность, свежесть и разумные пределы.