Уязвимость в модемах Unisoc даёт доступ к памяти ядра Android через VoLTE
В прошивке модемов Unisoc нашли ошибку, из-за которой код в модеме может получить доступ к памяти ядра Android. Исследование опубликовал независимый специалист по информационной безопасности, известный под псевдонимом 0x50594d, при поддержке компании SSD Secure Disclosure.
Ошибка затрагивает разделение памяти внутри чипа. Память модема и память операционной системы должны быть изолированы друг от друга. В устройствах на Unisoc этой изоляции нет или она работает неверно. Проблему отнесли к классу CWE-1189. Так называют ошибки, при которых разные части одного чипа получают доступ к общим ресурсам без нужных ограничений.
Исследователь показал, что код в модеме может отключить защиту первой области блока MPU. После этого он получает доступ ко всей физической памяти смартфона. В тестовой прошивке ядро было размещено по адресу `0x80080000`. Это дало возможность записать код в память ядра и запустить его от его имени.
Наличие проблемы подтвердили на Xiaomi Redmi A5 с январским обновлением безопасности Android 2026 года и на Motorola E13 с февральским обновлением 2025 года. Для демонстрации атаки использовали realme C33 на чипе Unisoc T612 с обновлением безопасности от 1 июля 2025 года.
Для проверки атаки исследователи собрали тестовый стенд в Docker. Open5GS использовали как ядро мобильной сети, а Kamailio — как SIP-сервер для обработки VoLTE-вызовов. Для связи 4G применяли LimeSDR. Устройства подключали к сети с помощью SIM-, USIM- и ISIM-карт Osmocom.
Атака использует SIP-запросы в VoLTE. Сначала атакующий отправляет на телефон жертвы несколько специально подготовленных запросов `INVITE`. В них находятся части кода для модема. Затем он отправляет последний запрос и звонит по видеосвязи. Код начинает работать после ответа на звонок.
Нагрузка попадает в память модема фрагментами. Вспомогательный код находит их, собирает в один блок по адресу `0x8de00000` и запускает. После этого модемный код отключает защиту памяти, записывает данные в ядро и меняет начало функции `do_sys_open`, таким образом перенаправляя выполнение в добавленный код.
В демонстрации внедрённый код срабатывал один раз и оставлял служебную запись в журнале ядра. Так исследователь подтвердил выполнение кода с правами ядра Android.
0x50594d сообщил, что пытался связаться с Unisoc по электронной почте и через LinkedIn, но ответа не получил.
