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

Ключові висновки

  • Білий дім закликає використовувати безпечні для пам’яті мови, такі як 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]і т. д. Спроба доступу до обр[3] тому є помилкою, але такою, яку C допускає:

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

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

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

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

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

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

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

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

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

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

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