На проверке 0-click эксплойт Pixel 10: обход патча CVE-2025-54957 и новый вектор через VPU-драйвер

Материнская плата Pixel 10 под лампой макросъёмки: обгоревшая дорожка тянется от чипа VPU-драйвера к приподнятому экрану защиты, на плате выгравирована надпись CVE-2025-54957.


По неподтверждённым публикациям, Project Zero портировал полную 0-click цепочку с Pixel 9 на Pixel 10 менее чем за сутки. Пусть это осядет: менее чем за сутки. Адаптация эксплойта CVE-2025-54957 для Tensor G5 предположительно потребовала обхода RET PAC - Pointer Authentication Codes заменили классические stack canaries, и привычный перехват __stack_chk_fail перестал работать. Решение, по неподтверждённым данным, нашлось через перезапись инициализационной функции dap_cpdp_init, которая вызывается ровно один раз при старте декодера и потом просто лежит мёртвым грузом в памяти. Но по-настоящему показательна - если описание верно - вторая часть цепочки. Вместо закрытого драйвера BigWave на Pixel 10 предположительно обнаружился VPU-драйвер с уязвимостью, для эксплуатации которой хватило пяти строк кода: произвольное чтение-запись всей физической памяти устройства, включая .text и .data ядра, без какого-либо обхода ASLR. Физический адрес ядра на этом устройстве, по имеющимся данным, фиксирован. Просто захардкожен. В 2025 году. На флагмане Google.

Для атакующего ценность такой цепочки - полный компромисс устройства без единого тапа жертвы. Достаточно знать номер телефона и отправить SMS или RCS с crafted аудиовложением. Результат - root-доступ к ядру с возможностью чтения переписок, перехвата криптографических ключей, активации микрофона. По данным CISA Vulnrichment, атака автоматизируема (automatable: yes) с полным техническим импактом (technical impact: total). При этом на момент публикации CISA фиксирует exploitation: none - в дикой природе пока не замечена.

Цепочка эксплойтов Android: от входящего SMS до kernel root​

Вся цепочка укладывается в два эксплойта и три этапа. Для mobile exploit chain - необычно компактно.

Этап 1 - Initial Access и Execution (T1203, Exploitation for Client Execution). Атакующий отправляет SMS или RCS-сообщение со звуковым вложением в формате Dolby Digital Plus (EAC-3). Google Messages автоматически передаёт входящие аудиовложения на транскрипцию - сервис com.google.android.tts декодирует аудио без какого-либо взаимодействия пользователя. Этот механизм появился с интеграцией AI-помощников в последних версиях Android и превратил аудиокодеки в полноценную 0-click поверхность атаки. До автотранскрипции эксплуатация кодеков требовала, чтобы жертва открыла и прослушала вредоносный файл. Теперь - нет.

Этап 2 - Code Execution в mediacodec. Malformed DD+ bitstream триггерит CVE-2025-54957 в библиотеке Dolby Unified Decoder (libcodec2_soft_ddpdec.so). Integer overflow при расчёте размера аллокации в evo heap приводит к out-of-bounds write (CWE-787) с контролируемым содержимым и размером перезаписи. Атакующий получает выполнение произвольного кода в SELinux-контексте mediacodec - песочнице для программных декодеров.

Этап 3 - Privilege Escalation (T1068, Exploitation for Privilege Escalation). Из контекста mediacodec атакующий обращается к драйверу VPU (/dev/vpu), доступному через SELinux-политику. Уязвимый mmap-хендлер позволяет маппировать произвольный объём физической памяти в userspace, включая всю область ядра. Перезапись любой функции ядра даёт root.

Что должно быть выполнено до: отправка crafted аудиофайла, доставка через SMS/RCS-канал, автоматический запуск декодирования Google Messages. Что следует после: произвольное выполнение кода на уровне ядра, установка бэкдора, извлечение данных.

Анатомия CVE-2025-54957: integer overflow в Dolby UDC​

CVE-2025-54957 затрагивает Dolby Unified Decoder (UDC) версий 4.5 - 4.13. По данным NVD - CVSS 9.8 (CRITICAL) с вектором AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H: сетевой вектор, низкая сложность, ни привилегий, ни взаимодействия пользователя. Классификация по CWE: CWE-190 (Integer Overflow or Wraparound) и CWE-787 (Out-of-bounds Write). Обе отражают разные стороны одного дефекта - integer overflow приводит к некорректному расчёту размера буфера, после чего запись данных выходит за его границы.

Dolby UDC - проприетарная библиотека, поставляемая OEM-производителям в виде бинарного блоба с минимальной символьной информацией. На Pixel 9/10 она статически слинкована в /vendor/lib64/libcodec2_soft_ddpdec.so. Уязвимость не специфична для Android - тот же бинарь интегрирован в iOS, macOS, Windows (MSRC оценивает уязвимость на Windows как Important, CVSS 7.0, с классификацией CWE-190 и CWE-502, тогда как NVD указывает CWE-190 и CWE-787 при CVSS 9.8 CRITICAL - integer overflow совпадает, а описание последствий расходится), ChromeOS и потоковые устройства.

Архитектура evo heap и обработка EMDF​

DD+ аудио обрабатывается из bitstream, состоящего из независимо декодируемых syncframes. Каждый syncframe содержит до шести audio blocks, в каждом - поле skipl (длина данных, копируемых в skip buffer). Максимальный размер одного копирования - 0x1FF байт, суммарно до 0x1FF * 6 = 0xBFA байт на syncframe.

Содержимое skip buffer интерпретируется как данные в формате Extensible Metadata Delivery Format (EMDF). Декодер ищет syncword 0xE8 и далее разбирает EMDF-контейнер, включающий emdf_payload_size - размер полезной нагрузки, вычисляемый через функцию variable_bits. Спецификация не ограничивает значение emdf_payload_size, а variable_bits может вернуть произвольно большое число. Вот тут и начинается веселье.

Evo heap - простейший bump-аллокатор: один slab памяти с указателем текущей позиции. Память выделяется инкрементом указателя, освобождение отдельных блоков невозможно. Весь heap сбрасывается после обработки каждого syncframe - данные между фреймами не сохраняются. Этот минимализм критичен для понимания эксплойта: у аллокатора нет metadata (заголовков чанков, free lists), что делает heap corruption детерминированной. Никаких гаданий с heap feng shui - всё предсказуемо.

Integer wraparound в evo_malloc​

Функция ddp_udc_int_evo_malloc выполняет аллокацию на evo heap. Ниже - реконструированный псевдокод, адаптированный из анализа Project Zero (не оригинальный код; арифметика упрощена для иллюстрации):
C:
// ddp_udc_int_evo_malloc - аллокатор evo heap (реконструкция из P0)
total_size = alloc_size + extra;
if (alloc_size + extra < alloc_size)
    return 0;  // проверка переполнения суммы - тут всё корректно
if (total_size % 8)
    total_size += (8 - total_size) % total_size; // BUG: integer wraparound
if (total_size > heap->remaining)
    return 0;
mem = heap->curr_mem;
heap->remaining -= total_size;
heap->curr_mem += total_size;
Проверка суммы alloc_size + extra на переполнение сделана правильно. Проблема - в выравнивании до границы 8 байт. Выражение (8 - total_size) % total_size при total_size близком к SIZE_MAX (на 64-битной платформе) может дать неожиданно малый результат. После сложения total_size wrap-ается в маленькое значение - и проверка total_size > heap->remaining пропускает аллокацию. При total_size == 0 выражение вызывает деление на ноль (undefined behavior в C). Реальный уязвимый код может отличаться в деталях арифметики. Результат: буфер выделяется размером в единицы байт, а запись в него идёт по оригинальному payload_length, который может составлять сотни байт.

Два свойства делают этот баг подарком для эксплуатации:

Первое - контролируемый размер перезаписи. Каждый байт, записываемый в буфер, читается из skip buffer через ddp_udc_int_evo_brw_read, которая проверяет границы чтения по emdf_container_length. Исчерпались данные - цикл записи прерывается. Атакующий контролирует emdf_container_length через bitstream, задавая точное количество байт за пределами буфера.

Второе - информационная утечка. Когда emdf_container_length превышает реальную длину данных в skip buffer (skipl), декодер читает за пределами skip buffer. Готовый примитив чтения (information leak) для обхода ASLR в userspace-процессе.

Комбинация контролируемого OOB write + information leak - полноценный exploit primitive. На Pixel 9 Project Zero использовал перезапись поля payload_extra в структуре EMDF и подмену указателя на функцию для перехвата управления. Перезаписанный указатель срабатывал - и выполнялся код атакующего. Надёжность эксплойта, по оценке Project Zero, была достаточной для боевого применения.

Обход патча CVE-2025-54957 при портировании на Pixel 10​

📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

больше никогда не вызывается - перезапись её кодового региона контролируемыми данными не ломает работу декодера. Область памяти dap_cpdp_init превращается в хранилище для shellcode или ROP gadgets, а указатель на вызываемую функцию (через перезапись payload_extra или аналогичной структуры) перенаправляется туда.

Остальная адаптация - пересчёт офсетов для конкретной версии libcodec2_soft_ddpdec.so на Pixel 10. Адреса функций и структур в бинарном блобе отличаются между версиями библиотеки на разных устройствах. По признанию исследователей, главной сложностью оказалась не архитектурная - а недостаточная документация того, какие syncframes в эксплойте содержат device-specific офсеты. То есть основная проблема была навигационная, не техническая.

Предусловия и ограничения эксплойта Dolby UDC​

Работает если:
  • Устройство использует Dolby UDC версий 4.5 - 4.13 (подавляющее большинство Android-устройств)
  • Security Patch Level - декабрь 2025 или ранее
  • Google Messages с включённой автотранскрипцией (дефолт на Pixel)
  • Процесс com.google.android.tts автоматически декодирует входящие аудио
Не работает если:
  • SPL январь 2026+ (патч CVE-2025-54957 применён)
  • К mediacodec применён seccomp-фильтр системных вызовов (Samsung S24, AOSP имеют фильтр; Pixel 9 и Pixel 10 до патча - нет)
  • Активирован MTE (Memory Tagging Extension) - доступен на Pixel 8+ через режим "Advanced Protection", но по умолчанию отключён
  • Библиотека собрана с -fbounds-safety (macOS/iOS), что добавляет runtime-проверки границ массивов

Новый вектор атаки Pixel 10: уязвимость VPU-драйвера​

CVE-2025-36934 - подтверждённая уязвимость в драйвере BigWave (/dev/bigwave), use-after-free из-за race condition (CWE-362, CWE-416), CVSS 7.4 (HIGH), вектор AV:L/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H. BigWave управлял аппаратным ускорителем на Tensor G4. В рассматриваемом гипотетическом сценарии эта уязвимость предположительно использовалась как второе звено цепочки на Pixel 9 для privilege escalation из mediacodec в ядро - однако её включение в конкретную exploit-цепочку Project Zero не подтверждено официально.

На Pixel 10 драйвер BigWave отсутствует - Tensor G5 использует другой аппаратный стек. Вместо BigWave появилось устройство /dev/vpu - драйвер для чипа Chips&Media Wave677DV, отвечающего за аппаратное декодирование видео. SELinux-политика Pixel 10 предоставляет контексту mediacodec доступ к /dev/vpu. [Связь между CVE-2025-36934 и VPU-уязвимостью как звеньями одной exploit chain - часть неподтверждённого сценария.]

По неподтверждённым данным, приписываемым Project Zero, драйвер VPU предположительно написан той же командой, что создала BigWave. Аудит, по этим данным, занял два часа. Результат описывается как "Holy Grail of Kernel Vulnerabilities". [Официальный отчёт Project Zero, подтверждающий эти детали, не обнаружен.]

remap_pfn_range без проверки размера - прямой доступ к памяти ядра​

В отличие от upstream Linux-драйвера для более старого чипа WAVE521C, который интегрируется с V4L2 (Video for Linux API), драйвер Pixel для WAVE677DV напрямую экспонирует аппаратный интерфейс чипа в userspace - включая возможность маппирования MMIO-регистров. Вот уязвимый mmap-хендлер:
C:
static int vpu_mmap(struct file *fp, struct vm_area_struct *vm) {
    unsigned long pfn;
    struct vpu_core *core =
        container_of(fp->f_inode->i_cdev, struct vpu_core, cdev);
    vm_flags_set(vm, VM_IO | VM_DONTEXPAND | VM_DONTDUMP);
    vm->vm_page_prot = pgprot_device(vm->vm_page_prot);
    pfn = core->paddr >> PAGE_SHIFT;
    // размер маппинга = vm->vm_end - vm->vm_start - контролируется userspace
    return remap_pfn_range(vm, vm->vm_start, pfn,
        vm->vm_end - vm->vm_start, vm->vm_page_prot) ? -EAGAIN : 0;
}
Хендлер предназначен для маппирования MMIO-региона VPU в виртуальное адресное пространство пользовательского процесса. Физический адрес начала маппинга - core->paddr, адрес регистрового региона VPU-чипа. А вот размер маппируемой области вычисляется как vm->vm_end - vm->vm_start - значение, полностью контролируемое из userspace через аргумент length системного вызова mmap. Проверки, что запрошенный размер не превышает реальный размер регистрового региона, - нет. Вообще.

Последствия: вызов mmap с произвольно большим length маппирует в userspace физическую память, начиная с адреса VPU-регистров и далее на указанный размер. Образ ядра Linux (секции .text, .data, .bss) располагается по более высокому физическому адресу, чем VPU-регион - и полностью попадает в маппируемый диапазон.

Ядро на этом устройстве, согласно анализу, загружается по фиксированному физическому адресу. KASLR рандомизирует виртуальные адреса, но физическое расположение на конкретной модели детерминировано. Смещение между началом VPU-региона и ядром - известная константа. Атакующему не нужно ни сканировать память, ни обходить рандомизацию: зная размер VMA, он точно знает, по какому виртуальному смещению от возвращённого mmap адреса находится каждая функция ядра. Это как если бы банк повесил табличку с расположением сейфа и выложил план здания.

По неподтверждённой оценке, приписываемой Project Zero, достижение произвольного чтения-записи ядра через эту уязвимость потребовало пяти строк кода. Написание полного эксплойта - предположительно менее одного рабочего дня. Для сравнения: эксплойт Dolby UDC оценивается в 8 человеко-недель, BigWave - в 3 недели. [Эти оценки трудозатрат не подтверждены официально.]

Предусловия и ограничения VPU-эксплойта​

Работает если:
  • Pixel 10 с Tensor G5 (Wave677DV silicon)
  • Процесс имеет доступ к /dev/vpu через SELinux (контекст mediacodec)
  • SPL до февраля 2026 (предположительно патч в February Pixel Security Bulletin - не подтверждено)
Не работает если:
  • Другие Android-устройства (BigWave/VPU - Pixel-specific драйверы)
  • SPL февраль 2026+ (уязвимость закрыта)
  • Устройства без Tensor G5 (другая SoC - другие драйверы, другая поверхность атаки)
  • Seccomp-фильтр mediacodec блокирует mmap с MAP_SHARED на device files - но на Pixel 10 такой фильтр к mediacodec не применялся

Митигации: MTE, seccomp, PAC - что сработало и что нет​

Цепочка для Pixel 10 показывает неоднородную эффективность защитных механизмов Android. Если коротко - почти все они на бумаге выглядят солидно, а на практике оказались либо выключены, либо обходимы.

Memory Tagging Extension (MTE) - единственная митигация, способная полностью заблокировать эксплуатацию CVE-2025-54957 на аппаратном уровне. MTE маркирует каждую аллокацию 4-битным тегом и проверяет теги при каждом обращении к памяти - OOB write в соседний аллокатор с несовпадающим тегом вызывает синхронное исключение. На Pixel 8+ MTE доступен, но активируется только вручную через "Advanced Protection". По умолчанию выключен. По умолчанию не защищает.

Seccomp-фильтр для mediacodec - ограничивает набор системных вызовов из песочницы декодера. В AOSP и прошивке Samsung S24 фильтр применяется к mediacodec, что блокирует ioctl-вызовы к BigWave и потенциально mmap-вызовы к VPU. На Pixel 9 и Pixel 10 (до момента исправления) seccomp-фильтр к mediacodec не применялся. Песочница оказалась дырявой - атакующий из mediacodec имел свободный доступ к device drivers, к которым SELinux разрешает обращение.

RET PAC (Pointer Authentication) - усложнил адаптацию userspace-эксплойта, устранив __stack_chk_fail как цель перезаписи. Но не заблокировал эксплуатацию: замена на dap_cpdp_init потребовала проб и ошибок, но не фундаментальных изменений в подходе. PAC защищает указатели возврата, но не препятствует перезаписи произвольных данных и кодовых регионов - ограничение, заложенное в дизайн.

SELinux - ограничивает доступ mediacodec к файловой системе и сетевым ресурсам, но явно разрешает обращение к /dev/vpu (и ранее к /dev/bigwave). SELinux не защищает от privilege escalation через аппаратные драйверы, если сам драйвер содержит уязвимость.

KASLR - рандомизирует виртуальные адреса ядра, но физический адрес на этом устройстве фиксирован. Для VPU-эксплойта KASLR полностью нерелевантен - доступ к ядру идёт через физическую память.

МитигацияБлокирует Dolby UDC exploitБлокирует VPU exploitСтатус на Pixel 10
MTEДаЧастично (heap corruption)Выключен по умолчанию
Seccomp на mediacodecНет (userspace exploit)Да (блокирует mmap)Отсутствует
RET PACНет (обходится через dap_cpdp_init)Не препятствует (эксплойт через mmap не подделывает return-адреса)Включён
SELinuxЧастично (ограничивает sandbox)Нет (VPU разрешён)Активен
KASLRЧастично (userspace ASLR)Нет (физ. адрес фиксирован)Активен
-fbounds-safetyДаНерелевантенНе используется на Android

Флаг -fbounds-safety, применяемый Apple при сборке Dolby UDC для macOS и iOS, подставляет runtime-проверки границ массивов. Эффективно блокирует OOB write, но снижает производительность - и не используется в Android-экосистеме.

Хронология патчей и Project Zero эксплойт для Pixel 10​

Хронология раскрытия и исправления CVE-2025-54957 - наглядная иллюстрация системных проблем с patch pipeline в Android:
  • 26 июня 2025 - Dolby информирована об уязвимости
  • 18 сентября 2025 - первый бинарный патч (ChromeOS)
  • 8 октября 2025 - Dolby предоставляет бинарные патчи для Android
  • 15 октября 2025 - публичное раскрытие уязвимости
  • 12 ноября 2025 - Samsung публикует исправление
  • 5 января 2026 - Google публикует исправление для Pixel
Между публичным раскрытием и патчем для Pixel - 82 дня. Между первым уведомлением Dolby и патчем для всех Android-устройств - 139 дней. Всё это время существовал полностью рабочий эксплойт. MSRC 14 октября 2025 года оценил уязвимость для Windows как Important (CVSS 7.0) - существенно ниже CVSS 9.8 (CRITICAL) по NVD для Android. EPSS составляет 0.0159 (percentile 0.7321 - выше медианы среди всех CVE в базе, хотя абсолютное значение 1.59% остаётся низким: percentile отражает относительное ранжирование, а не высокую абсолютную вероятность эксплуатации).

VPU-уязвимость, по неподтверждённым данным, показала улучшение: баг предположительно репортирован 24 ноября 2025, Android VRP предположительно присвоил ему severity High (улучшение по сравнению с первоначальным Moderate для BigWave), патч предположительно выпущен через 71 день. CVE-идентификатор для этой уязвимости публично не известен, детали не подтверждены официальными бюллетенями.

Вместе с тем VPU-уязвимость, по неподтверждённым данным, обнаружена через 5 месяцев после репорта BigWave - и предположительно оказалась тривиальнее предшественника. Источник, приписываемый Project Zero, указывает: после репорта BigWave ожидалось, что разработчики проведут аудит остальных драйверов - но этого якобы не произошло. VPU-уязвимость описывается как "instantly noticeable with even a cursory audit of the codebase". Два часа аудита - и вот вам "Holy Grail". [Официальная публикация Project Zero с этими цитатами не обнаружена.]

Портирование полной 0-click цепочки на Pixel 10, по неподтверждённым данным, заняло менее суток: адаптация Dolby UDC эксплойта - пересчёт офсетов и замена overwrite target, обнаружение VPU - предположительно два часа аудита, эксплуатация VPU - менее дня. Если эти оценки верны, для достаточно мотивированного атакующего с навыками mobile exploit development перенос exploit chain между поколениями устройств одного производителя - операция с низким порогом входа.

Этот кейс ставит под вопрос один из базовых аргументов в дискуссии о mobile security: тезис о том, что 0-click эксплуатация - привилегия "most well-resourced attackers". По неподтверждённым оценкам, приписываемым Project Zero, трудозатраты на CVE-2025-54957 exploit составили 8 человеко-недель, на BigWave - 3 недели, на VPU - менее дня. Это ресурсы небольшой offensive-команды, не nation-state уровня. Две уязвимости (Dolby UDC и BigWave) предположительно найдены менее чем за два дня рецензирования каждая. Качество кода проприетарных компонентов (Dolby blob, Pixel-specific драйверы) - слабое звено, не поддающееся стандартному patch-процессу.

Расхождение между CVSS 9.8 от NVD и заниженными оценками от вендоров, между initial Moderate от Android VRP для BigWave и реальным impact (root через 0-click) - не теоретическая проблема. Severity-рейтинг влияет на приоритет патчинга. Когда критическая уязвимость маркируется как Important или Moderate, она попадает в следующий квартальный цикл вместо экстренного OTA. 139 дней - вот что происходит, когда CVSS вендора (7.0 по MSRC) и CVSS NVD (9.8) существенно расходятся.

Для тех, кто занимается vulnerability research на ARM64, этот кейс наглядно показывает, куда смотреть. Проприетарные бинарные блобы с минимальной символьной информацией, аппаратные драйверы без серьёзного security-аудита, bump-аллокаторы без metadata - всё это не наследие прошлого десятилетия, а production-код 2025 года на flagship-устройствах. RET PAC усложняет exploitation, но не блокирует. MTE мог бы решить проблему - но по умолчанию выключен. Seccomp мог бы ограничить blast radius - но не применяется к mediacodec на Pixel. Каждая митигация по отдельности недостаточна, и даже в комбинации они работают только при корректной конфигурации. А конфигурация на флагмане Google оказалась далеко не оптимальной. Если хочешь превратить integer overflow в controlled write на практике - задачи по binary exploitation на HackerLab.pro дают именно такие примитивы, где нужно собрать рабочую цепочку самостоятельно, от trigger до захвата управления.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🧭 Навигатор · ИБ 2026
Не знаешь, какой трек твой?
5 направлений ИБ, реальные зарплаты и точка входа для каждого — в одном треде.
JuniorSenior+
100K → 600K+ ₽ /мес
Открыть навигатор →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab