Аналіз вразливостей компілятора Solidity та стратегії реагування
Компилятор є важливою складовою сучасних комп'ютерних систем, його роль полягає в перетворенні вихідного коду програмного забезпечення високого рівня на інструкційний код, що може виконуватись комп'ютером. У порівнянні з кодом додатків, безпека самого компілятора часто може бути проігнорована. Проте, вразливості компілятора в деяких випадках можуть призвести до серйозних ризиків для безпеки.
Основна функція компілятора Solidity полягає в перетворенні коду смарт-контракту в команди Ethereum Virtual Machine (EVM). На відміну від вразливостей самого EVM, вразливості компілятора Solidity в основному впливають на розробників смарт-контрактів і не загрожують безпеці мережі Ethereum безпосередньо.
Вразливості компілятора можуть призвести до того, що згенерований EVM код не відповідатиме очікуванням розробника. Оскільки смарт-контракти зазвичай пов'язані з криптовалютними активами, будь-які помилки, викликані компілятором, можуть призвести до втрати активів користувачів. Лише через аудит вихідного коду контракту важко виявити такі проблеми, необхідно поєднувати аналіз з конкретними версіями компілятора та кодовими патернами.
Приклад вразливостей компілятора Solidity
SOL-2016-9 HighOrderByteCleanStorage
Ця вразливість існує в ранніх версіях компілятора Solidity (>=0.1.6 <0.4.4). У деяких випадках змінні storage можуть бути ненавмисно змінені, що призводить до невідповідності між значеннями, які повертаються з функцій, та очікуваними. Ця невідповідність може мати серйозні наслідки, коли йдеться про перевірку доступу або облік активів.
Причиною виникнення вразливості є те, що компілятор не очистив правильно старші біти даних при обробці типів даних менше 32 байтів, що призвело до неправильного запису старших бітів у сусідні змінні під час переповнення цілого числа.
SOL-2022-4 InlineAssemblyMemoryПобічні ефекти
Ця вразливість впливає на компілятори версій >=0.8.13 <0.8.15. Проблема виникає через неправильну обробку пам'яті під час оптимізації компілятора. У деяких випадках компілятор неправильно видаляє, здавалося б, зайві інструкції запису пам'яті, що призводить до ненормальних значень, які повертаються функцією.
Цей вразливість існує в компіляторах версій >= 0.5.8 < 0.8.16. Під час виконання операції abi.encode над масивом типу calldata компілятор помилково очищав певні дані, що призводило до зміни сусідніх даних і в результаті до несумісності між закодованими та декодованими даними.
Слід зазначити, що під час зовнішнього виклику та випуску події відбувається неявне виконання abi.encode, тому вплив цього вразливості може бути ширшим, ніж очікувалося.
Рекомендації щодо безпеки
Щодо вразливості компілятора Solidity, команда з безпеки блокчейну Cobo пропонує такі рекомендації:
Для розробників:
Використовуйте новішу версію компілятора 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). У деяких випадках змінні storage можуть бути ненавмисно змінені, що призводить до невідповідності між значеннями, які повертаються з функцій, та очікуваними. Ця невідповідність може мати серйозні наслідки, коли йдеться про перевірку доступу або облік активів.
Причиною виникнення вразливості є те, що компілятор не очистив правильно старші біти даних при обробці типів даних менше 32 байтів, що призвело до неправильного запису старших бітів у сусідні змінні під час переповнення цілого числа.
SOL-2022-4 InlineAssemblyMemoryПобічні ефекти
Ця вразливість впливає на компілятори версій >=0.8.13 <0.8.15. Проблема виникає через неправильну обробку пам'яті під час оптимізації компілятора. У деяких випадках компілятор неправильно видаляє, здавалося б, зайві інструкції запису пам'яті, що призводить до ненормальних значень, які повертаються функцією.
SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup
Цей вразливість існує в компіляторах версій >= 0.5.8 < 0.8.16. Під час виконання операції abi.encode над масивом типу calldata компілятор помилково очищав певні дані, що призводило до зміни сусідніх даних і в результаті до несумісності між закодованими та декодованими даними.
Слід зазначити, що під час зовнішнього виклику та випуску події відбувається неявне виконання abi.encode, тому вплив цього вразливості може бути ширшим, ніж очікувалося.
Рекомендації щодо безпеки
Щодо вразливості компілятора Solidity, команда з безпеки блокчейну Cobo пропонує такі рекомендації:
Для розробників:
Для служби безпеки:
Корисні ресурси:
Отже, розробники та фахівці з безпеки повинні звернути увагу на ризики, які можуть виникнути внаслідок вразливостей компілятора Solidity, та вжити відповідних заходів для зменшення загроз безпеці. Також слід об'єктивно оцінити конкретний вплив, щоб уникнути надмірної паніки.