Современные операционные системы для смартфонов имеют множество механизмов безопасности, но они бессильны, если злоумышленники атакуют модем. Команда Project Zero в Google показала, что удалённое выполнение кода на модемах телефонов Pixel через интернет возможно. Это заставило компанию пересмотреть подход к защите этого критически важного низкоуровневого компонента. Решением стала не полная перезапись ПО модема, а интеграция более безопасного компонента на языке Rust в модем Pixel 10.
Почему модемы остаются уязвимым местом
Сотовые модемы — своего рода «чёрный ящик». Базовый модуль телефона работает на собственном ОС, исполняя устаревший код на C и C++, что делает его всё более привлекательной целью для атак. Ключевая проблема — управление памятью в этих системах сложно реализовать правильно, что часто приводит к появлению небезопасного в плане памяти кода в прошивках серийных устройств. Это позволяет злоумышленникам использовать серьёзные уязвимости, такие как переполнение буфера и утечки памяти, для компрометации устройств.
Почему же эти технологии всё ещё используются? Частично проблема в инерции встроенных систем. Компании десятилетиями разрабатывали прошивки модемов на основе спецификаций 3GPP, что привело к накоплению большого технического долга. Кроме того, модемы должны работать в реальном времени для эффективной отправки и приёма данных, а код на C/C++ — быстрый.
Как Rust решает проблему безопасности памяти
В отличие от некоторых языков, в Rust нет медленного сборщика мусора. Вместо этого он использует механизм под названием «проверка заимствований», который гарантирует безопасность памяти на этапе компиляции. Строгий набор правил не позволяет «забыть» освободить память — код просто не скомпилируется, если эти правила нарушены. Именно это делает Rust языком с безопасной работой с памятью.
Однако даже Google не может просто взять и изменить принцип написания прошивок модемов. Речь идёт о десятках мегабайт исполняемого машинного кода. Переписывать десятилетия работы — титаническая задача. К тому же, многие вовлечённые компании считают внутреннее устройство модемов коммерческой тайной.
DNS-парсер как точка приложения усилий
Для защиты модема Pixel от атак с использованием уязвимостей нулевого дня Google сосредоточилась на DNS-парсере. Поскольку функции сотовой связи всё больше переходят на сети передачи данных, DNS стал ключевой частью работы телефонов. В Google объясняют, что DNS требует обработки ненадёжных данных, что делает его серьёзной проблемой безопасности, но её можно решить с помощью Rust.
Компания выбрала открытую Rust-библиотеку hickory-proto для работы с DNS. Она не особо оптимизирована, но имеет широкое распространение и поддержку. Модем в телефонах Pixel не является системой с жёсткими ограничениями по памяти, что позволило команде добавить Rust-компонент для безопасной обработки DNS в существующем коде. Команда убрала зависимости от стандартной библиотеки, что позволило скомпилировать код в машинный для более быстрой работы, а затем «пришить» его к существующему коду модема на C/C++. В сумме компоненты на Rust добавили 371 КБ, что приемлемо для модема Pixel.
Что это даёт и каковы перспективы
При такой системе любая попытка спровоцировать уязвимость через манипуляции с памятью наталкивается на «стену» Rust — она не может быть затронута вредоносными DNS-пакетами. Телефоны Pixel 10 станут первыми, в которых будет использована эта более безопасная реализация модема.
Google надеется, что эта работа позволит другим платформам сделать аналогичные улучшения, но отмечает, что размер выбранной Rust-библиотеки может быть проблемой для более простых встроенных систем. Возможно, это удастся решить, сделав библиотеку более модульной в будущем. Google также рассматривает эту работу как основу для постепенной интеграции большего числа компонентов с безопасной работой с памятью в сотовый базовый модуль.



