
# Laboratório baseado em QEMU para reproduzir a condição de corrida CVE-2022-46395 no driver de GPU Arm Mali r36p0. Inclui PoC, scripts de build e empacotamento de initramfs para pesquisa local de vulnerabilidades e testes de regressão.
Este repositório contém um laboratório QEMU/no-Mali para reproduzir a condição de gatilho portátil da CVE-2022-46395 contra a linhagem do driver Arm Mali r36p0.
O laboratório destina-se a pesquisa local de vulnerabilidades e testes de regressão.
Ele não inclui o payload de escalonamento de privilégios específico do Pixel do exploit
original. No modo LAB_QEMU, o PoC é interrompido após demonstrar que a janela de
corrida (race) soft-event/user-buffer foi alcançada.
poc/: PoC da CVE-2022-46395 adaptado para QEMU. As chamadas de log e de
propriedades do Android são substituídas, e o patch de texto do kernel do Pixel
é desativado sob LAB_QEMU.src/google-gpu-raviole-android13/: código-fonte do módulo GPU do Google Pixel
de android.googlesource.com/kernel/google-modules/gpu, branch
android-gs-raviole-5.10-android13. O incluído identifica
o driver como .mali_kbase/Kbuildr36p0-01eac0scripts/: scripts auxiliares para build, empacotamento do initramfs, boot do
QEMU e reprodução em uma única execução.docs/: notas de análise local e relatórios de reprodução.logs/: logs de evidência selecionados de execuções locais bem-sucedidas.Binários gerados, arquivos initramfs, arquivos-objeto e a maioria dos logs de execução são ignorados pelo Git. Reconstrua-os localmente com os scripts abaixo.
Os scripts foram usados em uma VM Linux com:
bash, make, gcc, file, cpio, gzip, modinfobusybox em /bin/busyboxqemu-system-x86_64Por padrão, os scripts esperam a árvore do kernel e a imagem de boot em:
../build/linux-5.10-kasan
../build/linux-5.10-kasan/arch/x86/boot/bzImage
Você pode substituir esses caminhos com KDIR e KERNEL_IMAGE.
Clone o repositório e entre nele:
git clone https://github.com/Gao-Zuin/cve-2022-46395-qemu.git
cd cve-2022-46395-qemu
Execute o fluxo completo de build/empacotamento/boot:
MAX_ATTEMPTS=2000 ./scripts/reproduce.sh
Se o seu kernel KASAN não estiver no diretório irmão padrão ../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
A execução local bem-sucedida utilizou este ajuste de temporização:
MAX_ATTEMPTS=2000 UNMAP_OFFSET_NS=-800000 ./scripts/reproduce.sh
Para logs de tentativas mais detalhados:
MAX_ATTEMPTS=2000 VERBOSE_ATTEMPTS=1 UNMAP_OFFSET_NS=-800000 \
./scripts/reproduce.sh
O script de execução única é equivalente a:
./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
Variáveis de ambiente úteis:
KDIR: árvore de build do kernel usada para compilar mali_kbase.koKERNEL_IMAGE: bzImage passado para o QEMUQEMU_LOG: caminho do log de saídaQEMU_MEM: tamanho da memória do QEMU, padrão 1536MQEMU_SMP: número de CPUs do QEMU, padrão 3MAX_ATTEMPTS: limite de tentativas do PoC, padrão 2000UNMAP_OFFSET_NS: deslocamento de temporização da corrida, padrão -800000VERBOSE_ATTEMPTS=1: exibir detalhes por tentativaKASAN_UAF_MODE=1: carregar o módulo com a opção de probe KASAN UAF usada por
scripts/reproduce_kasan_uaf.shUma execução bem-sucedida imprime linhas como:
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
O log de evidência de referência é:
logs/qemu-cve-2022-46395-r36p0-unmap-minus800us.log
A condição principal de sucesso é err=0, read=3 e fault < reset. Isso
indica que a janela de corrida foi alcançada contra r36p0-01eac0 no QEMU sem Mali.
MAX_ATTEMPTS maior ou ajuste UNMAP_OFFSET_NS.