Білий дім хоче безпечне програмування, але що це таке?

Основні тези

  • Адміністрація президента США рекомендує використання мов програмування, що є безпечними для роботи з пам’яттю, таких як Rust, для мінімізації вразливостей в програмному коді.
  • Застарілі мови нижчого рівня, наприклад, C, підвищують ризик виникнення помилок в коді, що може призвести до проблем з безпекою.
  • Мови, що забезпечують безпеку пам’яті, зокрема Rust, надають автоматичні засоби управління пам’яттю та запобігають багатьом видам помилок.

Урядова установа Сполучених Штатів висловила рекомендації щодо використання програмістами мов, які гарантують безпеку пам’яті, таких як Rust та Java. Але в чому їх перевага і чи дійсно це так важливо?

Позиція Білого дому

У офіційній заяві від 26 лютого, Національний офіс кібердиректора при Білому домі (ONCD) звернувся до розробників програмного забезпечення із закликом використовувати мови програмування, що є безпечними для роботи з пам’яттю, зокрема Rust.

ONCD заявив:

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

Чому це важливо?

ONCD, створений у 2021 році, підпорядковується безпосередньо президенту і надає йому консультації з питань кібербезпеки. Імовірно, політика США в цій сфері вплине на весь технологічний світ.

Проблеми з безпекою пам’яті є основною причиною багатьох серйозних уразливостей систем безпеки. Хоча старіші мови нижчого рівня надають програмістам значну свободу, це підвищує ризик допущення помилок у коді, що може призвести до серйозних наслідків.

Варто зазначити, що використання мов, які гарантують безпеку пам’яті, як-от Rust, Python і JavaScript, вже давно набирає популярності. Оголошення ONCD, імовірно, пов’язане з тим, що менш безпечні мови, наприклад, C, існують вже дуже давно, тому їхній застарілий код глибоко вкорінився в інфраструктуру та більшу частину програмного забезпечення, яким ми користуємося щодня.

Який вигляд має небезпечна мова?

Небезпечний код не завжди виглядає складно або загрозливо. Розглянемо приклад простої програми, написаної на C:

#include <stdio.h>

int main (void) { int arr[3] = { 0, 0, 0 }; printf("%d\n", arr[3]); return 0; }

Це типовий приклад помилки, яка може призвести до атаки переповнення буфера. Програміст забув, що індексація масивів в C (як і в багатьох інших мовах) починається з нуля. Отже, перший елемент розташований за адресою arr[0]. Спроба доступу до arr[3] є помилкою, але C її дозволяє:

Значення arr[3] представляє собою дійсну адресу в пам’яті, але вона не належить до масиву. В цій області пам’яті може знаходитися будь-яка інформація, і наслідки доступу до неї або її зміни можуть бути різними: від збою програми до серйозного інциденту безпеки. Історично склалося так, що багато хакерів користувалися подібними помилками.

Хоча компілятор C виводить попередження, він все одно створює виконуваний файл. Програміст може ігнорувати ці попередження або навіть приховувати їх за допомогою спеціальних параметрів компілятора. C дозволяє вам “вистрілити собі в ногу”, тоді як мови, як-от Rust, не дають такої можливості.

Як виглядає безпечний для пам’яті код?

У мові, яка гарантує безпеку пам’яті, наприклад, Rust, така проблема просто неможлива. Ось як виглядає та ж сама програма на Rust:

fn main() {
    let arr: [u32; 5] = [0;3];
    println!("{}", arr[3]);
}

Хоча синтаксично цей код правильний, Rust не дозволить його скомпілювати:

Компілятор чітко пояснює проблему і відмовляється генерувати виконуваний файл. Rust просто не дозволить вам запустити такий код.

Крім цього, Rust має багато інших механізмів захисту. Наприклад, він використовує розумні вказівники для автоматичного управління пам’яттю і запобігання розіменуванню нульових вказівників.

Чи варто змінювати мову?

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

Безпека пам’яті є характеристикою багатьох сучасних мов, і ви, можливо, вже знайомі хоча б з однією з них. Хоча C має свої переваги, існують безпечніші варіанти, які можуть зменшити кількість проблем. Зокрема, якщо вам потрібна ефективна мова з надійною системою безпеки, то Rust є відмінним вибором.