Анализ уязвимостей компилятора Solidity: безопасность и пути решения проблем

robot
Генерация тезисов в процессе

Анализ уязвимостей компилятора Solidity и стратегии противодействия

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

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

Компилятор Solidity не является исключением, в нескольких версиях компилятора Solidity существуют уязвимости безопасности. Функция компилятора Solidity заключается в преобразовании кода смарт-контрактов в машинный код команд Ethereum Virtual Machine (EVM), который в конечном итоге будет выполнен в EVM.

Важно отметить, что уязвимости компилятора Solidity и уязвимости самого EVM различаются. Уязвимости EVM относятся к проблемам безопасности, возникающим при выполнении инструкций виртуальной машины, которые могут повлиять на всю сеть Ethereum. А уязвимости компилятора Solidity возникают при преобразовании кода Solidity в код EVM, что не повлияет непосредственно на сеть Ethereum, но может привести к тому, что сгенерированный код EVM будет отличаться от ожидаемого разработчиком.

Анализ уязвимостей компилятора Solidity и меры реагирования

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

Разработчики и аудиторы контрактов часто больше сосредотачиваются на реализации логики кода контрактов и вопросах безопасности на уровне Solidity, игнорируя уязвимости компилятора. Просто проверка исходного кода контракта затрудняет выявление уязвимостей компилятора; для анализа необходимо учитывать конкретные версии компилятора и определенные кодовые паттерны.

Вот несколько примеров реальных уязвимостей компилятора Solidity:

  1. SOL-2016-9 HighOrderByteCleanStorage

Уязвимость присутствует в ранних версиях компилятора Solidity (>=0.1.6 <0.4.4). В некоторых случаях компилятор неправильно очищал старшие байты, что приводило к тому, что старший бит 1 записывался в хранилище после переполнения целого числа, перезаписывая значения соседних переменных. Такое поведение, не соответствующее ожидаемому, может иметь серьезные последствия в ситуациях, связанных с проверкой прав или учетом активов.

  1. SOL-2022-4 Влияемые на память побочные эффекты встроенной сборки

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

  1. SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup

Уязвимость затрагивает компиляторы версий с 0.5.8 по 0.8.16. При выполнении операции abi.encode над массивами типа calldata компилятор ошибочно очищал некоторые данные, что приводило к изменению соседних данных и вызывало несоответствие между закодированными и декодированными данными. Эта проблема также может возникнуть при внешних вызовах и при эмитировании событий, так как эти операции неявно выполняют abi.encode.

Анализ уязвимостей компилятора Solidity и меры по их устранению

На основе анализа уязвимостей компилятора Solidity, приведены следующие рекомендации по безопасности:

Для разработчиков:

  • Используйте более новую версию компилятора Solidity, как правило, в ней меньше известных проблем с безопасностью.
  • Улучшение юнит-тестов, повышение покрытия кода поможет выявить проблемы, вызванные компилятором.
  • Избегайте использования встроенного ассемблера, сложного кодирования и декодирования ABI и других операций, осторожно используйте новые функции и экспериментальные возможности

Для безопасности сотрудников:

  • Учитывайте потенциальные риски безопасности, которые могут быть введены компилятором во время аудита.
  • В процессе SDL настоятельно рекомендуется обновить версию компилятора, рассмотреть возможность внедрения автоматической проверки версии в CI/CD.
  • Оцените фактическое влияние уязвимости компилятора в зависимости от конкретных условий проекта, чтобы избежать излишней озабоченности.

Некоторые полезные ресурсы:

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

В общем, уязвимости компилятора Solidity хотя и редки, но могут иметь серьезные последствия. Разработчики и специалисты по безопасности должны быть бдительными и принимать соответствующие меры для снижения рисков.

Анализ уязвимостей компилятора Solidity и меры по их устранению

ETH-2.59%
SOL2.9%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 7
  • Поделиться
комментарий
0/400
FrogInTheWellvip
· 4ч назад
Компилятор🔨 — это смертельная вещь.
Посмотреть ОригиналОтветить0
TokenGuruvip
· 6ч назад
Оставьте +1. Братья, будьте осторожны с этой уязвимостью, рекомендую проверить версию контракта перед тем, как войти в позицию.
Посмотреть ОригиналОтветить0
AltcoinAnalystvip
· 07-21 10:23
Будь осторожен, это старая проблема версии 0.8.x.
Посмотреть ОригиналОтветить0
MemecoinResearchervip
· 07-21 10:12
ждет, чтобы произойти, основываясь на моем анализе (p<0.01)
Посмотреть ОригиналОтветить0
just_another_walletvip
· 07-21 10:12
Молодые разработчики, посмотрите скорее!
Посмотреть ОригиналОтветить0
FarmHoppervip
· 07-21 10:11
Офигеть, эта уязвимость выглядит страшно!
Посмотреть ОригиналОтветить0
YieldWhisperervip
· 07-21 10:10
с 2021 года наблюдаю этот же паттерн эксплуатации компилятора... разработчики никогда не учатся, смх
Посмотреть ОригиналОтветить0
  • Закрепить