В сегодняшней задаче перед нами стоит задача вывести все токены из протокола кредитования, который контролируется протоколом управления.

Давайте разберемся, как протокол управления управляет протоколом кредитования, просмотрев следующий код Solidity:

Уязвимость безопасности в SimpleGovernance заключается в его функции, состоящей только в проверке баланса токена моментального снимка до того, как пользователь поставит в очередь действия. Мы можем использовать этот недостаток, выполнив следующие шаги:

  1. Заимствуйте токены DVT из протокола кредитования.
  2. Сделайте снимок.
  3. Поставьте в очередь действие, чтобы вывести все DVT из протокола кредитования.
  4. Утвердить кредитный протокол для погашения нашего долга.
  5. Подождите 2 дня (из-за ACTION_DELAY_IN_SECONDS = 2 days).
  6. Выполните действие и выведите все 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);

    });

Ключевые выводы

  • Позволить кому-либо сделать снимок потенциально опасно.
  • Действия должны отменяться голосованием для лучшего контроля и безопасности.