Google выделила язык программирования Rust, обеспечивающий безопасность работы с памятью, как ключевой элемент в снижении уязвимостей в рамках своей инициативы «Safe Coding».
Уязвимости доступа к памяти часто возникают при использовании языков программирования, не обеспечивающих безопасность работы с памятью. В 2019 году проблемы с безопасностью памяти составляли 76% всех уязвимостей Android.
В ответ на это многие разработчики и технологические гиганты переходят на использование языков программирования, обеспечивающих безопасность работы с памятью, что помогает создавать безопасное ПО с самого начала.
Уязвимости, медленно исчезающие
В своем блоге Google представила моделирование перехода к языкам, обеспечивающим безопасность работы с памятью, через постепенное использование такого кода в новых проектах и разработках за пятилетний период. В результате выяснилось, что несмотря на постепенное увеличение объема кода, написанного на небезопасных языках, уязвимости в безопасности памяти значительно сократились.
По данным Google, это связано с тем, что уязвимости исчезают экспоненциально. Новый код, написанный на небезопасных языках, часто содержит ошибки и уязвимости, но по мере его проверки и обновления эти уязвимости постепенно устраняются, делая код со временем безопаснее. Таким образом, основной источник уязвимостей — это новый код, и приоритетное использование безопасных языков программирования при запуске новых проектов и разработок значительно снижает количество уязвимостей.
В процессе перехода Google на использование безопасных языков программирования, число уязвимостей, связанных с памятью, значительно сократилось. В 2024 году их доля снизилась до 24%, что значительно ниже уровня 2019 года и текущей нормы в отрасли в 70%.
Однако использование безопасных языков не является универсальным решением, и Google признает, что «с учетом прошлого опыта очевидно, что нам еще предстоит найти по-настоящему масштабируемое и устойчивое решение, которое обеспечит приемлемый уровень риска».
Вначале стратегии борьбы с уязвимостями в памяти включали реактивные исправления, когда уязвимости в памяти приоритетно устранялись производителями ПО, оставляя другие проблемы незащищенными.
Второй подход заключался в проактивных мерах, когда разработчики включали в свои проекты механизмы защиты, такие как стековые канарейки и целостность потока управления, что сказывалось на скорости выполнения, времени автономной работы, задержках и использовании памяти. Разработчики при этом не успевали справляться с новыми способами эксплуатации уязвимостей, придуманными атакующими.
Третья стратегия предполагала проактивное обнаружение уязвимостей, где основное внимание уделялось их выявлению через метод «fuzzing», когда уязвимости отслеживаются по симптомам ненадежной работы с памятью. Однако, как отмечает Google, эти инструменты неэффективны и трудоемки, а также часто не обнаруживают все уязвимости даже при многократных проверках.
Четвертая тактика Google заключалась в использовании высокоэффективной профилактики и развитии безопасной разработки. Используя языки программирования, такие как Rust, разработчики знают и понимают свойства написанного кода и могут выявлять уязвимости на их основе. Это снижает затраты на разработчиков за счет уменьшения количества уязвимостей с самого начала, включая те, которые не связаны с безопасностью памяти. Этот кумулятивный эффект также повышает производительность разработчиков.
«Концепция проста:», отмечает блог Google, «когда мы прекращаем поток новых уязвимостей, они уменьшаются экспоненциально, делая весь наш код безопаснее, повышая эффективность разработки защиты и упрощая решение задач масштабируемости, связанных с существующими стратегиями безопасности памяти, чтобы их можно было более эффективно применять в целенаправленных случаях».
Источник: TechRadar