
Лаборатория на основе QEMU для воспроизведения состояния гонки CVE-2022-46395 в драйвере GPU Arm Mali r36p0. Включает PoC, сборочные скрипты и упаковку initramfs для локального исследования уязвимостей и регрессионного тестирования.
Этот репозиторий содержит лабораторию QEMU/no-Mali для воспроизведения переносимого условия срабатывания CVE-2022-46395 для линейки драйверов Arm Mali r36p0.
Лаборатория предназначена для локального исследования уязвимостей и регрессионного тестирования. Она не содержит загрузчика повышения привилегий, специфичного для Pixel, из оригинального эксплойта. В режиме LAB_QEMU PoC останавливается после демонстрации того, что окно гонки soft-event/user-buffer было достигнуто.
poc/: PoC CVE-2022-46395, адаптированный для QEMU. Вызовы логирования и свойств Android заменены, а патчинг текста ядра Pixel отключён в режиме LAB_QEMU.src/google-gpu-raviole-android13/: Исходный код модуля GPU Google Pixel из android.googlesource.com/kernel/google-modules/gpu, ветка android-gs-raviole-5.10-android13. Включённый файл идентифицирует драйвер как .mali_kbase/Kbuildr36p0-01eac0scripts/: сценарии сборки, упаковки initramfs, загрузки QEMU и вспомогательные сценарии однократного воспроизведения.docs/: локальные заметки по анализу и отчёты о воспроизведении.logs/: выбранные журналы доказательств успешных локальных запусков.Сгенерированные бинарные файлы, архивы initramfs, объектные файлы и большинство журналов выполнения игнорируются Git. Пересоберите их локально с помощью приведённых ниже сценариев.
Сценарии использовались на виртуальной машине Linux с:
bash, make, gcc, file, cpio, gzip, modinfobusybox по пути /bin/busyboxqemu-system-x86_64По умолчанию сценарии ожидают дерево ядра и образ загрузки по пути:
../build/linux-5.10-kasan
../build/linux-5.10-kasan/arch/x86/boot/bzImage
Вы можете переопределить эти пути с помощью KDIR и KERNEL_IMAGE.
Клонируйте репозиторий и перейдите в него:
git clone https://github.com/Gao-Zuin/cve-2022-46395-qemu.git
cd cve-2022-46395-qemu
Запустите полный цикл сборки/упаковки/загрузки:
MAX_ATTEMPTS=2000 ./scripts/reproduce.sh
Если ваше ядро KASAN находится не в каталоге ../build по умолчанию:
KDIR=/path/to/linux-5.10-kasan \
KERNEL_IMAGE=/path/to/linux-5.10-kasan/arch/x86/boot/bzImage \
MAX_ATTEMPTS=2000 \
./scripts/reproduce.sh
Успешный локальный запуск использовал следующие параметры времени:
MAX_ATTEMPTS=2000 UNMAP_OFFSET_NS=-800000 ./scripts/reproduce.sh
Для более подробного логирования попыток:
MAX_ATTEMPTS=2000 VERBOSE_ATTEMPTS=1 UNMAP_OFFSET_NS=-800000 \
./scripts/reproduce.sh
Одноразовый сценарий эквивалентен:
./scripts/build_r36p0_no_mali.sh
./scripts/build_poc.sh
MAX_ATTEMPTS=2000 UNMAP_OFFSET_NS=-800000 ./scripts/package_initramfs.sh
./scripts/run_qemu.sh
Полезные переменные окружения:
KDIR: дерево сборки ядра, используемое для компиляции mali_kbase.koKERNEL_IMAGE: образ bzImage, передаваемый QEMUQEMU_LOG: путь к выходному журналуQEMU_MEM: размер памяти QEMU, по умолчанию 1536MQEMU_SMP: количество ЦП QEMU, по умолчанию 3MAX_ATTEMPTS: лимит повторных попыток PoC, по умолчанию 2000UNMAP_OFFSET_NS: смещение времени гонки, по умолчанию -800000VERBOSE_ATTEMPTS=1: выводить подробности каждой попыткиKASAN_UAF_MODE=1: загружать модуль с опцией зонда KASAN UAF, используемой в scripts/reproduce_kasan_uaf.shУспешный запуск выводит строки вида:
mali mali.0: Kernel DDK version r36p0-01eac0
r36p0-01eac0 (UK version 11.34)
/dev/mali0
finished reset: 703956220 fault: 682115150 68 err 0 read 3
qemu lab mode: CVE-2022-46395 soft-event/user-buffer race reproduced
qemu lab mode: reproduction completed after 17 attempts
[init] PoC status: 0
Справочный журнал доказательств:
logs/qemu-cve-2022-46395-r36p0-unmap-minus800us.log
Ключевое условие успеха: err=0, read=3 и fault < reset. Это указывает на то, что окно гонки было достигнуто для r36p0-01eac0 в QEMU без Mali.
MAX_ATTEMPTS или измените UNMAP_OFFSET_NS.