Агентство з кібербезпеки та безпеки інфраструктури США (CISA) опублікувало дослідження 172 ключових проєктів із відкритим вихідним кодом і їхню чутливість до недоліків пам’яті.
Як зазначає BleepingComputer, звіт є продовженням «Дорожніх карт безпеки пам’яті», опублікованих у грудні 2023 року, і спрямований на підвищення обізнаності про важливість коду, безпечного для пам’яті.
Безпека пам’яті
Мови, безпечні для пам’яті, – це мови програмування, призначені для запобігання поширеним помилкам, пов’язаним із пам’яттю. Наприклад, переповненню буфера, використанню після звільнення та іншим типам пошкодження пам’яті.
Вони досягають цього шляхом автоматичного керування пам’яттю замість того, щоб покладатися на програміста для реалізації механізмів безпечного розподілу і звільнення пам’яті.
Сучасним прикладом безпечної мовної системи є засіб перевірки запозичень Rust, який усуває конкуренцію даних. Інші мови, як-от Golang, Java, C# і Python, керують пам’яттю через збирання сміття, автоматично відновлюючи звільнену пам’ять.
Мови, небезпечні для пам’яті, – це мови, які не забезпечують вбудованих механізмів керування пам’яттю, що обтяжує розробника цією відповідальністю і збільшує ймовірність помилок. Прикладами таких випадків є C, C++, Objective-C, Assembly, Cython і D.
Широко використовуваний відкритий код небезпечний
У звіті представлено дослідження 172 широко розгорнутих проєктів із відкритим вихідним кодом. Виявлено, що більше половини з них містять код, небезпечний для пам’яті.
Основні висновки, представлені у звіті, підсумовуються таким чином:
- 52% проаналізованих критичних проєктів із відкритим вихідним кодом містять код, написаний мовами, небезпечними для пам’яті.
- 55% усіх рядків коду (LoC) у цих проєктах написані мовами, небезпечними для пам’яті.
- Найбільші проєкти непропорційно написані на небезпечних для пам’яті мовах.
- З 10 найбільших проєктів за загальним LoC частка небезпечних для пам’яті LoC перевищує 26%.
- Середня частка небезпечних для пам’яті LoC у цих великих проєктах становить 62,5%, причому чотири проєкти перевищують 94%.
- Навіть проєкти, написані мовами, безпечними для пам’яті, часто залежать від компонентів, написаних мовами, небезпечними для пам’яті.
Деякі помітні приклади з розглянутого набору: Linux (коефіцієнт небезпечного коду 95%), Tor (коефіцієнт небезпечного коду 93%), Chromium (коефіцієнт небезпечного коду 51%), MySQL Server (коефіцієнт небезпечного коду 84%), glibc (коефіцієнт 85%), Redis (співвідношення 85%), SystemD (65%) та Electron (47%).
CISA пояснює, що розробники програмного забезпечення стикаються з кількома проблемами, які часто змушують їх використовувати небезпечні для пам’яті мови. Наприклад, обмеження ресурсів і вимоги до продуктивності.
Це особливо правильно під час реалізації функцій низького рівня, таких як мережеві, криптографічні та функції операційної системи.
«Ми помітили, що багато критичних проєктів із відкритим кодом частково написані мовами, небезпечними для пам’яті. Обмежений аналіз залежностей показує, що проєкти успадковують код, написаний мовами, небезпечними для пам’яті, через залежності. Там, де обмеження продуктивності та ресурсів є критичними факторами, ми бачили й очікуємо подальшого використання небезпечних для пам’яті мов», – пояснює CISA у звіті.
Агентство також підкреслює проблему, пов’язану з тим, що розробники вимикають функції безпеки пам’яті через помилку чи навмисно, щоб відповідати певним вимогам, що призводить до ризиків навіть при використанні теоретично безпечніших будівельних блоків.
Зрештою, CISA рекомендує розробникам програмного забезпечення писати новий код на безпечних для пам’яті мовах, таких як Rust, Java та GO, і переносити наявні проєкти, особливо критичні компоненти, на ці мови.
Крім того, рекомендується дотримуватися правил безпечного кодування, ретельно керувати залежностями та перевіряти їх, а також проводити безперервне тестування, включаючи статичний аналіз, динамічний аналіз і тестування нечіткості, щоб виявити та вирішити проблеми безпеки пам’яті.
Раніше ми повідомляли, що CISA попереджає про критичну помилку підвищення привілеїв Linux.
Підписуйтеся на ProIT у Telegram, щоб не пропустити жодної публікації!