
Esqueleto de PoC para CVE-2021-28664, un use-after-free en el controlador de GPU Mali kbase, que demuestra una primitiva de lectura/escritura arbitraria de memoria física en el kernel en Android ARM64.
Esqueleto de PoC para la primitiva de lectura/escritura arbitraria de memoria física del kernel a partir de un UAF en el driver Mali kbase GPU (CVE-2021-28664). Orientado a plataformas ARM64 Android genéricas, independiente de cualquier fabricante o modelo concreto.
El alcance de la investigación llega únicamente hasta la "primitiva de lectura/escritura arbitraria de memoria física del kernel": cómo convertir un use-after-free de un driver GPU en una capacidad de lectura/escritura de memoria del kernel estable, controlada y con fallo seguro.
Este repositorio no proporciona ningún ataque. No contiene exploits terminados, ni código directamente ejecutable, ni offsets/números de serie/firmware de ningún dispositivo; queda prohibido utilizar cualquier contenido para actividades de ataque (ver más abajo).
pipe_buffer/validación de copy_page_to_iter (a partir de 5.x es necesario reverificar según el código fuente correspondiente; la estructura de la cadena sirve de referencia pero los detalles no son universales);/dev/mali (restricciones de seLinux/políticas del fabricante).TODO(DEVICE); la adaptación es trabajo de ingeniería inversa del propio usuario, el repositorio no lo realiza.CVE-2021-28664: la ruta MEM_ALIAS del driver Mali kbase carece de comprobación del permiso GPU_WR, lo que permite al atacante hacer alias de páginas de memoria GPU ya liberadas en su propio espacio de direcciones GPU, creando una "visibilidad/escritura persistente desde el lado GPU sobre páginas físicas ya liberadas" — un use-after-free que cruza la frontera GPU/kernel.
El valor de explotación no reside en la memoria GPU en sí, sino en que:
WRITE_VALUE de la GPU se realizan modificaciones puntuales sobre las páginas visibles por alias.buffer GPU víctima + dump de tablas de páginas MMU → construir el mapa de direcciones físicas
→ trigger de liberación del buffer para generar presión → spray de pipe (F_SETPIPE_SZ reducido)
→ el array pipe_buffer cae en la zona liberada (reutilización UAF entre cachés)
→ escaneo del puntero ops en la vista alias → fuga de anon_pipe_buf_ops → KASLR slide
→ la GPU reescribe page / offset / len de pipe_buffer
→ aprovechando la ruta legítima de pipe read/write
⇒ lectura de página física arbitraria (falsificación del puntero page)
⇒ escritura de página física arbitraria (ruta de escritura pipe merge)
⇒ usar una página de contenido conocido como oráculo de autoverificación, garantizando que la lectura/escritura no caiga en huecos/zonas no mapeadas
Hasta aquí.
page_to_virt entre fabricantes, regiones reservadas no-map que simplemente no existen en el mapeo lineal (leerlas provoca panic).docs/
01-exploit-chain.md Del UAF a la primitiva de lectura/escritura: principios y puntos de implementación de cada fase
02-physical-address-model.md Modelo de direcciones físicas, puertas de seguridad, ambigüedad de m, trampas conocidas
exploit/
cve-2021-28664-poc.c Plantilla de PoC: esqueleto completo del flujo de la primitiva de lectura/escritura (sin valores de dispositivo)
scripts/
README.md Descripción del diseño de las herramientas de automatización experimental (bucle/verificación/restauración)
exploit/cve-2021-28664-poc.c es la plantilla esqueleto de PoC de la primitiva de lectura/escritura:
TODO(DEVICE), sin ningún valor directamente utilizable;Sirve para comprender cómo se organiza toda la cadena; no puede compilarse directamente en una herramienta eficaz contra ningún dispositivo.
fs/pipe.c / include/linux/pipe_fs_i.h (código fuente público)Documentation/arch/arm64/memory.rst (documentación pública)exploit/): GPL-3.0, ver LICENSEdocs/, scripts/): CC BY-NC-SA 4.0, ver LICENSE-DOCS
(prohibido el uso comercial; el contenido derivado debe compartirse bajo la misma licencia y conservar esta declaración)| Eslabón | Condición previa |
|---|
| Vulnerabilidad en sí | La versión del driver Mali kbase se encuentra en el rango afectado por CVE-2021-28664 (serie r anterior a la corrección upstream); no depende de la versión del kernel, solo del driver |
| Recursos GPU | /dev/mali es accesible para el proceso correspondiente; MEM_ALLOC soporta buffers grandes con SAME_VA; el comportamiento de MEM_ALIAS coincide con la descripción de la vulnerabilidad |
| Reutilización de tuberías | Linux ≥ 4.5 (introducción de pipe_buf_operations), verificado en 4.9 ~ 4.14; F_SETPIPE_SZ permite reducir la tubería a una sola página |
| Fuga de KASLR | Kernel con CONFIG_RANDOMIZE_BASE habilitado (arm64 ≥ 4.6); anon_pipe_buf_ops existe en la tabla de símbolos pública |
| Modelo de direcciones físicas | arm64 + diseño vmemmap; sizeof(struct page) y el formato de tablas de páginas deben medirse en el dispositivo, no pueden asumirse |