Американски правителствени агенции планират да прехвърлят своя софтуер, написан на „опасните” програмни езици C и C++, към Rust, който се счита за сигурен. За целта ведомствата възнамеряват да използват големи езикови модели (LLM).
Агенцията за напреднали проекти в областта на отбраната (DARPA) стартира проект за пренасяне на наследен и несигурен код, написан на езика за програмиране C, към безопасен за паметта Rust. Това съобщи ведомството на официалния си сайт.
Проектът TRACTOR
Като част от програмата TRACTOR (Translating All C TO Rust), DARPA планира създаване на инструменти за автоматизиране на процеса на превод на C/C++ код в Rust код. Авторите на инициативата се надяват да постигнат „високо ниво на автоматизация в превода на наследен C код в Rust, като същевременно поддържат качеството и стила, присъщи на висококвалифицираните разработчици на Rust и в крайна сметка премахнат цял клас уязвимости в сигурността на управлението на паметта, присъстващи в C програмите”.
Амбициозността на задачата напълно съответства на мащаба на проблема, който трябва да бъде решен, отбелязва Military Embedded Systems, цитирайки представители на DARPA. Езикът за програмиране C е разработен от служителя на Bell Labs Денис Ричи в началото на 60-те и 70-те години на миналия век. По време на своето съществуване C придоби огромна популярност и се използва и до днес за широк кръг от задачи. Програми, написани на C, управляват космически кораби, персонални компютри, сървъри, смартфони и др.
По-конкретно, DARPA, по собствено признание на организацията, използва системи, създадени с помощта на C и подобни езици, които работят от дълго време и чиято сигурност е критична за Съединените щати.
„Целта на изследването [TRACTOR] е драстично да подобри автоматизирания превод от C към Rust, особено за най-подходящите програмни конструкции”, казва Дан Уолах, програмен мениджър за проекта в DARPA.
Агенцията, основана през 1958 г., е сред създателите на ARPANET (Advanced Research Projects Agency Network) – компютърна мрежа, стартирана през 1969 г., която служи като прототип на съвременния интернет.
DARPA очаква от потенциалните участници в програмата идеи, които включват съвместно използване на методи за анализ на софтуера (включително статични и динамични) и големи езикови модели (LLM). Агенцията ще организира състезания, по време на които ще бъдат тествани възможностите на решения, базирани на LLM.
Големите езикови модели вече са намерили приложение в разработката на софтуер. На пазара има много комерсиални инструменти – базирани на LLM асистенти за програмисти, като GitHub Copilot на Microsoft и Gemini Code Assist на Google. Чатботове с общо предназначение като ChatGPT на OpenAI също могат да генерират код при поискване на естествен език.
Къде се корени проблемът на C
Безопасната разработка на C е трудоемък процес, който изисква висококвалифицирани програмисти, специално внимание и отговорност. Гъвкавостта, предлагана от езика и библиотеките, предназначени за него, позволяват създаване на наистина високопроизводителни и универсални програми, но също така представлява известен риск от допускане на неочаквани грешки, водещи до опасни уязвимости в крайния продукт.
Като един от основните проблеми на C често се цитира трудното управление на паметта. Задачата за разпределяне на нови области и освобождаване на вече неизползвана памет пада върху програмиста, докато по-модерните езици имат вградени средства за безопасно автоматизиране на тези рутинни процедури.
Например, езикът Java, широко използван в разработката на бизнес приложения, има така наречената “система за събиране на боклук”, която самостоятелно идентифицира ненужни обекти и ги премахва от паметта. В езика Rust, който отдавна е предпочитан от хакерите и на който DARPA очевидно залага, сигурността на паметта е гарантирана чрез механизъм за „собственост”.
Грешките, допуснати от програмистите на C при работа с паметта, могат да доведат до множество проблеми и потенциални уязвимости, идентифицирането на които е изключително трудна задача дори при използване на специализирани инструменти за анализ на код. Сред често срещаните грешки от този вид, например, е препълването на буфера – грешка, която възниква, когато се опитате да поставите част от данните в паметта, надвишавайки размера на отделеното пространство.
„Управлявайки препълването на буфера, нападателят може да извърши атака за отказ на услуга (DoS) или да изпълни произволен код на устройството. В този случай злонамереният скрипт се стартира от името и с правата на програмата, чието адресно пространство е било атакувано”, обяснява проблема компанията за сигурност Kaspersky Lab.
Такива уязвимости могат да се използват за хакване, дезактивиране на компютърна инфраструктура, разрушаване и кражба на данни и инсталиране на зловреден софтуер.
Надежда за Rust
Rust е един от най-младите езици за програмиране. Историята му започва в общността на Mozilla през 2006 г., но версия 1.0 се появява едва през 2015 г. За сравнение, C++ излиза на сцената десетилетия по-рано – през 1983 г. Сега той е на 41 години, докато Rust е още в “тийнейджърска възраст” – само на 18 години.
„Rust принуждава програмиста да прави всичко както трябва”, обяснява Дан Уолах. „Може да изглежда, че всички тези правила, наложени от Rust, сериозно ограничават възможностите, но когато свикнеш с тях, те дават свобода. Те са като парапети: след като осъзнаеш, че са там, за да те защитят, ти си по-свободен да се съсредоточиш върху по-важни неща”.
Най-големите ИТ компании в света проявяват интерес към Rust като безопасен език за програмиране. По-специално, Microsoft пренаписва отделни системни компоненти на Windows и сървърния код на платформата Microsoft 365 на този език. Разработчиците в Google също пишат код на Rust и демонстрират по-висока производителност, в сравнение с екипите, използващи C++.
В началото на 2024 г. Службата на националния кибердиректор (ONCD), агенция на правителството на САЩ, обяви, че е необходима фундаментална промяна на начина, по който се пише софтуерът. Целта е да се намали броят на грешките, които позволяват на нападателите да злоупотребяват с начина, по който софтуерът управлява паметта на компютъра.