Инженеры из компании Google подвели первые итоги внедрения в платформу Android поддержки разработки на языке Rust. В Android 13 примерно 21% от добавленного нового компилируемого кода написано на Rust, а 79% на C/C++. В репозитории AOSP (Android Open Source Project), в котором развиваются исходные тексты платформы Android, насчитывается примерно 1.5 млн строк кода на Rust, связанного с такими новыми компонентам, как хранилище криптографических ключей Keystore2, стек для UWB-чипов (Ultra-Wideband), реализация протокола DNS-over-HTTP3, фреймворк виртуализации AVF (Android Virtualization Framework), экспериментальные стеки для Bluetooth и Wi-Fi.
В соответствии с ранее принятой стратегией снижения риска появления уязвимостей, вызванных ошибками при работе с памятью, язык Rust пока применяется в основном при разработке нового кода и для постепенного усиления безопасности наиболее незащищённых и жизненно важных программных компонентов. Общей цели перевода всей платформы на Rust не ставится и старый код остаётся на C/C++,а борьба с ошибками в нём производится через применение fuzzing-тестирования, статического анализа и применение при разработке техник, подобных задействованию типа MiraclePtr (обвязка над raw-указателями, выполняющая дополнительные проверки обращения к освобождённым областям памяти), системе распределения памяти Scudo (безопасная замена malloc/free) и механизмам выявления ошибок при работе с памятью HWAsan (Hardware-assisted AddressSanitizer), GWP-ASAN и KFENCE.
Что касается статистики по характеру уязвимостей в платформе Android, отмечается, что по мере уменьшения нового кода, небезопасно работающего с памятью, наблюдается и снижение количества уязвимостей, вызванных ошибками при работе с памятью. Например, доля вызванных проблемами с памятью уязвимостей сократилось с 76% в 2019 году до 35% в 2022 году. В абсолютных числах в 2019 году было выявлено 223 уязвимостей, связанных с работой с памятью, в 2020 – 150, в 2021 – 100, а в 2022 – 85. 2022 год стал первым годом, в котором связанные с памятью уязвимости перестали доминировать.
Так как связанные с работой с памятью уязвимости обычно являются наиболее опасными, в общей статистике также отмечается снижение числа критических проблем и проблем, которые могут быть эксплуатированы удалённо. При этом динамика выявления уязвимостей не связанных с работой с памятью, последние 4 года сохраняется примерно на одном уровне – 20 уязвимостей в месяц. Также сохраняется и доля опасных проблем среди узявимостей, вызванных ошибками при работе с памятью (но так как снижается число подобных уязвимостей, снижается и число опасных проблем).
В статистике также отслеживается корреляция между объёмом нового кода, небезопасно работающего с памятью, и числом уязвимостей, связанных с памятью (переполнение буфера, обращение к уже освобождённой памяти и т.п.). Данное наблюдение подтверждает предположение, что основное внимание при внедрении техник безопасного программирования следует удалять новому коду, а не переписыванию существующего, так как основная масса выявляемых уязвимостей приходится на новый код.