Серия Pixel 10 впервые среди устройств Pixel интегрирует компонент, написанный на безопасном для памяти языке Rust, в программное обеспечение сотового модема, согласно публикации в блоге Google Security Blog. Этот шаг заключается во внедрении в прошивку модема парсера системы доменных имён (DNS), созданного на Rust, с целью снижения рисков уязвимостей, связанных с безопасностью памяти, в части системы, работающей с ненадёжными данными.
Этот шаг является частью усилий Google по усилению защиты модема сотовой связи от эксплуатации уязвимостей. Компания оснастила Pixel 9 средствами защиты от ряда уязвимостей, связанных с безопасностью памяти, однако считает, что сложность прошивки модема и широта поверхности атаки требуют дополнительных превентивных мер. Google сообщила, что ранее Project Zero смог получить удалённое выполнение кода на модемах Pixel через интернет, а модем Pixel содержит десятки мегабайт исполняемого кода.
Почему Google выбрала DNS-парсер?
DNS используется не только для того, чтобы помогать браузерам находить веб-сайты. По мере перехода современных сотовых сетей на цифровые сети передачи данных базовые операции, такие как преобразование вызовов, также зависят от служб DNS. Этот сложный протокол требует анализа потенциально ненадёжных данных, что делает его уязвимой точкой при реализации на языке без защиты памяти; согласно публикации, такой тип риска был связан с уязвимостью CVE-2024-27227.
Google оценила несколько пакетов с открытым исходным кодом для реализации DNS на Rust и выбрала библиотеку hickory-proto, основываясь на уровне её сопровождения, покрытии тестами свыше 75% и распространённости в сообществе Rust. Изначально в библиотеке отсутствовала необходимая поддержка no_std для сред с ограниченными ресурсами или работающих без операционной системы, поэтому Google добавила эту поддержку в библиотеку и некоторые её зависимости. Результатом работы также стала поддержка no_std для парсера URL в проекте rust-url.
Цена размера и интеграция с существующим программным обеспечением
Исследование размера показало, что промежуточный компонент на Rust занимает 4 килобайта, тогда как компоненты core, alloc и compiler_builtins требуют 17 килобайт, а библиотека hickory-proto и её зависимости занимают 350 килобайт, что в сумме составляет 371 килобайт. Google считает, что объём памяти модема Pixel не накладывает строгих ограничений, поэтому на данном этапе предпочла поддержку сообщества и качество кода оптимизации размера. Однако компания отметила, что это увеличение может стать препятствием для других встраиваемых систем и что в будущем его можно сократить с помощью параметров компиляции, исключающих ненужные функции.
Для интеграции Rust в существующую кодовую базу, написанную на C и C++, команда использовала модульные тесты для проверки базовых арифметических операций, динамического выделения памяти и интерфейсов взаимодействия между языками. Команда также решила непосредственно интегрировать этапы компиляции Rust в существующую систему сборки вместо создания отдельных статических библиотек через Cargo, поскольку такой подход проще масштабировать при добавлении других компонентов на Rust и он снижает вероятность конфликтов символов.
Основная система сборки основана на Pigweed, а интерфейсы FFI использовались для связывания существующей системы выделения памяти в прошивке с компонентом alloc в Rust, а также для унификации обработки аварийных состояний между Rust и C/C++. При компоновке возникла проблема с производительностью и энергопотреблением из-за замены оптимизированных для модема реализаций функций memset и memcpy реализациями из compiler_builtins. Команда решила проблему, удалив файлы compiler_builtins из статической библиотеки перед этапом компоновки.
Интерфейс DNS и следующий шаг
Google определила программный интерфейс на языке C для обработки ответов DNS, а затем реализовала его на Rust. После анализа ответа компонент вызывает существующие функции C для обновления структур данных, используемых исходной программой. Для генерации необходимого связующего кода для сложных преобразований между типами данных использовался инструмент bindgen.
По словам Google, серия Pixel 10 представляет собой важную веху, поскольку это первые устройства Pixel, интегрирующие безопасный для памяти язык в модем. Цель заключается не только в замене одного парсера: компания считает, что проект закладывает основу для будущего внедрения других парсеров и компонентов, написанных на безопасных для памяти языках, в основу сотовой связи.