Репозиторий Trail of Bits с примерами реальных уязвимостей смарт-контрактов: reentrancy, integer overflow, denial of service, bad randomness, front-running, forced ether. Каждый паттерн — отдельный контракт с описанием, эксплойтом и исправлением.
git clone https://github.com/crytic/not-so-smart-contracts cd not-so-smart-contracts # Изучить паттерны уязвимостей: # reentrancy/, integer_overflow/, denial_of_service/, # bad_randomness/, front_running/, forced_ether/ # Развернуть для обучения через Foundry forge test --match-path "*/reentrancy/*"
No-so-smart-contracts теперь находится в building-secure-contracts (см. https://secure-contracts.com/)
Этот репозиторий содержит примеры типичных уязвимостей смарт-контрактов Ethereum, включая код из реальных смарт-контрактов. Используйте «(Не) Умные контракты» для изучения уязвимостей EVM и Solidity, в качестве справки при проведении аудита безопасности, а также в качестве эталона для инструментов анализа безопасности.
Каждый «Не Умный Контракт» включает стандартный набор информации:
Бонус! Мы также включили репозиторий и анализ нескольких ловушек (ханипотсов).
| Не Умный Контракт | Описание |
|---|---|
| Плохая случайность | Контракт пытается получить случайность на блокчейне, которой могут манипулировать пользователи |
| Отказ в обслуживании | Атакующий приостанавливает выполнение контракта, намеренно вызывая ошибку в стратегический момент |
| Принудительный прием Ether | Контракты можно принудительно заставить получить Ether |
| Неправильный интерфейс | Реализация использует другие сигнатуры функций, чем интерфейс |
| Целочисленное переполнение | Арифметика в Solidity (или EVM) по умолчанию не является безопасной |
| Гонка состояний | Транзакции могут быть перехвачены на блокчейне |
| Внедрение заново (Рентрантность) | Вызов внешних контрактов дает им контроль над выполнением |
| Непроверенный внешний вызов | Некоторые операции в Solidity молча завершаются неудачей |
| Незащищенная функция | Отсутствие использования модификатора функции позволяет атакующему манипулировать контрактом |
| Затенение переменных | Локальное имя переменной совпадает с именем во внешней области видимости |
| Неправильное имя конструктора | Любой может стать владельцем контракта из-за отсутствия конструктора |
Эти примеры разрабатываются и поддерживаются компанией Trail of Bits. Мы поощряем вклад, который покрывается нашей программой наград.
Если у вас есть вопросы, проблемы или вы просто хотите узнать больше, присоединяйтесь к каналу #ethereum в Empire Hacking Slack или свяжитесь с нами напрямую.