Анализ уязвимостей компилятора Solidity и стратегии противодействия
Компилятор является важной частью современных компьютерных систем, его роль заключается в преобразовании исходного кода на языке высокого уровня в исполняемый компьютером машинный код. В отличие от кода прикладных программ, безопасность самого компилятора часто игнорируется. Однако уязвимости компилятора в некоторых случаях могут привести к серьезным рискам безопасности.
Основная функция компилятора Solidity заключается в преобразовании кода смарт-контрактов в инструкции Ethereum Virtual Machine (EVM). В отличие от уязвимостей самого EVM, уязвимости компилятора Solidity в основном влияют на разработчиков смарт-контрактов и не представляют прямой угрозы безопасности сети Ethereum.
Уязвимости компилятора могут привести к тому, что сгенерированный EVM-код не будет соответствовать ожиданиям разработчиков. Поскольку смарт-контракты обычно связаны с криптовалютными активами, любые ошибки, вызванные компилятором, могут привести к потере активов пользователя. Учитывая только аудит исходного кода контракта, трудно выявить такие проблемы; необходимо проводить анализ с учетом конкретной версии компилятора и паттернов кода.
Примеры уязвимостей компилятора Solidity
SOL-2016-9 HighOrderByteCleanStorage
Уязвимость существует в ранних версиях компилятора Solidity (>=0.1.6 <0.4.4). В некоторых случаях переменные хранилища могут быть случайно изменены, что приводит к несоответствию возвращаемых значений функции ожидаемым. Эта несоответствие может иметь серьезные последствия в случаях, связанных с проверкой прав доступа или учетом активов.
Причина возникновения уязвимости заключается в том, что компилятор неправильно очищает старшие данные при обработке типов данных меньше 32 байт, что приводит к неправильной записи старших битов в соседние переменные при переполнении целого числа.
Уязвимость затрагивает компиляторы версий >=0.8.13 <0.8.15. Проблема возникает из-за неправильной обработки операций с памятью в процессе оптимизации компилятора. В некоторых случаях компилятор может ошибочно удалить казалось бы избыточные инструкции записи в память, что приводит к аномальным значениям возвращаемых функций.
Уязвимость существует в компиляторах версий >= 0.5.8 < 0.8.16. При выполнении операции abi.encode с массивами типа calldata компилятор ошибочно очищал некоторые данные, что приводило к изменению соседних данных и вызывало несоответствие закодированных и декодированных данных.
Следует обратить внимание на то, что при внешнем вызове и эмитировании события происходит неявное использование abi.encode, поэтому влияние этой уязвимости может оказаться более широким, чем ожидалось.
Рекомендации по безопасности
В связи с уязвимостями компилятора Solidity, команда по безопасности Cobo Blockchain предлагает следующие рекомендации:
Для разработчиков:
Используйте более новую версию компилятора Solidity
Улучшить тестовые случаи модулей, повысить покрытие кода
Избегайте использования встроенных ассемблеров, сложного кодирования и декодирования ABI и других операций, осторожно используйте новые функции и экспериментальные возможности.
К безопасности персонала:
Обратите внимание на потенциальные риски безопасности, которые могут быть введены компилятором во время аудита
Продвигать обновление версии компилятора в процессе разработки, рассматривая возможность внедрения автоматической проверки версии в CI/CD.
Оценка фактического влияния уязвимостей компилятора в зависимости от конкретного проекта
Практические ресурсы:
Официальный блог предупреждений о безопасности Solidity
Список ошибок в репозитории Solidity на GitHub
Список ошибок компилятора для разных версий
Уведомление о уязвимости компилятора на странице кода контракта Etherscan
В общем, разработчики и специалисты по безопасности должны обращать внимание на риски, связанные с уязвимостями компилятора Solidity, и принимать соответствующие меры для снижения угроз безопасности. Также необходимо объективно оценивать конкретные последствия, чтобы избежать чрезмерной паники.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
13 Лайков
Награда
13
4
Поделиться
комментарий
0/400
AirdropChaser
· 08-02 03:03
Еще одна причина, по которой будут играть для лохов
Посмотреть ОригиналОтветить0
BearMarketBuilder
· 08-02 02:55
Ах, весь день разрабатываю, боюсь этой вещи.
Посмотреть ОригиналОтветить0
TeaTimeTrader
· 08-02 02:53
Можно ли считать «литературу, в которой виноват компилятор» нормальным явлением?
Посмотреть ОригиналОтветить0
0xOverleveraged
· 08-02 02:42
Грязный компилятор не надежен, что еще делать с контрактами?
Анализ уязвимостей компилятора Solidity: потенциальные риски, которые разработчики не должны игнорировать
Анализ уязвимостей компилятора Solidity и стратегии противодействия
Компилятор является важной частью современных компьютерных систем, его роль заключается в преобразовании исходного кода на языке высокого уровня в исполняемый компьютером машинный код. В отличие от кода прикладных программ, безопасность самого компилятора часто игнорируется. Однако уязвимости компилятора в некоторых случаях могут привести к серьезным рискам безопасности.
Основная функция компилятора Solidity заключается в преобразовании кода смарт-контрактов в инструкции Ethereum Virtual Machine (EVM). В отличие от уязвимостей самого EVM, уязвимости компилятора Solidity в основном влияют на разработчиков смарт-контрактов и не представляют прямой угрозы безопасности сети Ethereum.
Уязвимости компилятора могут привести к тому, что сгенерированный EVM-код не будет соответствовать ожиданиям разработчиков. Поскольку смарт-контракты обычно связаны с криптовалютными активами, любые ошибки, вызванные компилятором, могут привести к потере активов пользователя. Учитывая только аудит исходного кода контракта, трудно выявить такие проблемы; необходимо проводить анализ с учетом конкретной версии компилятора и паттернов кода.
Примеры уязвимостей компилятора Solidity
SOL-2016-9 HighOrderByteCleanStorage
Уязвимость существует в ранних версиях компилятора Solidity (>=0.1.6 <0.4.4). В некоторых случаях переменные хранилища могут быть случайно изменены, что приводит к несоответствию возвращаемых значений функции ожидаемым. Эта несоответствие может иметь серьезные последствия в случаях, связанных с проверкой прав доступа или учетом активов.
Причина возникновения уязвимости заключается в том, что компилятор неправильно очищает старшие данные при обработке типов данных меньше 32 байт, что приводит к неправильной записи старших битов в соседние переменные при переполнении целого числа.
SOL-2022-4 ВстраиваемаяАссемблернаяПамятьПобочныеЭффекты
Уязвимость затрагивает компиляторы версий >=0.8.13 <0.8.15. Проблема возникает из-за неправильной обработки операций с памятью в процессе оптимизации компилятора. В некоторых случаях компилятор может ошибочно удалить казалось бы избыточные инструкции записи в память, что приводит к аномальным значениям возвращаемых функций.
SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup
Уязвимость существует в компиляторах версий >= 0.5.8 < 0.8.16. При выполнении операции abi.encode с массивами типа calldata компилятор ошибочно очищал некоторые данные, что приводило к изменению соседних данных и вызывало несоответствие закодированных и декодированных данных.
Следует обратить внимание на то, что при внешнем вызове и эмитировании события происходит неявное использование abi.encode, поэтому влияние этой уязвимости может оказаться более широким, чем ожидалось.
Рекомендации по безопасности
В связи с уязвимостями компилятора Solidity, команда по безопасности Cobo Blockchain предлагает следующие рекомендации:
Для разработчиков:
К безопасности персонала:
Практические ресурсы:
В общем, разработчики и специалисты по безопасности должны обращать внимание на риски, связанные с уязвимостями компилятора Solidity, и принимать соответствующие меры для снижения угроз безопасности. Также необходимо объективно оценивать конкретные последствия, чтобы избежать чрезмерной паники.