Какие уязвимости могут встречаться в смарт-контрактах?

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

Переполнения и недополнения чисел (Integer Overflow/Underflow)

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

Неправильное управление доступом

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

Уязвимости при использовании внешних вызовов

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

Фронтраннинг (Front-running)

Кандидат пояснил, что транзакции в блокчейне сначала попадают в mempool, где их могут увидеть майнеры и боты. Злоумышленник способен скопировать транзакцию, изменить параметры (например, увеличить комиссию за газ) и отправить ее в сеть, чтобы она была выполнена раньше оригинальной. Это особенно опасно в DeFi-приложениях, где операции связаны с торговыми сделками.

Уязвимости в генерации случайных чисел

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

Неинициализированные хранилища и переменные

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

DoS-атаки (Denial of Service)

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

Уязвимости в обновляемых смарт-контрактах

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

Ошибки в обработке исключений

В Solidity есть различия в поведении функций call, delegatecall и transfer. Если разработчик неправильно обрабатывает возвращаемые значения или исключения, это может привести к неожиданным последствиям, например блокировке средств.

Неочевидные логические ошибки

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