Google усложняет взлом прошивки модема Pixel 10

Google работает над повышением безопасности смартфонов Pixel, уделяя особое внимание базовому модему сотовой связи — компоненту устройства, который отвечает за связь с мобильными сетями и обработку внешних данных.

В модели Pixel 9 компания внедрила меры по снижению уязвимостей, связанных с памятью. В Pixel 10 подход стал более глубоким: в прошивку модема интегрирован DNS-парсер, написанный на языке программирования Rust.

Протокол DNS известен тем, что помогает браузерам находить веб-сайты, но он также играет важную роль в сотовых сетях, где такие функции, как переадресация вызовов, зависят от DNS-сервисов. DNS обрабатывает сложные данные из внешних источников и должен работать с ненадёжным вводом, что может создавать уязвимости при реализации на языках, не обеспечивающих безопасность памяти.

«Модем Pixel содержит десятки мегабайт исполняемого кода. Учитывая сложность и удалённую поверхность атаки модема, другие критические уязвимости безопасности памяти могут сохраняться в преимущественно небезопасном с этой точки зрения коде прошивки», — написал Цзячэн Лу, инженер-программист команды Google Pixel.

«Новый DNS-парсер на Rust значительно снижает наши риски безопасности, устраняя целый класс уязвимостей в опасной области, а также закладывая основу для более широкого внедрения безопасного для памяти кода в других сферах», — добавил Лу.

Интеграция Rust и сложности прошивки

Google выбрал открытую DNS-библиотеку под названием hickory-proto и адаптировал её для использования в прошивке модема. Среда модема требует, чтобы код на Rust работал без стандартной библиотеки, используя конфигурацию, известную как no_std.

Добавленный код увеличивает размер прошивки примерно на 371 КБ, включая DNS-библиотеку, её зависимости и необходимые компоненты Rust. Это было сочтено приемлемым для устройств Pixel.

«Мы создали прототипы и измерили размер с оптимизированными настройками. Ожидаемо, библиотека hickory_proto не проектировалась для встраиваемых систем и не оптимизирована по размеру. Поскольку модем Pixel не имеет жёстких ограничений по памяти, мы отдали приоритет поддержке сообщества и качеству кода, оставив оптимизацию размера кода на будущее», — пояснил Лу.

«Однако дополнительный размер кода может стать препятствием для других встраиваемых систем. В будущем эту проблему можно решить, добавив флаги функций для условной компиляции только необходимой функциональности. Реализация такой модульности стала бы ценной работой на перспективу».

Для интеграции парсера код на Rust был подключён к существующему микропрограммному обеспечению на C и C++ через интерфейсы, обеспечивающие обмен данными. Когда модем получает DNS-данные, они передаются парсеру на Rust, который их обрабатывает, а затем вызывает существующие функции на C для сохранения или использования результатов.

Это также потребовало изменений в процессе сборки. Код на Rust был скомпилирован таким образом, чтобы вписаться в существующую систему микропрограмм и связан с компонентами модема для управления памятью и обработки сбоев.

В ходе тестирования возникла проблема с производительностью, когда некоторые оптимизированные функции были заменены в процессе компоновки. Это вызвало проблемы с энергопотреблением и быстродействием, которые впоследствии были устранены путём корректировки процесса компоновки кода.