Логика взлома Pickle Finance
Дисклеймер:
Аудит контракта, завершившийся 17 ноября, не затрагивал контроллер№4, который был взломан. Т.е. баг возник после аудита и добавления новых функций.
По скриншоту видно, что эксплоит (взлом) короткий:
3 основные части:
swapExactJarForJar
, earn ()
и снова `swapExactJarForJar'.
1 ШАГ: "swapExactJarForJar" позволяет текущему алгоритму протокола Pickle Finance заимствовать DAI из протокола Compound с делевериджем ( т е заложено 20 млн DAI –> взять под их залог 10 млн DAI ).
После делевериджа DAI -> отправлять их в хранилище pDAI Jar.
2 ШАГ: Функция `earn ()`превращает заимствованные DAI в cDAI, как и ожидалось.
3 ШАГ: Повторный вызов функции swapExactJarForJar
хакер отзывал cDAI обратно к контроллеру, а затем поместил их в поддельное хранилище.
В этом эксплойте используется 8 недостатков протокола Pickle Finance. Но есть одна вещь, на которую стоит обратить внимание. Этот эксплойт происходит только тогда, когда эти 8 недостатков происходят одновременно. Таким образом, если бы хоть 1 из 8 уязвимостей была исправлена, либо даже не существовала, этого эксплойта не было бы.
8 уязвимостей:
!!! 1. нет проверки соответствия по адресу, вызывавшему функцию swapExactJarForJar
, именно так и было подделано хранилище, куда «складывались» украденные средства
2. _target & _data функции передавались в открытом виде
3. функция withdrawForSwap помещена в неавторизованную функцию
4. функция delegatecall помещена в неавторизованную функцию
5. адреса whitelist имеет функцию арбитража
6. адреса whitelist могут обращаться к неавторизованной функции
7. функция earn находится в публичной части контракта
8. разрешен вывод активов из стратегии (нет таймлока).
Pickle Finance старался сделать интерфейс протокола и порядок с ним взаимодействия более дружелюбным и по совместительству – хакеропригодным.