Американские госструктуры перевозят свой софт с «опасных» C и C++ на Rust
DARPA хочет распрощаться с кодом на C
Управление перспективных исследовательских проектов Министерства обороны США (DARPA) запустило проект по переносу устаревшего и небезопасного кода, написанного на языке программирования C, на Rust, обеспечивающий безопасную работу с памятью. Об этом ведомство сообщило на своем официальном сайте.
В рамках программы TRACTOR (Translating All C TO Rust) планируется создать инструменты для автоматизации процесса трансляции кода С/С++ на Rust. Авторы инициативы рассчитывают добиться «высокого уровня автоматизации перевода устаревшего C-кода на Rust при сохранении качества и стиля, присущих высококвалифицированным Rust-разработчикам, в итоге искоренив целый класс уязвимостей, связанных с безопасностью управления памятью, присутствующих в программах на C».
Как отмечает издание Military Embedded Systems, цитируя представителей DARPA, амбициозность поставленной задачи полностью соответствует масштабам проблемы, которую необходимо решить. Язык программирования C, разработанный сотрудником Bell Labs Деннисом Ритчи (Dennis Ritchie) на стыке 60-х и 70-х гг. XX века, за время своего существования приобрел огромную популярность и по сей день применяется при решении самого широкого спектра задач. Программы, написанные на C, управляют космическими аппаратами, персональными компьютерами, серверами, смартфонами и пр.
Конкретно DARPA, по собственному признанию представителей организации, располагает давно находящимися в эксплуатации системами, созданными с использованием C и подобных ему языков, безопасность которых критична для США.
«Задача исследования [TRACTOR] состоит в том, чтобы кардинально улучшить автоматизированный перевод с C на Rust, особенно для наиболее релевантных программных конструкций», – говорит Дэн Уоллах (Dan Wallach), руководитель программы TRACTOR в DARPA.
DARPA, учрежденное в 1958 г., в частности, является создателем ARPANET (Advanced Research Projects Agency Network) – компьютерной сети, запущенной в 1969 г. и послужившей прототипом современного интернета.
Комбинация инструментов ИИ и анализа кода
В DARPA ожидают от потенциальных участников программы идей, включающих совместное применение методов анализа ПО (в том числе, статического и динамического) и больших языковых моделей (Large Language Model; LLM). Ведомство выступит организатором конкурсов, в ходе которых будут испытаны возможности решений, основанных на LLM.
Большие языковые модели уже нашли применение в разработке ПО. На рынке представлено множество коммерческих инструментов – помощников программиста на базе LLM, таких как GitHub Copilot (принадлежит Microsoft), Gemini Code Assist (Google). Также с генерацией кода по запросу на естественном языке справляются и чат-боты общего назначения вроде ChatGPT (OpenAI).
Безопасное управление памятью
Безопасная разработка на С – трудоемкий процесс, требующий от вовлеченных в него специалистов высокой квалификации, особой внимательности и ответственности. Гибкость, которую предлагает язык и предназначенные для него библиотеки, позволяет создавать по-настоящему высокопроизводительные и универсальные программы, но она же представляет и определенную угрозу непредвиденных ошибок, ведущих к возникновению опасных уязвимостей в конечном продукте.
Одной из главных проблем C часто называют сложности в управлении памятью. Задача по выделению новых участков и освобождению более не используемой памяти здесь возлагается на программиста, тогда как более современные языки имеют встроенные средства безопасной автоматизации этих рутинных процедур. К примеру, широко применяемый в разработке бизнес-приложений язык Java располагает так называемой системой сборки мусора, которая самостоятельно выявляет ставшие ненужными объекты и удаляет их из памяти. В Rust, который давно облюбовали хакеры и на который, по всей видимости, делает ставку DARPA, безопасная работа с памятью гарантируется за счет механизма «владения».
Оплошности, допускаемые программистами на C при работе с памятью, могут приводить к возникновению массы ошибок и потенциальных уязвимостей, выявление которых является крайне непростой задачей даже при использовании специализированных инструментов анализа кода. Среди распространенных ошибок такого рода, к примеру, – ошибка переполнения буфера, которая возникает при попытке разместить в памяти фрагмент данных, превышающий размер выделенного под него пространства.
«Управляя переполнением буфера, злоумышленник может осуществить атаку типа "отказ в обслуживании" (DoS) или выполнить на устройстве произвольный код. В последнем случае вредоносный скрипт запускается от имени и с правами программы, на чье адресное пространство совершена атака, – объясняется в соответствующей статье энциклопедии «Лаборатории Касперского».
Такие уязвимости можно использовать, к примеру, для взлома, вывода из строя вычислительной инфраструктуры, повреждения и хищения данных, установки вредоносного ПО.
Надежда на Rust
Rust – это один из самых молодых языков программирования. Его история началась в сообществе Mozilla в 2006 г. а до версии 1.0 он дорос лишь к 2015 г. Для сравнения, С++ появился на десятки лет раньше – в 1983 г. На момент выхода материала ему исполнился 41 год против 18 лет у Rust.
«Rust заставляет программиста все делать правильно, – поясняет Уоллах. – Может показаться, что все эти правила, навязываемые им [Rust], серьезно ограничивают в возможностях, но когда к ним привыкаешь, они дают свободу. Они, как ограждения: как только вы понимаете, что они существуют для вашей защиты, вы становитесь свободнее и можете сосредоточиться на более важных вещах».
Интерес к Rust как типобезопасному языку проявляют крупнейшие ИТ-компании мира. В частности, Microsoft переписывает отдельные системные компоненты Windows и серверный код платформы Microsoft 365 на этом ЯП. Код на Rust пишут и разработчики в Google, при этом демонстрируя более высокую производительность труда в сравнении с командами, применяющими C++.
В начале 2024 г. Офис национального директора по кибербезопасности (Office of the National Cyber Director; ONCD), агентства при правительстве США, заявил о необходимости кардинально изменить подход к написанию ПО для уменьшения количества ошибок, которые позволяют злоумышленникам злоупотреблять тем, как софт управляет памятью компьютера