Белый дом хочет программирования, безопасного для памяти, но что это такое?

3
компьютеры и технологии 22.webp.webp

Последнее обновление 08.03.2024 — Иван Катанаев

Правительственное агентство США постановило, что программистам следует отдавать предпочтение языкам с безопасной памятью, таким как Rust и Java. Но чем они лучше и имеет ли это значение?

Что говорит Белый дом?

В заявлении от 26 февраля Управление Национального кибер-директора Белого дома (ONCD) призвало разработчиков программного обеспечения использовать языки программирования, безопасные для памяти, такие как Rust.

В ONCD заявили:

Мы, как нация, имеем возможность – и ответственность – уменьшить поверхность атаки в киберпространстве и предотвратить попадание целых классов ошибок безопасности в цифровую экосистему, но это означает, что нам необходимо решить сложную проблему перехода на безопасные для памяти языки программирования. .

Почему это важно?

ONCD, созданный в 2021 году, подчиняется непосредственно президенту и консультирует его по вопросам кибербезопасности и связанным с ней вопросам. Политика США, вероятно, окажет волновое воздействие на весь мир технологий.

По теме:  Как заблокировать всплывающие окна согласия на использование файлов cookie в вашем браузере

Многие из самых серьезных уязвимостей безопасности имели своей основной причиной проблемы с безопасностью памяти. Старые языки нижнего уровня дают программистам много возможностей, но это увеличивает риск появления ошибок в коде, вызывающих серьезные последствия.

Тем не менее, использование языков, безопасных для памяти, таких как 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 допускает:

Стоимость при получении[3] — это действительный адрес памяти, как и любой другой, он просто не принадлежит массиву. Там может храниться любое значение, а последствия доступа к нему или записи в него могут варьироваться от сбоя программы до катастрофического инцидента безопасности. Многие хакеры на протяжении всей истории использовали такие ошибки.

Как выглядит код, безопасный для памяти?

В языке, безопасном для памяти, таком как Rust, такой проблемы просто не существует. Вот та же программа на Rust:

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

Хотя этот код синтаксически корректен, Rust не сможет его скомпилировать:

Компилятор объясняет проблему и отказывается создавать исполняемый файл. Rust просто не позволит вам запустить этот код.

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

Стоит ли переключать языки?

У каждого языка программирования есть своя цель, поэтому вам следует с осторожностью относиться к советам и категорически избегать их, даже если они исходят от президента. Хотя вы можете выбрать специализацию на определенном языке, всегда полезно изучить его разные варианты, чтобы расширить свои возможности.

Безопасность памяти — это особенность многих современных языков, поэтому вы могли бы быть знакомы хотя бы с одним. C имеет свое применение, но есть более безопасные варианты, которые вызовут меньше неудач. В частности, если вы ищете эффективный язык с хорошей системой безопасности, Rust просто необходим.