Анализ уязвимостей компилятора Solidity и стратегии реагирования
Компилятор является одной из основных компонентов современных компьютерных систем, его основная функция заключается в том, чтобы преобразовать исходный код на языках высокого уровня в исполняемые компьютерные инструкции. В отличие от безопасности приложенческого кода, проблемы безопасности самого компилятора часто могут быть упущены из виду. Тем не менее, уязвимости компилятора в определенных сценариях также могут представлять серьезный риск для безопасности.
Компилятор Solidity предназначен для преобразования кода смарт-контрактов в код машинных команд Ethereum Virtual Machine (EVM). В отличие от уязвимостей самой EVM, уязвимости компилятора Solidity не влияют напрямую на сеть Ethereum, но могут привести к несоответствию сгенерированного кода EVM ожиданиям разработчика, что может повлиять на нормальное функционирование смарт-контрактов и потенциально вызвать убытки пользователей.
Вот несколько примеров реальных уязвимостей компилятора 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 рекомендуется разработчикам:
Используйте более новую версию компилятора Solidity
Улучшить юнит-тесты, повысить покрытие кода
Старайтесь избегать использования сложных языковых особенностей, таких как встроенный ассемблер, многомерные массивы и кодирование/декодирование ABI и т. д.
Для специалистов по безопасности рекомендуется:
Учитывайте потенциальные риски безопасности, которые могут быть внесены компилятором в процессе аудита.
Призвать команду разработчиков обновить версию компилятора в процессе SDL
Внедрение автоматической проверки версии компилятора в CI/CD
Следует отметить, что большинство уязвимостей компиляторов возникают только в определенных кодовых паттернах, поэтому использование уязвимой версии компилятора не означает, что контракт обязательно несет в себе риски безопасности, фактическое влияние необходимо оценивать конкретно.
Для того чтобы продолжать обращать внимание на проблемы безопасности компилятора Solidity, можно обратиться к следующим ресурсам:
Предупреждение о безопасности, выпущенное командой Solidity
Список ошибок в официальном репозитории Solidity
Список ошибок различных версий компиляторов
Предупреждение о безопасности на странице кода контракта на Etherscan
Обращая внимание на безопасность компилятора, разумно используя языковые особенности и оставаясь бдительными, разработчики и специалисты по безопасности могут лучше обеспечить безопасность смарт-контрактов.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
15 Лайков
Награда
15
5
Поделиться
комментарий
0/400
ConsensusBot
· 21ч назад
Кто понесет эту ношу?
Посмотреть ОригиналОтветить0
RebaseVictim
· 21ч назад
Боже, кто-то всё ещё осмеливается использовать старую версию компилятора.
Анализ уязвимостей компилятора Solidity и стратегий реагирования
Анализ уязвимостей компилятора Solidity и стратегии реагирования
Компилятор является одной из основных компонентов современных компьютерных систем, его основная функция заключается в том, чтобы преобразовать исходный код на языках высокого уровня в исполняемые компьютерные инструкции. В отличие от безопасности приложенческого кода, проблемы безопасности самого компилятора часто могут быть упущены из виду. Тем не менее, уязвимости компилятора в определенных сценариях также могут представлять серьезный риск для безопасности.
Компилятор Solidity предназначен для преобразования кода смарт-контрактов в код машинных команд Ethereum Virtual Machine (EVM). В отличие от уязвимостей самой EVM, уязвимости компилятора Solidity не влияют напрямую на сеть Ethereum, но могут привести к несоответствию сгенерированного кода EVM ожиданиям разработчика, что может повлиять на нормальное функционирование смарт-контрактов и потенциально вызвать убытки пользователей.
Вот несколько примеров реальных уязвимостей компилятора Solidity:
Уязвимость существует в более ранних версиях компилятора Solidity (>=0.1.6 <0.4.4). Поскольку компилятор неправильно очищал старшие разряды при обработке переполнения целых чисел, это может привести к неожиданному изменению значений соседних переменных.
Уязвимость существует в версиях компилятора от 0.8.13 до 0.8.15. Из-за проблем с оптимизационной стратегией компилятора может произойти неправильное удаление инструкций записи в память в встроенном ассемблере, что приводит к тому, что поведение программы не соответствует ожиданиям.
Уязвимость затрагивает версии компилятора от 0.5.8 до 0.8.16. При выполнении операции abi.encode с массивом типа calldata возможно некорректное изменение соседних данных, что приводит к несоответствию закодированных и декодированных данных.
По поводу уязвимости компилятора Solidity рекомендуется разработчикам:
Для специалистов по безопасности рекомендуется:
Следует отметить, что большинство уязвимостей компиляторов возникают только в определенных кодовых паттернах, поэтому использование уязвимой версии компилятора не означает, что контракт обязательно несет в себе риски безопасности, фактическое влияние необходимо оценивать конкретно.
Для того чтобы продолжать обращать внимание на проблемы безопасности компилятора Solidity, можно обратиться к следующим ресурсам:
Обращая внимание на безопасность компилятора, разумно используя языковые особенности и оставаясь бдительными, разработчики и специалисты по безопасности могут лучше обеспечить безопасность смарт-контрактов.