Найти тему
Герман Геншин

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

Оглавление

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

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

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

В заявлении ONCD говорится:

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

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

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

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

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

Небезопасный код не всегда выглядит страшным или даже сложным. Возьмем пример простой программы на языке C:

Это классический пример ошибки, которая может привести к атаке на переполнение буфера. Программист забыл, что массивы в C (и большинстве других языков) имеют нулевую индексацию, то есть первый элемент находится по адресу arr[0] , и т. д. Поэтому попытка получить доступ к arr[3] - это ошибка, но такая, которую C допустит:

-2

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

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

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

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

-3

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

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

Стоит ли мне переходить на другой язык?

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

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

Если вам понравилась эта статья, подпишитесь на меня, чтобы не пропустить еще много полезных статей!

Вы также можете прочитать меня здесь: