Компилятор является одним из основных компонентов современных компьютерных систем, его основная функция заключается в преобразовании исходного кода на высокоуровневом языке программирования в исполняемый машинный код. Хотя большинство разработчиков и специалистов по безопасности обычно сосредотачиваются на безопасности кода приложений, безопасность самого компилятора часто игнорируется. На самом деле, компилятор, как программа, также может иметь уязвимости, которые в некоторых случаях могут представлять серьезный риск для безопасности.
Например, в процессе выполнения кода JavaScript, который интерпретируется браузером, уязвимости в движке JavaScript могут привести к атакам удаленного выполнения кода, когда пользователи посещают вредоносные веб-страницы, что в конечном итоге может позволить злоумышленникам контролировать браузер жертвы или даже операционную систему. Кроме того, исследования показывают, что ошибки компилятора Clang C++ также могут привести к серьезным последствиям, таким как удаленное выполнение кода.
Компилятор Solidity также имеет уязвимости безопасности. Согласно выпущенному командой разработчиков Solidity предупреждению о безопасности, в нескольких версиях компилятора Solidity существуют потенциальные угрозы. Основная функция компилятора Solidity заключается в преобразовании кода смарт-контрактов в инструкции к Ethereum Virtual Machine (EVM), которые в конечном итоге загружаются в Ethereum через транзакции и выполняются EVM.
Следует отметить, что уязвимости компилятора Solidity отличаются от уязвимостей самого EVM. Уязвимости EVM относятся к проблемам безопасности, возникающим при выполнении инструкций виртуальной машины, что может повлиять на всю сеть Ethereum. В то время как уязвимости компилятора Solidity касаются проблем, возникающих при преобразовании кода Solidity в код EVM, которые не оказывают непосредственного влияния на саму сеть Ethereum.
Уязвимости компилятора Solidity могут привести к тому, что сгенерированный код EVM будет отличаться от ожидаемого разработчиком. Поскольку смарт-контракты на Ethereum обычно связаны с криптовалютными активами пользователей, любые ошибки, вызванные компилятором, могут привести к потере активов пользователей, что может иметь серьезные последствия. Разработчики и аудиторы контрактов обычно сосредотачиваются на реализации логики контракта и распространенных проблемах безопасности, в то время как уязвимости компилятора трудно обнаружить только через аудит исходного кода, что требует совместного анализа с учетом конкретной версии компилятора и модели кода.
Вот несколько реальных примеров уязвимостей компилятора Solidity:
SOL-2016-9 HighOrderByteCleanStorage
Уязвимость существует в более ранних версиях компилятора Solidity (>=0.1.6 <0.4.4). В некоторых случаях значение переменной хранения может быть случайно изменено, что приводит к тому, что возвращаемое значение функции не совпадает с ожидаемым. Эта несоответствие может привести к серьезным последствиям в таких сценариях, как проверка прав доступа или учёт активов.
Уязвимость существует в компиляторах версий с 0.8.13 по 0.8.15. Из-за проблем с оптимизационной стратегией компилятора, изменения в памяти в некоторых встроенных ассемблерных кодах могут быть ошибочно удалены, что приводит к ошибке в значении, возвращаемом функцией.
Уязвимость затрагивает компиляторы версий с 0.5.8 по 0.8.16. При выполнении операции abi.encode с массивами типа calldata возможно неправильное очищение некоторых данных, что приводит к изменению соседних данных и вызывает несоответствие данных после кодирования и декодирования.
В связи с уязвимостями компилятора Solidity, команда по безопасности блокчейна Cobo предлагает следующие рекомендации:
Для разработчиков:
Используйте более новую версию компилятора Solidity
Улучшить тестовые случаи модулей, повысить покрытие кода
Избегайте использования встроенного ассемблера, сложного кодирования и декодирования ABI и других операций, осторожно используйте новые функции и экспериментальные возможности.
К безопасным сотрудникам:
Учитывайте риски безопасности, которые могут быть введены компилятором во время аудита.
Рекомендуется команде разработчиков своевременно обновлять версию компилятора
Внедрение автоматической проверки версии компилятора в процессе CI/CD
Оцените фактическое влияние уязвимостей компилятора на безопасность в зависимости от конкретного проекта.
Некоторые полезные ресурсы:
Официальное предупреждение о безопасности блога Solidity
Список ошибок в репозитории Solidity на GitHub
Список ошибок компилятора для всех версий
Уведомление о уязвимости на странице кода контракта Etherscan
Понимание особенностей и влияния уязвимостей компилятора Solidity позволяет разработчикам и специалистам по безопасности более полно оценивать риски безопасности смарт-контрактов и принимать соответствующие меры для снижения потенциальных угроз.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
16 Лайков
Награда
16
6
Поделиться
комментарий
0/400
0xSoulless
· 4ч назад
Ещё один инструмент для разыгрывания неудачников
Посмотреть ОригиналОтветить0
RumbleValidator
· 07-12 19:34
Эта уязвимость может вызвать ошибки на уровне соглашения? Риски для узлов велики!
Посмотреть ОригиналОтветить0
SocialFiQueen
· 07-12 19:29
Похоже, смарт-контракты собираются провалиться~ Ха-ха, так волнительно!
Посмотреть ОригиналОтветить0
CryptoTherapist
· 07-12 19:27
просто еще один случай синдрома тревожности разработчика... дышите через процесс отладки семья
Посмотреть ОригиналОтветить0
StablecoinAnxiety
· 07-12 19:14
Компиляторы не безопасны, кто осмелится кодить?
Посмотреть ОригиналОтветить0
Blockwatcher9000
· 07-12 19:06
Разработчикам очень трудно, обнимаю свой btc, Мошенничество.
Анализ уязвимостей компилятора Solidity: скрытые риски, влияющие на безопасность смарт-контрактов
Глубина анализа уязвимостей компилятора Solidity
Компилятор является одним из основных компонентов современных компьютерных систем, его основная функция заключается в преобразовании исходного кода на высокоуровневом языке программирования в исполняемый машинный код. Хотя большинство разработчиков и специалистов по безопасности обычно сосредотачиваются на безопасности кода приложений, безопасность самого компилятора часто игнорируется. На самом деле, компилятор, как программа, также может иметь уязвимости, которые в некоторых случаях могут представлять серьезный риск для безопасности.
Например, в процессе выполнения кода JavaScript, который интерпретируется браузером, уязвимости в движке JavaScript могут привести к атакам удаленного выполнения кода, когда пользователи посещают вредоносные веб-страницы, что в конечном итоге может позволить злоумышленникам контролировать браузер жертвы или даже операционную систему. Кроме того, исследования показывают, что ошибки компилятора Clang C++ также могут привести к серьезным последствиям, таким как удаленное выполнение кода.
Компилятор Solidity также имеет уязвимости безопасности. Согласно выпущенному командой разработчиков Solidity предупреждению о безопасности, в нескольких версиях компилятора Solidity существуют потенциальные угрозы. Основная функция компилятора Solidity заключается в преобразовании кода смарт-контрактов в инструкции к Ethereum Virtual Machine (EVM), которые в конечном итоге загружаются в Ethereum через транзакции и выполняются EVM.
Следует отметить, что уязвимости компилятора Solidity отличаются от уязвимостей самого EVM. Уязвимости EVM относятся к проблемам безопасности, возникающим при выполнении инструкций виртуальной машины, что может повлиять на всю сеть Ethereum. В то время как уязвимости компилятора Solidity касаются проблем, возникающих при преобразовании кода Solidity в код EVM, которые не оказывают непосредственного влияния на саму сеть Ethereum.
Уязвимости компилятора Solidity могут привести к тому, что сгенерированный код EVM будет отличаться от ожидаемого разработчиком. Поскольку смарт-контракты на Ethereum обычно связаны с криптовалютными активами пользователей, любые ошибки, вызванные компилятором, могут привести к потере активов пользователей, что может иметь серьезные последствия. Разработчики и аудиторы контрактов обычно сосредотачиваются на реализации логики контракта и распространенных проблемах безопасности, в то время как уязвимости компилятора трудно обнаружить только через аудит исходного кода, что требует совместного анализа с учетом конкретной версии компилятора и модели кода.
Вот несколько реальных примеров уязвимостей компилятора Solidity:
Уязвимость существует в более ранних версиях компилятора Solidity (>=0.1.6 <0.4.4). В некоторых случаях значение переменной хранения может быть случайно изменено, что приводит к тому, что возвращаемое значение функции не совпадает с ожидаемым. Эта несоответствие может привести к серьезным последствиям в таких сценариях, как проверка прав доступа или учёт активов.
Уязвимость существует в компиляторах версий с 0.8.13 по 0.8.15. Из-за проблем с оптимизационной стратегией компилятора, изменения в памяти в некоторых встроенных ассемблерных кодах могут быть ошибочно удалены, что приводит к ошибке в значении, возвращаемом функцией.
Уязвимость затрагивает компиляторы версий с 0.5.8 по 0.8.16. При выполнении операции abi.encode с массивами типа calldata возможно неправильное очищение некоторых данных, что приводит к изменению соседних данных и вызывает несоответствие данных после кодирования и декодирования.
В связи с уязвимостями компилятора Solidity, команда по безопасности блокчейна Cobo предлагает следующие рекомендации:
Для разработчиков:
К безопасным сотрудникам:
Некоторые полезные ресурсы:
Понимание особенностей и влияния уязвимостей компилятора Solidity позволяет разработчикам и специалистам по безопасности более полно оценивать риски безопасности смарт-контрактов и принимать соответствующие меры для снижения потенциальных угроз.