Аналіз вразливостей компілятора Solidity та стратегії реагування
Компилятор є одним із основних компонентів сучасних комп'ютерних систем, відповідальним за перетворення мов високого рівня в нижчі виконувані команди. Хоча розробники зазвичай зосереджуються на безпеці прикладного коду, безпека самого компілятора також є важливою. Уразливості компілятора можуть в деяких випадках також призвести до серйозних ризиків безпеки, наприклад, уразливість JavaScript-движка браузера може призвести до віддаленого виконання коду.
Компилятор Solidity не є винятком, він має кілька версій з вразливостями безпеки. На відміну від вразливостей EVM, вразливості компілятора Solidity впливають лише на розробників контрактів і не загрожують безпеці мережі Ethereum безпосередньо. Але це може призвести до того, що згенерований код EVM не відповідатиме очікуванням розробника, що призведе до вразливостей у смарт-контрактах і поставить під загрозу безпеку активів користувачів.
Ось кілька реальних прикладів вразливостей компіляторів Solidity:
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. Це пов'язано з тим, що компілятор неправильно очистив старші біти під час обробки переповнення цілого числа, внаслідок чого переповнене значення записується в сусідню змінну.
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.
Ця уразливість стосується ABI кодування масиву calldata. Наприклад:
солідність
контракт C {
функція f(bytes[1] calldata a) public pure повертає (bytes memory) {
return abi.encode(a);
}
}
ф() функція повинна повертати вхідний масив, але вразлива версія повертає порожній рядок. Це пов'язано з тим, що компілятор під час кодування неправильно очищає сусідні дані.
Щоб зменшити ризик вразливостей компілятора Solidity, розробники повинні:
Уникайте використання складних мовних характеристик, таких як інлайн асемблер, багатовимірне кодування масивів ABI тощо
Аудитори безпеки повинні:
У процесі аудиту враховуйте потенційні ризики компілятора
Рекомендується команді розробників своєчасно оновлювати версію компілятора
Додати автомат перевірку версії компілятора в процес CI/CD
Корисні довідкові ресурси:
Офіційний блог безпеки Solidity
Список помилок репозиторію Solidity на GitHub
Повідомлення про вразливість компілятора на сторінці контракту Etherscan
Отже, хоча вразливості компілятора і не є поширеними, їх наслідки можуть бути серйозними. Розробники та фахівці з безпеки повинні бути напоготові та вжити відповідних заходів для зниження ризиків.
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.
8 лайків
Нагородити
8
5
Поділіться
Прокоментувати
0/400
blockBoy
· 7год тому
Знову бачимо вразливість у контракті, так набридло~
Переглянути оригіналвідповісти на0
GasGuzzler
· 07-07 09:10
Знову компілятор щось затіває
Переглянути оригіналвідповісти на0
GweiTooHigh
· 07-07 09:05
Що за фігня? Знову виявили вразливість.
Переглянути оригіналвідповісти на0
RektRecovery
· 07-07 09:00
*с sigh* ще одна передбачувана уразливість... коли ж розробники навчаться не гратися з вогнем
Аналіз вразливостей компілятора Solidity: ризики безпеки та стратегії реагування
Аналіз вразливостей компілятора Solidity та стратегії реагування
Компилятор є одним із основних компонентів сучасних комп'ютерних систем, відповідальним за перетворення мов високого рівня в нижчі виконувані команди. Хоча розробники зазвичай зосереджуються на безпеці прикладного коду, безпека самого компілятора також є важливою. Уразливості компілятора можуть в деяких випадках також призвести до серйозних ризиків безпеки, наприклад, уразливість JavaScript-движка браузера може призвести до віддаленого виконання коду.
Компилятор Solidity не є винятком, він має кілька версій з вразливостями безпеки. На відміну від вразливостей EVM, вразливості компілятора Solidity впливають лише на розробників контрактів і не загрожують безпеці мережі Ethereum безпосередньо. Але це може призвести до того, що згенерований код EVM не відповідатиме очікуванням розробника, що призведе до вразливостей у смарт-контрактах і поставить під загрозу безпеку активів користувачів.
Ось кілька реальних прикладів вразливостей компіляторів Solidity:
Впливова версія: >=0.1.6 <0.4.4
Ця уразливість може призвести до випадкової зміни змінної storage. Наприклад:
солідність контракт C { uint32 a = 0x1234; uint32 b = 0; функція run() повертає (uint) { a += 1; повернути b; } }
функція run() повинна повертати 0, але насправді повертає 1. Це пов'язано з тим, що компілятор неправильно очистив старші біти під час обробки переповнення цілого числа, внаслідок чого переповнене значення записується в сусідню змінну.
Впливова версія: >=0.8.13 <0.8.15
Ця уразливість виникає в процесі оптимізації компіляції. Наприклад:
солідність контракт C { функція f() публічна чиста повертає (uint) { збірка { mstore(0, 0x42) } uint x; збірка { x := mload(0) } повернути x; } }
ф() функція повинна повертати 0x42, але версія з вразливістю повертає 0. Це відбувається через помилку компілятора, який помилково видалив операцію запису пам'яті в першому блоці assembly.
Впливова версія: >= 0.5.8 < 0.8.16
Ця уразливість стосується ABI кодування масиву calldata. Наприклад:
солідність контракт C { функція f(bytes[1] calldata a) public pure повертає (bytes memory) { return abi.encode(a); } }
ф() функція повинна повертати вхідний масив, але вразлива версія повертає порожній рядок. Це пов'язано з тим, що компілятор під час кодування неправильно очищає сусідні дані.
Щоб зменшити ризик вразливостей компілятора Solidity, розробники повинні:
Аудитори безпеки повинні:
Корисні довідкові ресурси:
Отже, хоча вразливості компілятора і не є поширеними, їх наслідки можуть бути серйозними. Розробники та фахівці з безпеки повинні бути напоготові та вжити відповідних заходів для зниження ризиків.