Поиск по сайту:

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


Приказ сверху: заткните утечки памяти.

Ключевые выводы

  • Белый дом призывает использовать безопасные для памяти языки, такие как 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 просто необходим.

Статьи по данной тематике: