Инновационная разработка кардинально меняет подход к безопасному программированию.
Учёные из французского научно-исследовательского центра Inria совместно с компанией Microsoft разработали способ автоматизированного преобразования кода на языке C в безопасный код на Rust, стремясь удовлетворить растущий спрос на безопасность памяти.
Язык программирования C, созданный в 1970-х годах, стал основой множества критически важных систем, приложений и библиотек, включая ядро Linux. Однако C, как и его логичное продолжение в лице C++, не гарантирует безопасность памяти. Его ручное управление памятью, хоть и обеспечивает гибкость и эффективность, но подвержено ошибкам, таким как выход за пределы массива (out-of-bounds) или использование после освобождения (use-after-free).
Эти ошибки составляют значительную часть уязвимостей программного обеспечения. Например, в 2019 году они составляли 76 % уязвимостей в Android, однако благодаря использованию Rust и безопасного кода этот показатель снизился до 24 % в 2024 году.
Rust позволяет писать как безопасный, так и небезопасный код, оставляя выбор за разработчиком. В отличие от него, C и C++ требуют значительных усилий, таких как статический анализ и тестирование, чтобы приблизиться к безопасности памяти, но не предоставляют её изначально.
В последние годы наблюдается активная поддержка перехода на языки с встроенной безопасностью памяти, такие как Rust, Go, Python и Java. Несмотря на это, часть программистов продолжает искать способы использовать C и C++ безопасно, избегая перехода на Rust. Google, активно продвигая Rust, также признаёт, что C и C++ останутся в обиходе на долгие годы.
Среди попыток повысить безопасность C выделяются проекты, такие как TrapC и Fil-C. Первый разрабатывает подход к подмножеству языка, а второй, хотя и обеспечивает безопасность, снижает производительность и не поддерживает полную совместимость с двоичным интерфейсом приложений.
Исследование под названием «Компиляция C в безопасный Rust» , подготовленное учёными Аймериком Фромерцом (Inria) и Джонатаном Протценко (Microsoft), предлагает альтернативный подход. Они сосредоточились на переводе кода, формально проверенного для использования в промышленности, в безопасный Rust. Для этого создано подмножество языка C под названием Mini-C, которое избегает сложных для перевода конструкций, таких как арифметика указателей и неявная изменяемость.
Применяя Mini-C через компилятор KaRaMeL, разработчики достигают автоматического преобразования кода в безопасный Rust. Например, библиотека криптографии HACL, состоящая из 80 000 строк кода, была переведена с минимальными изменениями. А библиотека сериализаторов EverParse, содержащая 1 400 строк кода, была преобразована и вовсе без изменений. Производительность полученного Rust-кода осталась на уровне исходного C, несмотря на добавление дополнительных проверок и прочих улучшений.
Плоды работы исследователей уже используются в реальных приложениях, связанных с безопасностью. Например, Rust-версия HACL недавно была интегрирована в библиотеки Mozilla NSS и OpenSSH.
И мы тоже не спим, чтобы держать вас в курсе всех угроз