Новые уязвимости? Часть 5. Read-Only Reentrancy
Еще одна интересная атака. Попробую объяснить ее просто.
Все мы знаем, что некоторые функции в контрактах защищаются с помощью модификатора nonReentrant или каким-либо другим способом, который предотвращает повторный вход в функцию, до момента ее полного исполнения.
После ее выполнения практически всегда изменяется одна из переменных состояния, например баланс пользователя или пула.
Так вот, несмотря на то, что в external функции ставят защиту, view функции порой обходят стороной. А зря.
Теперь небольшой пример.
Возьмем функцию remove_liquidity(), которая удаляет все токены ликвидности с пула, делает рассылку underling токенов участникам один за одним в цикле, и в конце изменяет стоимость токена и его баланс.
Далее есть view функция get_virtual_price(), на которую полагаются другие протоколы, и которая показывает цену токена.
Хакер, в этих протоколах, мог вызывать view функцию через fallback(), в тот момент когда шла рассылка токенов в remove_liquidity(), и проводить свои манипуляции не до конца измененной ценой данного токена.
Надеюсь более-менее понятно расписал, потому что я сам пару раз запутывался в логике.
Проводя аудит контракта, теперь нам нужно следить и за view функциями, особенно, когда они на полагаются на баланс или цену токенов из стороннего контракта или биржи в целом.
#security #phantom
Post #582
253
- 👍 1