В сегодняшней задаче перед нами стоит задача вывести все токены из протокола кредитования, который контролируется протоколом управления.
Давайте разберемся, как протокол управления управляет протоколом кредитования, просмотрев следующий код Solidity:
Уязвимость безопасности в SimpleGovernance заключается в его функции, состоящей только в проверке баланса токена моментального снимка до того, как пользователь поставит в очередь действия. Мы можем использовать этот недостаток, выполнив следующие шаги:
- Заимствуйте токены DVT из протокола кредитования.
- Сделайте снимок.
- Поставьте в очередь действие, чтобы вывести все DVT из протокола кредитования.
- Утвердить кредитный протокол для погашения нашего долга.
- Подождите 2 дня (из-за
ACTION_DELAY_IN_SECONDS = 2 days
). - Выполните действие и выведите все DVT из протокола кредитования.
Далее мы реализуем эти шаги с помощью Solidity:
Кроме того, нам нужно будет обновить тестовый файл:
it('Execution', async function () { const attacker = await (await ethers.getContractFactory('AttackSelfie', deployer)).deploy( pool.address, token.address, governance.address ); await attacker.attack(); await ethers.provider.send("evm_increaseTime", [2 * 24 * 60 * 60]); // wait 2 days await attacker.withDraw(player.address); });
Ключевые выводы
- Позволить кому-либо сделать снимок потенциально опасно.
- Действия должны отменяться голосованием для лучшего контроля и безопасности.