Skip to content
KitploitKITPLOIT
ИнструментыБлог
Log in
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
SoliditySecurity — Solidity Security | Kitploit
Инструменты/GitHubGitHub/al1ex/soliditysecurity
Анализ уязвимостейАнализ КодаОбучение и ОбразованиеПодобранные Ресурсы
GitHubal1ex/soliditysecurity

SoliditySecurity

Solidity Security

Репозиторий
35125 лет назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Что это такое

Этот пост задуман как относительно подробное и актуальное вводное руководство, описывающее прошлые ошибки, которые совершали разработчики Solidity, чтобы помочь будущим разработчикам не повторять историю.

Содержание

1. Re-Entrancy

  • Уязвимость
  • Методы предотвращения
  • Реальный пример: The DAO

2. Арифметические переполнения/недополнения

  • Уязвимость
  • Методы предотвращения
  • Реальные примеры: PoWHC и переполнение при пакетном переводе (CVE-2018-10299)

3. Неожиданный эфир

  • Уязвимость
  • Методы предотвращения
  • Реальные примеры: неизвестно

4. Delegatecall

  • Уязвимость
  • Методы предотвращения
  • Реальные примеры: Parity Multisig Wallet (второй взлом)

5. Видимости по умолчанию

  • Уязвимость
  • Методы предотвращения
  • Реальный пример: Parity MultiSig Wallet (первый взлом)

6. Иллюзия энтропии

  • Уязвимость
  • Методы предотвращения
  • Реальный пример: PRNG-контракты

7. Ссылки на внешние контракты

  • Уязвимость
  • Методы предотвращения
  • Реальный пример: ловушка Re-Entrancy

8. Атака на короткий адрес/параметр

  • Уязвимость
  • Методы предотвращения
  • Реальный пример: неизвестно

9. Непроверенные возвращаемые значения CALL

  • Уязвимость
  • Методы предотвращения
  • Реальные примеры: Etherpot и King of the Ether

10. Гонки / Фронтраннинг

  • Уязвимость
  • Методы предотвращения
  • Реальные примеры: ERC20 и Bancor

11. Отказ в обслуживании (DOS)

  • Уязвимость
  • Методы предотвращения
  • Реальный пример: GovernMental

12. Манипулирование временной меткой блока

  • Уязвимость
  • Методы предотвращения
  • Реальный пример: GovernMental

13. Конструкторы с осторожностью

  • Уязвимость
  • Методы предотвращения
  • Реальный пример: Rubixi

14. Неинициализированные указатели хранилища

  • Уязвимость
  • Методы предотвращения
  • Реальные примеры: ловушки: OpenAddressLottery и CryptoRoulette

15. Числа с плавающей точкой и числовая точность

  • Уязвимость
  • Методы предотвращения
  • Реальный пример: Ethstick

16. Аутентификация tx.origin

  • Уязвимость
  • Методы предотвращения
  • Реальный пример: неизвестно

Особенности Ethereum

  • Эфир без ключа
  • Одноразовые адреса
  • Аирдропы в одной транзакции

Список интересных взломов/багов, связанных с криптовалютами

Ссылки / Список для дальнейшего чтения

  • Ethereum Wiki - Безопасность
  • Документация Solidity - Вопросы безопасности
  • Consensus - Лучшие практики для смарт-контрактов Ethereum
  • История уязвимостей безопасности Ethereum, взломов и их исправлений
  • Проект безопасности децентрализованных приложений (DASP): Топ-10 за 2018 год
  • Обзор атак на смарт-контракты Ethereum
  • Безопасность смарт-контрактов Ethereum
  • Уроки, извлечённые из конкурса Underhanded Solidity

1. Re-Entrancy

Одна из особенностей смарт-контрактов Ethereum — возможность вызывать и использовать код других внешних контрактов. Контракты также обычно работают с эфиром и поэтому часто отправляют эфир на различные внешние адреса пользователей. Операция вызова внешнего контракта или отправки эфира на адрес требует от контракта выполнения внешнего вызова. Такие внешние вызовы могут быть перехвачены атакующими, которые заставляют контракт выполнять дополнительный код (например, через fallback-функцию) , включая вызовы к самому себе. Таким образом, исполнение кода "повторно входит" в контракт. Атаки такого рода были использованы в печально известном взломе DAO.

Для дальнейшего чтения об атаках повторного входа см. Атака Reentrancy на смарт-контракты и Consensus - Лучшие практики для смарт-контрактов Ethereum.

Уязвимость

Эта атака может произойти, когда контракт отправляет эфир на неизвестный адрес. Атакующий может тщательно создать контракт на внешнем адресе, содержащий вредоносный код в fallback-функции. Таким образом, когда контракт отправляет эфир на этот адрес, будет вызван вредоносный код. Обычно вредоносный код выполняет функцию на уязвимом контракте, совершая операции, которых разработчик не ожидал. Название "re-entrancy" происходит из того факта, что внешний вредоносный контракт вызывает функцию уязвимого контракта и "повторно входит" в исполнение кода в произвольном месте уязвимого контракта.

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

EtherStore.sol:```solidity contract EtherStore {

uint256 public withdrawalLimit = 1 ether;
mapping(address => uint256) public lastWithdrawTime;
mapping(address => uint256) public balances;

function depositFunds() public payable {
    balances[msg.sender] += msg.value;
}

function withdrawFunds (uint256 _weiToWithdraw) public {
    require(balances[msg.sender] >= _weiToWithdraw);
    // limit the withdrawal
    require(_weiToWithdraw <= withdrawalLimit);
    // limit the time allowed to withdraw
    require(now >= lastWithdrawTime[msg.sender] + 1 weeks);
    require(msg.sender.call.value(_weiToWithdraw)());
    balances[msg.sender] -= _weiToWithdraw;
    lastWithdrawTime[msg.sender] = now;
}

}

Этот контракт имеет две публичные функции: `depositFunds()` и `withdrawFunds()`. Функция `depositFunds()` просто увеличивает баланс отправителя. Функция `withdrawFunds()` позволяет отправителю указать сумму wei для вывода. Она будет выполнена только в том случае, если запрашиваемая сумма вывода меньше 1 ether и за последнюю неделю не было вывода средств. Или нет?...

Уязвимость находится на строке \[17\], где мы отправляем пользователю запрошенное количество ether. Рассмотрим злонамеренного атакующего, создающего следующий контракт,

Attack.sol:```solidity
import "EtherStore.sol";

contract Attack {
  EtherStore public etherStore;
Скачать инструмент