По итогам внедрения поддержки разработки на Rust снизилось число уязвимостей, связанных с управлением памятью. Инженеры считают, что основное внимание нужно уделить написанию нового кода, а не переписыванию старого.
Процесс внедрения
Инженеры Google рассказали, что в репозитории Android Open Source Project с исходниками операционной системы уже написано около 1,5 млн строк кода на Rust. На этом языке программирования создан 21% новых компонентов, таких как хранилище криптографических ключей Keystore2, стек для UWB-чипов, реализация протокола DNS-over-HTTP3, фреймворк виртуализации Android Virtualization Framework, экспериментальные стеки для Bluetooth и Wi-Fi. 79% остального нового компилируемого кода написано на C/C++.
Проект внедрения разработки на Rust не предполагает перенос всей платформы на этот язык программирования. Технология используется при написании нового кода и для постепенного усиления безопасности наиболее уязвимых и жизненно важных программных компонентов. Для исправления ошибок в старом С++ коде Google применяет fuzzing-тестирование, статический анализ, механизмы выявления ошибок при работе с памятью HWAsan и техники, подобные задействованию типа MiraclePtr.
Предварительные результаты
Главный итог первого этапа перехода на Rust – снижение числа уязвимостей из-за ошибок при работе с памятью. В 2019 году доля уязвимостей, вызванных проблемами с памятью, составляла 76%, а в 2022 году этот показатель упал до 35%.
В количественном выражении число таких уязвимостей сократилось с 223 в 2019 году до 150 в 2020, 100 в 2021 и 85 в 2022. Все найденные ошибки касались работы с памятью в C/C++.
В этом году впервые проблемы с памятью перестали доминировать. Также инженеры Google отмечают снижение числа критических ошибок, которые допускают риск их удаленной эксплуатации.
Тем не менее, полностью избавиться от опасных уязвимостей, связанных с использованием памяти, пока не удалось. Разработчики заявили о зависимости между объемом нового кода, небезопасно работающего с памятью, и числом проблем (все уязвимости в коде на C/C++, в коде на Rust таких проблем пока не нашли). Инженеры компании делают вывод, что при внедрении техник безопасного программирования следует в первую очередь уделять внимание новому коду, а не заниматься переписыванием старого – основное число обнаруженных уязвимостей находится в новом коде.