Последнее обновление 08.03.2024 — Иван Катанаев
Правительственное агентство США постановило, что программистам следует отдавать предпочтение языкам с безопасной памятью, таким как 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 допускает:
Стоимость при получении[3] — это действительный адрес памяти, как и любой другой, он просто не принадлежит массиву. Там может храниться любое значение, а последствия доступа к нему или записи в него могут варьироваться от сбоя программы до катастрофического инцидента безопасности. Многие хакеры на протяжении всей истории использовали такие ошибки.
Как выглядит код, безопасный для памяти?
В языке, безопасном для памяти, таком как Rust, такой проблемы просто не существует. Вот та же программа на Rust:
fn main() {
let arr: [u32; 5] = [0;3];
println!("{}", arr[3]);
}
Хотя этот код синтаксически корректен, Rust не сможет его скомпилировать:
Компилятор объясняет проблему и отказывается создавать исполняемый файл. Rust просто не позволит вам запустить этот код.
Помимо этого, в Rust есть множество других функций, которые помогут вам защититься. Он включает в себя такие функции, как интеллектуальные указатели для автоматического управления памятью и предотвращения разыменования нулевого указателя.
Стоит ли переключать языки?
У каждого языка программирования есть своя цель, поэтому вам следует с осторожностью относиться к советам и категорически избегать их, даже если они исходят от президента. Хотя вы можете выбрать специализацию на определенном языке, всегда полезно изучить его разные варианты, чтобы расширить свои возможности.
Безопасность памяти — это особенность многих современных языков, поэтому вы могли бы быть знакомы хотя бы с одним. C имеет свое применение, но есть более безопасные варианты, которые вызовут меньше неудач. В частности, если вы ищете эффективный язык с хорошей системой безопасности, Rust просто необходим.