Блог

Tornado Cash столкнулась с атакой на управление. Анализ уязвимостей

Tornado Cash - известный криптовалютный протокол в области сервисов микширования, ориентированных на конфиденциальность, известный тем, что маскирует происхождение и назначение средств и защищает частную жизнь пользователей. Из-за его частого использования в деятельности по отмыванию денег Соединенные Штаты в прошлом году запретили своим гражданам пользоваться этим сервисом. Tornado Cash работает по принципу децентрализованной автономной организации (DAO), что означает, что тот, кто владеет наибольшим количеством управляющих токенов TORN, имеет право определять направление обновления протокола и даже его собственное выживание.

Обзор

Исследователь блокчейна Самчун недавно указал в Twitter, что Tornado Cash стал жертвой атаки на управление. Злоумышленники предложили и предоставили себе 1,2 миллиона поддельных голосов, тем самым получив полный контроль над управлением. Впоследствии они изъяли и продали десять тысяч токенов Tron, заблокированных в пуле голосования.

Анализ уязвимости

Можно заметить, что логика 20-го предложения, представленного злоумышленником, аналогична ранее пройденному 16-му предложению, как показано на диаграмме ниже. Важно отметить, что авторы предложений могут лгать в описании, поэтому обычно рекомендуется читать код, чтобы убедиться в его соответствии предложению.
Однако многие не заметили, что 20-е предложение тайно добавило функцию "emergencyStop()", которая внутренне запускает самоуничтожение контракта.
Как только 20-е предложение будет проголосовано, злоумышленник вызывает "emergencyStop()" для самоуничтожения контракта. Затем хакер может развернуть новый вредоносный контракт на том же адресе. В этом случае вредоносный контракт обеспечивает злоумышленнику значительное количество поддельных голосов. Поскольку адрес контракта уже прошел голосование по предложению, он может быть выполнен сразу после развертывания. В результате злоумышленник успешно получает 1,2 миллиона фальшивых голосов, захватывая полный контроль над всем протоколом.

CREATE2 и CREATE

Чтобы понять, как злоумышленник разворачивает разные контракты по одному и тому же адресу, необходимо сначала разобраться в механизмах CREATE2 и CREATE вEVM.

При использовании CREATE для развертывания контракта адрес нового контракта представляет собой хэш, состоящий из адреса развертывающего и nonce. Поскольку nonce постепенно увеличивается и не может быть использован повторно, появление дубликатов адресов, как правило, можно предотвратить.

В случае использования CREATE2 для развертывания адрес нового контракта представляет собой хэш, состоящий из адреса развертывающего, определяемой пользователем соли и байткода контракта. Это означает, что каждое выполнение с одной и той же солью и байткодом будет генерировать один и тот же адрес. Однако если во время развертывания кодовый размер целевого адреса окажется ненулевым, развертывание завершится неудачей.

А функция самоуничтожения(selfdestruct) позволяет удалить контракт, обнулить кодовое значение и nonce.

Таким образом, процесс атаки выглядит следующим образом:
contract MetaDeployer{
    function deployFactory()public{
        factoryContract a = (new factoryContract){salt: "123"}(); //Use CREATE2
    }
}

contract factoryContract{
    function deployProposal_20()public{
        proposal_20 b = new proposal_20(); //Use CREATE
    }
    function deployMalicious()public{
        maliciousContract c = new maliciousContract(); //Use CREATE
    }
    function kill() public{
        selfdestruct(payable(address(0)));
    }
}

contract proposal_20{  //Proposal 20, including the functionality of proposal 16, and the hidden emergencyStop() function
    /* 
        included proposal 16 logic
    */
    function emergencyStop()public{
        selfdestruct(payable(address(0)));
    }
}

contract maliciousContract{ //The contract facilitating the acquisition of fraudulent votes by the attacker.
    function getFakeVote()public{
        //do something to get fake vote
    }
}
  1. Изначально злоумышленник развертывает контракт "MetaDeployer" и вызывает "deployFactory()" с использованием CREATE2 для развертывания контракта по адресу (0x111).
  2. Они вызывают "deployProposal_20()" для развертывания контракта для Предложения 20, используя CREATE с адресом (0x111) и nonce (0), развертывая контракт по адресу (0x222). После развертывания nonce (0x111)становится равным 1.
  3. После успешного голосования по предложению 20, обеспечивающего исполняемость адреса (0x222) в рамках протокола, злоумышленник вызывает "emergencyStop()" и "kill()" для уничтожения (0x111) и (0x222). В этот момент nonce адреса (0x111) обнуляется.
  4. Теперь снова вызывается "deployFactory()". Поскольку используется CREATE2, а соль и байткод одинаковы.
  5. В этот момент они вызывают "deployMalicious()" и снова используют CREATE, используя адрес (0x111) и nonce (0), в результате чего развертывание происходит по тому же адресу (0x222).
  6. Поскольку по адресу (0x222) уже прошло голосование, злоумышленник может выполнить атаки внутри вредоносного контракта, чтобы получить 1,2 миллиона поддельных голосов.

После взлома

Спустя несколько часов злоумышленник выдвинул новое предложение по восстановлению управления. Если это предложение будет успешно принято до конца 26 мая, то вредоносный код (использовавшийся для кражи прав голоса), ранее развернутый в протоколе, будет удален, а контроль над управлением DAO Tornado Cash вернется к держателям токенов TORN. Однако подлинность этого результата еще предстоит проверить.

Заключение

Эта уязвимость не присуща самому протоколу, а скорее является трояноподобной уязвимостью, созданной злоумышленником внутри предложения. Достаточная проверка кодов перед голосованием могла бы предотвратить одобрение таких предложений сообществом и тем самым предотвратить инциденты.

После развертывания смарт-контракта его нельзя изменить, поэтому очень важно проводить многочисленные стресс-тесты и аудиты безопасности перед развертыванием, чтобы избежать значительных финансовых потерь.

Если вы ищете профессионального аудитора, обращайтесь к нашим техническим специалистам.
Блокчейн и NFT