Количество смарт-контрактов в блокчейне Ethereum только за первую половину 2018 года выросло в два раза по сравнению с 2017-м. Соответственно, растет и множество уязвимостей, векторов атак на децентрализованные приложения. В этой статье мы попробуем упорядочить уязвимости аналогично OWASP Top 10. Кода тебя ждет немало, так что готовься — легко не будет.
Уже обнаружено множество уязвимых контрактов, которые доступны для взаимодействия и по сей день. И конечно, совершались атаки: самыми крупными хищениями стали 30 миллионов долларов из Parity и 53 миллиона долларов из DAO. И лишь в марте 2018 года организация NCC Group представила спецификацию уязвимостей децентрализованных приложений DASP (Decentralized Application Security Project) Top10.
Для начала давай вспомним, как устроены смарт-контракты в блокчейне Ethereum. В Ethereum существует два типа аккаунтов: внешние (аккаунты пользователей) и аккаунты контрактов, которые принято называть смарт-контрактами. Их различие состоит в том, что аккаунт контракта управляется только с помощью ассоциированного с ним программного кода, который выполняется на EVM (Ethereum Virtual Machine). Каждый смарт-контракт имеет свое хранилище и свою память.
Любое действие в блокчейне Ethereum выполняется с помощью транзакций: отправка ether с одного аккаунта на другой, создание контракта, обращение к функции контракта. Причем инициировать транзакции могут только внешние аккаунты, а контракты могут создавать транзакции только под действием полученных ими транзакций. За каждую транзакцию взимается комиссия, для этого введена специальная единица — gas. Комиссия рассчитывается как произведение цены gas и количества gas.
Пишутся контракты преимущественно на языке Solidity, который компилируется в байт-код и исполняется в EVM на всех узлах сети. На Solidity контракт выглядит как класс со своими методами и переменными. Обращаться к контракту можно, используя его ABI (Application Binary Interface).