smart contracts
August 31, 2022

Автоматизация аудита смарт-контрактов

или как взломать все контракты мира за 15 минут

Привет старички.

С вами @danoneo и сегодня я расскажу вам как можно просканировать весь блокчейн и найти уязвимые смарт-контракты.

На написание статьи меня вдохновила статья про поиск уязвимых ERC-721 контрактов от команды Decurity. Ребята занимаются аудитом web3, рекомендую их блог к прочтению.

Итак, вот что нам понадобится:

1. Semgrep


Как сказано в официальной документации: "Semgrep is a fast, open-source, static analysis tool for finding bugs and enforcing code standards at editor, commit, and CI time." Лучше и не скажешь.

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

Репозиторий: https://github.com/returntocorp/semgrep

2. Smart Contracts Sanctuary


Сборник верифицированных смарт-контрактов из всех основных сетей. Список контрактов обновляется 2 раза в сутки.

Репозиторий: https://github.com/tintinweb/smart-contract-sanctuary

3. Semgrep rules for smart contracts


Набор правил для semgrep от ребят из Decurity, с помощью которых мы будем искать уязвимые контракты. Здесь собраны почти все известные уязвимости, при помощи которых были совершены крупные DeFi взломы.

Репозиторий: https://github.com/Decurity/semgrep-smart-contracts

4. Как этим пользоваться


Не вижу смысла подробно расписывать процесс установки и настройки, ведь у меня наверняка умные читатели, которые сами во всем разберутся.

Вкратце - устанавливаем semgrep, скачиваем контракты из Smart-Contracts-Sanctuary, скачиваем список правил для поиска уязвимостей.

Запускаем скрипт, в данном случае я хочу найти кастомную функцию _transfer в erc-20 контрактах в mainnet Ethereum.

Готовлю конфиг с правилом erc20-public-transfer, запускаю semgrep - в базе обнаружено 227 370 контрактов, ожидаем пока всё просканируется...

Примерно через 10 минут процесс окончен, найдено 64 контракта с кастомной имплементацией функции _transfer.

Результаты выглядят примерно так:

Давайте изучим первый контракт: fe8759e11370006d2912fa04647d2be3b4091598_AKBASH

Убираем всё кроме хеша, и вставляем сюда: https://etherscan.io/address/<hash>

Получается так: https://etherscan.io/address/fe8759e11370006d2912fa04647d2be3b4091598

Смотрим код контракта - да, действительно, там есть уязвимая функция _transfer, без проверки на msg.sender. А это значит что любой адрес может вызвать эту функцию, и перевести чужие токены себе.

Ну что, давайте проверим уязвимость в деле?

Смотрим список холдеров, на первом месте пул юнисвапа, с 789кк (88% сапплая).

Берем его адрес, пихаем в sender, в recipient указываем свой адрес, в amount пишем кол-во токенов (не забываем про decimals):

Метамаск не ругается на "невозможность оценить газ", значит мы близки к победе.

Отправляем транзу - бабах! Юнисвап ограблен, хейтеры посрамлены:
https://etherscan.io/tx/0x4235e2de68275f422eb924105253ef73dcd216c2d951f36def2cd9da958118d5

Пожертвовал 5$ на эксперимент, всё ради вас, дорогие подписчики...

На юнисвапе можно поменять эти токены на остатки ETH в пуле ликвидности:

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

К тому же, остатки ликвидности в подобных контрактах уже были съедены более ушлыми ребятами (почти пол года назад):

Можете не утруждаться в поисках таких контрактов с ликвидностью , т.к. всё это уже давно было вынесено другими кулхацкерами.

На этом всё! Надеюсь вы будете пользоваться этим инструментом в благих целях (для аудита собственных контрактов, или в целях получения bug bounty).

Подписывайтесь на мой канал: https://t.me/danoneo_systems