Аналіз вразливостей компілятора Solidity та стратегії реагування
Компіллятор є однією з основних компонентів сучасних комп'ютерних систем, його основна функція полягає в перетворенні вихідного коду мов програмування високого рівня в інструкційний код, що може виконуватись на нижчому рівні. Незважаючи на те, що розробники та спеціалісти з безпеки зазвичай більше зосереджуються на безпеці самого коду програм, компілятор, як програма, також може мати вразливості, які в деяких випадках можуть призвести до серйозних ризиків безпеки.
Наприклад, браузер під час компіляції та виконання JavaScript-коду може зіткнутися з уразливістю JavaScript-движка, що призводить до віддаленого виконання коду, дозволяючи зловмисникам контролювати браузер жертви або навіть операційну систему. Аналогічно, помилка компілятора C++ також може призвести до серйозних наслідків, таких як віддалене виконання коду. Компилятор Solidity не є винятком, у кількох версіях є вразливості безпеки.
Функція компілятора Solidity полягає в перетворенні коду смарт-контракту на інструкційний код, який може виконуватися в Ethereum Virtual Machine (EVM). Варто зазначити, що вразливості компілятора Solidity відрізняються від вразливостей самої EVM. Вразливості EVM можуть вплинути на безпеку всієї мережі Ethereum, тоді як вразливості компілятора Solidity в основному впливають на розробників смарт-контрактів і не загрожують безпосередньо самій мережі Ethereum.
Основною небезпекою вразливостей компілятора Solidity є те, що це може призвести до того, що згенерований код EVM не відповідатиме очікуванням розробника. Оскільки смарт-контракти в Ethereum зазвичай пов'язані з криптовалютними активами користувачів, будь-яка помилка, викликана компілятором, може призвести до втрати активів користувачів, що має дуже серйозні наслідки.
Ось кілька реальних прикладів вразливостей компілятора Solidity:
SOL-2016-9 HighOrderByteCleanStorage
Ця уразливість існує в раніших версіях компілятора Solidity (>=0.1.6 <0.4.4). У деяких випадках змінні зберігання можуть бути випадково змінені, що призводить до невідповідності значення, яке повертає функція, очікуваному. Ця невідповідність може викликати серйозні проблеми в критичних операціях, таких як перевірка прав доступу, облік активів тощо.
SOL-2022-4 InlineAssemblyMemoryПобічні ефекти
Ця вразливість впливає на компілятори версій >=0.8.13 <0.8.15. Через помилку в процесі оптимізації компілятора, операції запису в пам'ять можуть бути неправильно видалені, що призводить до некоректних значень повернення функцій.
Ця вразливість існує в компіляторах версій >= 0.5.8 < 0.8.16. Під час обробки операції abi.encode для масивів типу calldata може неправильно змінюватись сусідні дані, що призводить до невідповідності між закодованими та декодованими даними.
Щодо вразливостей компілятора Solidity, надайте такі рекомендації з безпеки:
Для розробників:
Використовуйте новішу версію компілятора Solidity, щоб зменшити відомі проблеми з безпекою.
Уникайте використання вбудованих асемблерів, складного кодування та декодування ABI тощо, обережно використовуйте нові функції та експериментальні можливості.
Для безпеки особи:
Під час проведення безпекового аудиту слід враховувати ризики, які можуть виникнути через компілятор Solidity.
У процесі розробки SDL, спонукайте команду розробників вчасно оновлювати версію компілятора.
Можна ввести автоматичну перевірку версії компілятора в процес CI/CD.
Оцінити реальний вплив вразливостей компілятора на безпеку відповідно до конкретних умов проекту, щоб уникнути надмірних занепокоєнь.
Декілька корисних ресурсів:
Офіційне попередження про безпеку від Solidity
Регулярно оновлюваний список помилок у репозиторії Solidity на GitHub
Список помилок компілятора для всіх версій, може бути використаний для автоматизованої перевірки
Сторінка коду контракту на Etherscan повідомить про наявність вразливостей у поточній версії компілятора.
В цілому, вразливості компілятора Solidity хоча й не є поширеними, але можуть призвести до серйозних наслідків. Розробники та фахівці з безпеки повинні бути пильними та вжити відповідних заходів для зменшення пов'язаних ризиків.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
Аналіз ризиків вразливостей компілятора Solidity та стратегій реагування
Аналіз вразливостей компілятора Solidity та стратегії реагування
Компіллятор є однією з основних компонентів сучасних комп'ютерних систем, його основна функція полягає в перетворенні вихідного коду мов програмування високого рівня в інструкційний код, що може виконуватись на нижчому рівні. Незважаючи на те, що розробники та спеціалісти з безпеки зазвичай більше зосереджуються на безпеці самого коду програм, компілятор, як програма, також може мати вразливості, які в деяких випадках можуть призвести до серйозних ризиків безпеки.
Наприклад, браузер під час компіляції та виконання JavaScript-коду може зіткнутися з уразливістю JavaScript-движка, що призводить до віддаленого виконання коду, дозволяючи зловмисникам контролювати браузер жертви або навіть операційну систему. Аналогічно, помилка компілятора C++ також може призвести до серйозних наслідків, таких як віддалене виконання коду. Компилятор Solidity не є винятком, у кількох версіях є вразливості безпеки.
Функція компілятора Solidity полягає в перетворенні коду смарт-контракту на інструкційний код, який може виконуватися в Ethereum Virtual Machine (EVM). Варто зазначити, що вразливості компілятора Solidity відрізняються від вразливостей самої EVM. Вразливості EVM можуть вплинути на безпеку всієї мережі Ethereum, тоді як вразливості компілятора Solidity в основному впливають на розробників смарт-контрактів і не загрожують безпосередньо самій мережі 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, надайте такі рекомендації з безпеки:
Для розробників:
Для безпеки особи:
Декілька корисних ресурсів:
В цілому, вразливості компілятора Solidity хоча й не є поширеними, але можуть призвести до серйозних наслідків. Розробники та фахівці з безпеки повинні бути пильними та вжити відповідних заходів для зменшення пов'язаних ризиків.