Аналіз вразливостей компілятора Solidity та стратегії реагування
Компіллятор є одним з основних компонентів сучасних комп'ютерних систем, його основна функція полягає в перетворенні вихідного коду мов високого рівня на інструкційний код, який може виконувати комп'ютер.
Хоча більшість розробників та фахівців з безпеки більше зосереджуються на безпеці коду програм, безпека самого компілятора також не слід ігнорувати. Як комп'ютерна програма, компілятор також може містити вразливості безпеки, які в деяких випадках можуть призвести до серйозних ризиків безпеки. Наприклад, браузер під час компіляції та виконання коду JavaScript на фронтенді може зазнати атаки віддаленого виконання коду через вразливості в JavaScript-движку, в результаті чого зловмисник отримує контроль над браузером жертви або навіть над операційною системою.
Компіллятор Solidity не є винятком, у декількох версіях компілятора Solidity існують вразливості безпеки. Завдання компілятора Solidity полягає в перетворенні коду смарт-контракту на інструкційний код Ethereum Virtual Machine (EVM), ці інструкції зрештою будуть виконуватись у EVM.
Слід звернути увагу на те, що вразливості компілятора Solidity відрізняються від вразливостей самого EVM. Вразливості EVM стосуються проблем безпеки, що виникають під час виконання інструкцій віртуальної машини, які можуть вплинути на всю мережу Ethereum. Вразливості компілятора Solidity виникають під час перетворення коду Solidity на код EVM, не впливаючи безпосередньо на мережу Ethereum, але можуть призвести до того, що згенерований код EVM не відповідатиме очікуванням розробника.
Однією з небезпек вразливостей компілятора Solidity є те, що це може призвести до того, що згенерований код EVM не відповідатиме очікуванням розробника смарт-контрактів. Оскільки смарт-контракти на Ethereum зазвичай пов'язані з криптовалютними активами користувачів, будь-яка помилка, викликана компілятором, може призвести до втрати активів користувачів, що має серйозні наслідки.
Розробники та аудитори контрактів часто більше зосереджуються на реалізації логіки коду контракту та питаннях безпеки на рівні Solidity, а не звертають уваги на вразливості компілятора. Лише через аудит вихідного коду контракту дуже важко виявити вразливості компілятора, необхідно проводити аналіз у поєднанні з конкретною версією компілятора та конкретними паттернами коду.
Ось кілька реальних прикладів вразливостей компілятора Solidity:
SOL-2016-9 Високий порядок очищення байтового сховища
Ця уразливість існує в ранніх версіях компілятора Solidity (>=0.1.6 <0.4.4). У деяких випадках компілятор не очищав старші біти належним чином, що призводило до запису старшого біта 1 у сховищі після переповнення цілого числа, що перекривало значення сусідніх змінних. Ця поведінка, що не відповідає очікуванням, може призвести до серйозних наслідків у випадках, пов'язаних з перевіркою доступу або обліком активів.
SOL-2022-4 InlineAssemblyMemoryПобічні ефекти
Вразливість існує у компіляторах версій від 0.8.13 до 0.8.15. Через проблеми з оптимізаційною стратегією компілятора в деяких випадках можуть помилково видалятися інструкції запису в пам'ять, що призводить до невідповідності значення, що повертається функцією, очікуваному. Цей баг, пов'язаний з оптимізацією, важко виявити простим переглядом коду.
Ця уразливість впливає на компілятори версій від 0.5.8 до 0.8.16. Під час виконання операції abi.encode над масивом типу calldata компілятор неправильно очищав певні дані, що призвело до зміни сусідніх даних і викликало несумісність даних після кодування та декодування. Ця проблема також може виникнути під час зовнішнього виклику та події emit, оскільки ці операції імпліцитно виконують abi.encode.
На основі аналізу вразливостей компілятора Solidity, надаються наступні рекомендації щодо безпеки:
Для розробників:
Використовуйте новішу версію компілятора Solidity, відомі проблеми безпеки зазвичай менш поширені
Уникайте використання вбудованого асемблера, складного кодування та декодування ABI тощо; обережно ставтеся до нових функцій та експериментальних можливостей.
Для співробітників безпеки:
Під час аудиту слід враховувати потенційні ризики безпеки, які можуть бути внесені компілятором
У процесі SDL настійно рекомендується оновити версію компілятора, розгляньте можливість впровадження автоматичної перевірки версій у CI/CD.
Оцінити фактичний вплив вразливостей компілятора залежно від конкретних умов проєкту, щоб уникнути надмірної тривоги.
Декілька корисних ресурсів:
Офіційне попередження про безпеку від Solidity
Регулярно оновлюваний список помилок у репозиторії Solidity
Список помилок компіляторів різних версій, може бути використаний для автоматичної перевірки
Повідомлення про вразливість компілятора на сторінці коду контракту Etherscan
Отже, вразливості компілятора Solidity, хоча і не є поширеними, можуть призвести до серйозних наслідків. Розробники та фахівці з безпеки повинні бути насторожі та вжити відповідних заходів для зниження ризиків.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
20 лайків
Нагородити
20
5
Поділіться
Прокоментувати
0/400
AltcoinAnalyst
· 07-21 10:23
Будьте обережні, це стара проблема версії 0.8.x
Переглянути оригіналвідповісти на0
MemecoinResearcher
· 07-21 10:12
rekt, що чекає на те, щоб статися, на основі мого аналізу (p<0.01)
Переглянути оригіналвідповісти на0
just_another_wallet
· 07-21 10:12
Молоді розробники, швидше дивіться!
Переглянути оригіналвідповісти на0
FarmHopper
· 07-21 10:11
Ого, цей баг виглядає страшно!
Переглянути оригіналвідповісти на0
YieldWhisperer
· 07-21 10:10
бачив цей самий шаблон експлуатації компілятора з 2021 року... розробники ніколи не навчаються, смх
Аналіз вразливостей компілятора Solidity: небезпеки безпеки та способи реагування
Аналіз вразливостей компілятора Solidity та стратегії реагування
Компіллятор є одним з основних компонентів сучасних комп'ютерних систем, його основна функція полягає в перетворенні вихідного коду мов високого рівня на інструкційний код, який може виконувати комп'ютер.
Хоча більшість розробників та фахівців з безпеки більше зосереджуються на безпеці коду програм, безпека самого компілятора також не слід ігнорувати. Як комп'ютерна програма, компілятор також може містити вразливості безпеки, які в деяких випадках можуть призвести до серйозних ризиків безпеки. Наприклад, браузер під час компіляції та виконання коду JavaScript на фронтенді може зазнати атаки віддаленого виконання коду через вразливості в JavaScript-движку, в результаті чого зловмисник отримує контроль над браузером жертви або навіть над операційною системою.
Компіллятор Solidity не є винятком, у декількох версіях компілятора Solidity існують вразливості безпеки. Завдання компілятора Solidity полягає в перетворенні коду смарт-контракту на інструкційний код Ethereum Virtual Machine (EVM), ці інструкції зрештою будуть виконуватись у EVM.
Слід звернути увагу на те, що вразливості компілятора Solidity відрізняються від вразливостей самого EVM. Вразливості EVM стосуються проблем безпеки, що виникають під час виконання інструкцій віртуальної машини, які можуть вплинути на всю мережу Ethereum. Вразливості компілятора Solidity виникають під час перетворення коду Solidity на код EVM, не впливаючи безпосередньо на мережу Ethereum, але можуть призвести до того, що згенерований код EVM не відповідатиме очікуванням розробника.
Однією з небезпек вразливостей компілятора Solidity є те, що це може призвести до того, що згенерований код EVM не відповідатиме очікуванням розробника смарт-контрактів. Оскільки смарт-контракти на Ethereum зазвичай пов'язані з криптовалютними активами користувачів, будь-яка помилка, викликана компілятором, може призвести до втрати активів користувачів, що має серйозні наслідки.
Розробники та аудитори контрактів часто більше зосереджуються на реалізації логіки коду контракту та питаннях безпеки на рівні Solidity, а не звертають уваги на вразливості компілятора. Лише через аудит вихідного коду контракту дуже важко виявити вразливості компілятора, необхідно проводити аналіз у поєднанні з конкретною версією компілятора та конкретними паттернами коду.
Ось кілька реальних прикладів вразливостей компілятора Solidity:
Ця уразливість існує в ранніх версіях компілятора Solidity (>=0.1.6 <0.4.4). У деяких випадках компілятор не очищав старші біти належним чином, що призводило до запису старшого біта 1 у сховищі після переповнення цілого числа, що перекривало значення сусідніх змінних. Ця поведінка, що не відповідає очікуванням, може призвести до серйозних наслідків у випадках, пов'язаних з перевіркою доступу або обліком активів.
Вразливість існує у компіляторах версій від 0.8.13 до 0.8.15. Через проблеми з оптимізаційною стратегією компілятора в деяких випадках можуть помилково видалятися інструкції запису в пам'ять, що призводить до невідповідності значення, що повертається функцією, очікуваному. Цей баг, пов'язаний з оптимізацією, важко виявити простим переглядом коду.
Ця уразливість впливає на компілятори версій від 0.5.8 до 0.8.16. Під час виконання операції abi.encode над масивом типу calldata компілятор неправильно очищав певні дані, що призвело до зміни сусідніх даних і викликало несумісність даних після кодування та декодування. Ця проблема також може виникнути під час зовнішнього виклику та події emit, оскільки ці операції імпліцитно виконують abi.encode.
На основі аналізу вразливостей компілятора Solidity, надаються наступні рекомендації щодо безпеки:
Для розробників:
Для співробітників безпеки:
Декілька корисних ресурсів:
Отже, вразливості компілятора Solidity, хоча і не є поширеними, можуть призвести до серйозних наслідків. Розробники та фахівці з безпеки повинні бути насторожі та вжити відповідних заходів для зниження ризиків.