Анализ уязвимостей компилятора Solidity и стратегии противодействия
Компилятор является одним из основных компонентов современных компьютерных систем, его основная функция заключается в преобразовании исходного кода на высокоуровневом языке программирования в исполняемый компьютерный код.
Хотя большинство разработчиков и специалистов по безопасности больше сосредоточены на безопасности кода приложений, безопасность самого компилятора также не должна игнорироваться. Как компьютерная программа, компилятор также может иметь уязвимости безопасности, которые в некоторых случаях могут привести к серьезным рискам. Например, при компиляции и выполнении кода JavaScript на стороне клиента браузер может подвергнуть пользователя атаке удаленного выполнения кода из-за уязвимости в движке разбора JavaScript, что в конечном итоге может привести к тому, что злоумышленник получит контроль над браузером жертвы или даже над операционной системой.
Компилятор Solidity не является исключением, в нескольких версиях компилятора Solidity существуют уязвимости безопасности. Функция компилятора Solidity заключается в преобразовании кода смарт-контрактов в машинный код команд Ethereum Virtual Machine (EVM), который в конечном итоге будет выполнен в EVM.
Важно отметить, что уязвимости компилятора Solidity и уязвимости самого EVM различаются. Уязвимости EVM относятся к проблемам безопасности, возникающим при выполнении инструкций виртуальной машины, которые могут повлиять на всю сеть Ethereum. А уязвимости компилятора Solidity возникают при преобразовании кода Solidity в код EVM, что не повлияет непосредственно на сеть Ethereum, но может привести к тому, что сгенерированный код EVM будет отличаться от ожидаемого разработчиком.
Одна из угроз уязвимости компилятора Solidity заключается в том, что она может привести к несоответствию сгенерированного EVM-кода ожиданиям разработчика смарт-контракта. Поскольку смарт-контракты на Ethereum часто связаны с криптовалютными активами пользователей, любые ошибки, вызванные компилятором, могут привести к потере активов пользователей, что является серьезным последствием.
Разработчики и аудиторы контрактов часто больше сосредотачиваются на реализации логики кода контрактов и вопросах безопасности на уровне Solidity, игнорируя уязвимости компилятора. Просто проверка исходного кода контракта затрудняет выявление уязвимостей компилятора; для анализа необходимо учитывать конкретные версии компилятора и определенные кодовые паттерны.
Вот несколько примеров реальных уязвимостей компилятора Solidity:
SOL-2016-9 HighOrderByteCleanStorage
Уязвимость присутствует в ранних версиях компилятора Solidity (>=0.1.6 <0.4.4). В некоторых случаях компилятор неправильно очищал старшие байты, что приводило к тому, что старший бит 1 записывался в хранилище после переполнения целого числа, перезаписывая значения соседних переменных. Такое поведение, не соответствующее ожидаемому, может иметь серьезные последствия в ситуациях, связанных с проверкой прав или учетом активов.
SOL-2022-4 Влияемые на память побочные эффекты встроенной сборки
Уязвимость существует в компиляторах версий от 0.8.13 до 0.8.15. Из-за проблем с оптимизационной стратегией компилятора в некоторых случаях могут ошибочно удаляться инструкции записи в память, что приводит к тому, что возвращаемое значение функции не соответствует ожиданиям. Эту ошибку, связанную с оптимизацией, трудно обнаружить с помощью простой проверки кода.
Уязвимость затрагивает компиляторы версий с 0.5.8 по 0.8.16. При выполнении операции abi.encode над массивами типа calldata компилятор ошибочно очищал некоторые данные, что приводило к изменению соседних данных и вызывало несоответствие между закодированными и декодированными данными. Эта проблема также может возникнуть при внешних вызовах и при эмитировании событий, так как эти операции неявно выполняют abi.encode.
На основе анализа уязвимостей компилятора Solidity, приведены следующие рекомендации по безопасности:
Для разработчиков:
Используйте более новую версию компилятора Solidity, как правило, в ней меньше известных проблем с безопасностью.
Улучшение юнит-тестов, повышение покрытия кода поможет выявить проблемы, вызванные компилятором.
Избегайте использования встроенного ассемблера, сложного кодирования и декодирования ABI и других операций, осторожно используйте новые функции и экспериментальные возможности
Для безопасности сотрудников:
Учитывайте потенциальные риски безопасности, которые могут быть введены компилятором во время аудита.
В процессе SDL настоятельно рекомендуется обновить версию компилятора, рассмотреть возможность внедрения автоматической проверки версии в CI/CD.
Оцените фактическое влияние уязвимости компилятора в зависимости от конкретных условий проекта, чтобы избежать излишней озабоченности.
Некоторые полезные ресурсы:
Официальное предупреждение о безопасности от Solidity
Список ошибок, регулярно обновляемый в репозитории Solidity
Список ошибок компилятора для всех версий, может использоваться для автоматической проверки
Уведомление о уязвимости компилятора на странице кода контракта Etherscan
В общем, уязвимости компилятора Solidity хотя и редки, но могут иметь серьезные последствия. Разработчики и специалисты по безопасности должны быть бдительными и принимать соответствующие меры для снижения рисков.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
20 Лайков
Награда
20
5
Поделиться
комментарий
0/400
AltcoinAnalyst
· 07-21 10:23
Будь осторожен, это старая проблема версии 0.8.x.
Посмотреть ОригиналОтветить0
MemecoinResearcher
· 07-21 10:12
ждет, чтобы произойти, основываясь на моем анализе (p<0.01)
Посмотреть ОригиналОтветить0
just_another_wallet
· 07-21 10:12
Молодые разработчики, посмотрите скорее!
Посмотреть ОригиналОтветить0
FarmHopper
· 07-21 10:11
Офигеть, эта уязвимость выглядит страшно!
Посмотреть ОригиналОтветить0
YieldWhisperer
· 07-21 10:10
с 2021 года наблюдаю этот же паттерн эксплуатации компилятора... разработчики никогда не учатся, смх
Анализ уязвимостей компилятора Solidity: безопасность и пути решения проблем
Анализ уязвимостей компилятора Solidity и стратегии противодействия
Компилятор является одним из основных компонентов современных компьютерных систем, его основная функция заключается в преобразовании исходного кода на высокоуровневом языке программирования в исполняемый компьютерный код.
Хотя большинство разработчиков и специалистов по безопасности больше сосредоточены на безопасности кода приложений, безопасность самого компилятора также не должна игнорироваться. Как компьютерная программа, компилятор также может иметь уязвимости безопасности, которые в некоторых случаях могут привести к серьезным рискам. Например, при компиляции и выполнении кода JavaScript на стороне клиента браузер может подвергнуть пользователя атаке удаленного выполнения кода из-за уязвимости в движке разбора JavaScript, что в конечном итоге может привести к тому, что злоумышленник получит контроль над браузером жертвы или даже над операционной системой.
Компилятор Solidity не является исключением, в нескольких версиях компилятора Solidity существуют уязвимости безопасности. Функция компилятора Solidity заключается в преобразовании кода смарт-контрактов в машинный код команд Ethereum Virtual Machine (EVM), который в конечном итоге будет выполнен в EVM.
Важно отметить, что уязвимости компилятора Solidity и уязвимости самого EVM различаются. Уязвимости EVM относятся к проблемам безопасности, возникающим при выполнении инструкций виртуальной машины, которые могут повлиять на всю сеть Ethereum. А уязвимости компилятора Solidity возникают при преобразовании кода Solidity в код EVM, что не повлияет непосредственно на сеть Ethereum, но может привести к тому, что сгенерированный код EVM будет отличаться от ожидаемого разработчиком.
Одна из угроз уязвимости компилятора Solidity заключается в том, что она может привести к несоответствию сгенерированного EVM-кода ожиданиям разработчика смарт-контракта. Поскольку смарт-контракты на Ethereum часто связаны с криптовалютными активами пользователей, любые ошибки, вызванные компилятором, могут привести к потере активов пользователей, что является серьезным последствием.
Разработчики и аудиторы контрактов часто больше сосредотачиваются на реализации логики кода контрактов и вопросах безопасности на уровне Solidity, игнорируя уязвимости компилятора. Просто проверка исходного кода контракта затрудняет выявление уязвимостей компилятора; для анализа необходимо учитывать конкретные версии компилятора и определенные кодовые паттерны.
Вот несколько примеров реальных уязвимостей компилятора Solidity:
Уязвимость присутствует в ранних версиях компилятора Solidity (>=0.1.6 <0.4.4). В некоторых случаях компилятор неправильно очищал старшие байты, что приводило к тому, что старший бит 1 записывался в хранилище после переполнения целого числа, перезаписывая значения соседних переменных. Такое поведение, не соответствующее ожидаемому, может иметь серьезные последствия в ситуациях, связанных с проверкой прав или учетом активов.
Уязвимость существует в компиляторах версий от 0.8.13 до 0.8.15. Из-за проблем с оптимизационной стратегией компилятора в некоторых случаях могут ошибочно удаляться инструкции записи в память, что приводит к тому, что возвращаемое значение функции не соответствует ожиданиям. Эту ошибку, связанную с оптимизацией, трудно обнаружить с помощью простой проверки кода.
Уязвимость затрагивает компиляторы версий с 0.5.8 по 0.8.16. При выполнении операции abi.encode над массивами типа calldata компилятор ошибочно очищал некоторые данные, что приводило к изменению соседних данных и вызывало несоответствие между закодированными и декодированными данными. Эта проблема также может возникнуть при внешних вызовах и при эмитировании событий, так как эти операции неявно выполняют abi.encode.
На основе анализа уязвимостей компилятора Solidity, приведены следующие рекомендации по безопасности:
Для разработчиков:
Для безопасности сотрудников:
Некоторые полезные ресурсы:
В общем, уязвимости компилятора Solidity хотя и редки, но могут иметь серьезные последствия. Разработчики и специалисты по безопасности должны быть бдительными и принимать соответствующие меры для снижения рисков.