Белый дом хочет программирования, безопасного для памяти, но что это такое?
Приказ сверху: заткните утечки памяти.
Ключевые выводы
- Белый дом призывает использовать безопасные для памяти языки, такие как 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 просто необходим.