Аналіз вразливостей компілятора Solidity: ризики безпеки та стратегії реагування

robot
Генерація анотацій у процесі

Аналіз вразливостей компілятора Solidity та стратегії реагування

Компилятор є одним із основних компонентів сучасних комп'ютерних систем, відповідальним за перетворення мов високого рівня в нижчі виконувані команди. Хоча розробники зазвичай зосереджуються на безпеці прикладного коду, безпека самого компілятора також є важливою. Уразливості компілятора можуть в деяких випадках також призвести до серйозних ризиків безпеки, наприклад, уразливість JavaScript-движка браузера може призвести до віддаленого виконання коду.

Компилятор Solidity не є винятком, він має кілька версій з вразливостями безпеки. На відміну від вразливостей EVM, вразливості компілятора Solidity впливають лише на розробників контрактів і не загрожують безпеці мережі Ethereum безпосередньо. Але це може призвести до того, що згенерований код EVM не відповідатиме очікуванням розробника, що призведе до вразливостей у смарт-контрактах і поставить під загрозу безпеку активів користувачів.

Аналіз вразливостей компілятора Solidity та заходи реагування

Ось кілька реальних прикладів вразливостей компіляторів Solidity:

  1. SOL-2016-9 Високий порядок очищення байтів зберігання

Впливова версія: >=0.1.6 <0.4.4

Ця уразливість може призвести до випадкової зміни змінної storage. Наприклад:

солідність контракт C { uint32 a = 0x1234; uint32 b = 0; функція run() повертає (uint) { a += 1; повернути b; } }

функція run() повинна повертати 0, але насправді повертає 1. Це пов'язано з тим, що компілятор неправильно очистив старші біти під час обробки переповнення цілого числа, внаслідок чого переповнене значення записується в сусідню змінну.

  1. SOL-2022-4 InlineAssemblyMemoryПобічні ефекти

Впливова версія: >=0.8.13 <0.8.15

Ця уразливість виникає в процесі оптимізації компіляції. Наприклад:

солідність контракт C { функція f() публічна чиста повертає (uint) { збірка { mstore(0, 0x42) } uint x; збірка { x := mload(0) } повернути x; } }

ф() функція повинна повертати 0x42, але версія з вразливістю повертає 0. Це відбувається через помилку компілятора, який помилково видалив операцію запису пам'яті в першому блоці assembly.

  1. SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup

Впливова версія: >= 0.5.8 < 0.8.16

Ця уразливість стосується ABI кодування масиву calldata. Наприклад:

солідність контракт C { функція f(bytes[1] calldata a) public pure повертає (bytes memory) { return abi.encode(a); } }

ф() функція повинна повертати вхідний масив, але вразлива версія повертає порожній рядок. Це пов'язано з тим, що компілятор під час кодування неправильно очищає сусідні дані.

Аналіз вразливостей компілятора Solidity та заходи реагування

Щоб зменшити ризик вразливостей компілятора Solidity, розробники повинні:

  • Використовуйте новішу версію компілятора
  • Поліпшити юніт-тестування, підвищити покриття коду
  • Уникайте використання складних мовних характеристик, таких як інлайн асемблер, багатовимірне кодування масивів ABI тощо

Аудитори безпеки повинні:

  • У процесі аудиту враховуйте потенційні ризики компілятора
  • Рекомендується команді розробників своєчасно оновлювати версію компілятора
  • Додати автомат перевірку версії компілятора в процес CI/CD

Корисні довідкові ресурси:

  • Офіційний блог безпеки Solidity
  • Список помилок репозиторію Solidity на GitHub
  • Повідомлення про вразливість компілятора на сторінці контракту Etherscan

Аналіз вразливостей компілятора Solidity та заходи реагування

Отже, хоча вразливості компілятора і не є поширеними, їх наслідки можуть бути серйозними. Розробники та фахівці з безпеки повинні бути напоготові та вжити відповідних заходів для зниження ризиків.

Переглянути оригінал
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Нагородити
  • 5
  • Поділіться
Прокоментувати
0/400
blockBoyvip
· 7год тому
Знову бачимо вразливість у контракті, так набридло~
Переглянути оригіналвідповісти на0
GasGuzzlervip
· 07-07 09:10
Знову компілятор щось затіває
Переглянути оригіналвідповісти на0
GweiTooHighvip
· 07-07 09:05
Що за фігня? Знову виявили вразливість.
Переглянути оригіналвідповісти на0
RektRecoveryvip
· 07-07 09:00
*с sigh* ще одна передбачувана уразливість... коли ж розробники навчаться не гратися з вогнем
Переглянути оригіналвідповісти на0
GasGuzzlervip
· 07-07 08:44
Тестував півдня, але цієї проблеми немає.
Переглянути оригіналвідповісти на0
  • Закріпити