26 июня 2024 года специалисты агентства кибербезопасности и безопасности инфраструктуры США (CISA) опубликовали исследование с подробным анализом 172 ключевых Open Source проектов на предмет уязвимости исходного кода различных языков программирования к ошибкам памяти.
Согласно отчёту CISA:
• 52% критически популярных проектов с открытым исходным кодом содержат код, написанный на небезопасных для памяти языках;
• 55% от общего числа строк кода (LoC) в популярных и ключевых проектах написаны на небезопасных для памяти языках;
• крупнейшие проекты в непропорциональной мере написаны на небезопасных для памяти языках;
• из 10 крупнейших проектов по общему количеству строк кода, каждый имеет долю небезопасного для памяти кода выше 26%;
• медианная доля небезопасного для памяти кода в крупных проектах составляет 62,5%, причём в 4 проектах показатель превышает 94%;
• многие проекты, написанные на безопасных для памяти языках, часто зависят от компонентов, написанных на небезопасных для памяти языках или наследуют код, написанный на небезопасных для памяти языках, через зависимости;
• среди исследованных проектов: ядро Linux (коэффициент небезопасного кода 95%), Tor (93%), Chromium (51%), MySQL Server (84%), glibc (85%), Redis (85%), SystemD (65%) и Electron (47%);
• разработчики ПО сталкиваются со множеством вызовов, которые часто заставляют их использовать небезопасные для памяти языки, такие как ограничения ресурсов и требования к производительности, включая реализации в проектах низкоуровневых функций (сетевые опции, криптография и функции операционных систем);
• в части проектов обнаружены проблемы отключения функций безопасности памяти разработчиками, либо по ошибке, либо намеренно, чтобы соответствовать определённым требованиям, что создаёт риски даже при использовании теоретически более безопасных компонентов.
В выводах своего исследования CISA рекомендует разработчикам:
• использовать для создания нового кода безопасные для памяти языки, включая Rust, Java и Go;
• переводить существующие проекты, особенно их критически важные компоненты и сторонние элементы, на Rust, Java и Go;
• следовать мировым практикам безопасного кодирования;
• тщательнее управлять компонентной базой и проверять зависимости от других проектов и компонентов;
• проводить непрерывное тестирование кода, включая статический и динамический анализ;
• использовать фаззинг-тестирование для выявления и устранения проблем безопасности памяти в исходном коде проектов.
В ноябре 2022 года АНБ выпустило отчёт, в котором указало на то, что широко используемые языки программирования C и C++ дают хакерам больше возможностей для использования эксплойтов. В связи с этим АНБ рекомендует организациям переходить на безопасные языки программирования, такие как C#, Go, Java, Ruby, Rust и Swift. По мнению экспертов, это поможет предотвратить возникновение определённых типов уязвимостей, связанных с памятью.
В январе 2023 года изобретатель языка программирования C++ Бьёрн Страуструп ответил Агентству национальной безопасности (АНБ) США по поводу рекомендации ведомства отказаться от использования языков C и C++, перекладывающих управление памятью на разработчика, в пользу современных языков программирования (C#, Go, Java, Ruby, Rust и Swift), которые обеспечивают автоматическое управление памятью или выполняющие проверки безопасной работы с памятью во время компиляции кода. Страуструп призвал АНБ со своей стороны сначала серьёзно подумать о «безопасности» новых языков и только потом предлагать что-нибудь разумное по этому поводу. Учёный и разработчик считает, что упомянутые в отчёте АНБ «безопасные» языки программирования на самом деле не превосходят C++ в важных с его точки зрения применениях.
В конце февраля 2024 года Офис национального директора по кибербезопасности (ONCD) Белого дома США в рамках доклада о способах снижения количества уязвимостей в проектах и возможности в будущем улучшить надёжность ПО призвал разработчиков ПО в долгосрочной перспективе отказаться от небезопасных (в рамках работы с памятью) языках программирования С и С++ и перейти на более современные решения с высокой безопасностью памяти, например Rust, Python и Java.
Страуструп ответил на призыв Белого дома США переходить на языки с безопасностью памяти: «Я нахожу удивительным, что авторы этих государственных документов, похоже, не знают о сильных сторонах современного C++ и усилиях по обеспечению сильных гарантий безопасности. С другой стороны, они понимают, что язык программирования — это лишь одна часть набора инструментов, поэтому важно улучшать инструменты и процессы разработки». Страуструп напомнил, как он работал десятилетиями над тем, чтобы сделать язык безопаснее. Наконец, он поставил под сомнение само понимание безопасности: критики фокусируются на безопасности памяти, оставляя без внимания многие другие места, где можно проколоться.
Источник: habr.com