
Adaptación de CVE-2026-64560 vinculada al dispositivo para RedMi K80pro miro OS 3.0.304.0
Proyecto de portabilidad de escalada de privilegios local en espacio de usuario para CVE-2026-64560 en el Redmi K80 Pro (miro).
🚀 ¿No quieres leer tanta documentación?
Si no quieres profundizar o no quieres leer un montón de
.mdgenerados por IA, ve directamente adyc.md—— una guía rápida en lenguaje sencillo: desde cero hasta el jailbreak (incluyendo KernelSU), solo dice qué comandos escribir, sin explicar el porqué.
El exploit upstream y la adaptación para Xiaomi 15 (dada) provienen de
quyicheng03-boop,
este repositorio es el resultado de la portabilidad basada en él, tras volver a derivar direcciones y constantes para el K80 Pro.
Este proyecto solo realiza la portabilidad, no incluye el descubrimiento de la vulnerabilidad. El principio de la vulnerabilidad y el diseño de la cadena de explotación pertenecen íntegramente al autor upstream. Ver
docs/UPSTREAM.mdyNOTICE.
El código fuente y los binarios de este repositorio solo son válidos para la siguiente versión de firmware:
Cambiar a cualquier otra versión de OTA lo invalidará. Los desplazamientos de estructuras en el kernel, las direcciones de símbolos y los rangos de KASLR
están todos derivados para esta única Image; con un solo carácter de diferencia no funcionará.
Cuando la huella no coincide, el programa sale en la entrada:
TARGET_PROFILE_GATE_FAIL fingerprint=...
Esto es un fallo seguro, no toca el kernel. Si tu firmware no es la versión de la tabla anterior, realiza tu propia portabilidad siguiendo
docs/05-technical.md, no apliques directamente
las constantes de este repositorio.
docs/04-troubleshooting.md),
pero no lo ejecutes en dispositivos que no sean tuyos o cuyos datos no estén respaldados.fastboot.k80pro-miro-cve-2026-64560/
├── README.md Este archivo
├── dyc.md Guía rápida (versión en lenguaje sencillo), principiantes lean esto primero
├── LICENSE Licencia upstream
├── NOTICE Declaración de atribución upstream
├── SHA256SUMS.txt Valores de verificación de los tres artefactos en release_build/
│
├── src/ Código fuente para compilación
│ ├── exploit-fanout-miro.c
│ ├── exploit-rotate-miro.c
│ ├── temp-su.c
│ ├── miro-profile.h Referencia de constantes (no participa en la compilación)
│ ├── miro-integration.c Referencia de integración (no participa en la compilación)
│ └── exploit-*.c Archivos originales upstream (entrada del generador, no participan en la compilación)
│
├── release_build/ Artefactos precompilados (listos para usar)
│ ├── cve-2026-64560-fanout
│ ├── cve-2026-64560-rotate
│ └── su
│
├── docs/
│ ├── 01-build.md Cómo compilar
│ ├── 02-usage.md Cómo usar en adb shell
│ ├── 03-tokens.md Tabla de referencia rápida de tokens de salida
│ ├── 04-troubleshooting.md Solución de problemas y descripción de riesgos
│ ├── 05-technical.md Descripción técnica de la portabilidad
│ └── UPSTREAM.md Origen upstream
│
└── tools/ Scripts de compilación y herramientas de reproducción/diagnóstico (no participan en la explotación)
├── build.sh Compilación con un solo comando (sh tools/build.sh)
└── *.py Scripts de reproducción / diagnóstico
Ver docs/02-usage.md.
Primero confirma que los artefactos estén completos:
sha256sum -c SHA256SUMS.txt # Linux / macOS
certutil -hashfile <archivo> SHA256 # Windows, verificar uno por uno
Ver docs/01-build.md.
Se requiere Android NDK (no se puede usar gcc del sistema, la razón está en ese documento). La forma más sencilla es
usar el script incluido en el repositorio, que busca el NDK por sí mismo, selecciona la cadena de herramientas correcta, compila y compara los hashes uno por uno con
SHA256SUMS.txt:
sh tools/build.sh # Compilar + verificar
sh tools/build.sh --no-check # Solo compilar
El script solo compila, no toca el dispositivo, no hace push, no ejecuta el exploit.
Si no quieres usar el script, también puedes escribir manualmente los tres comandos clang, produciendo
cve-2026-64560-fanout, cve-2026-64560-rotate, su.
Tras compilar, compara si los bytes coinciden con los de release_build/:
sha256sum build/* # Comparar con los tres valores en SHA256SUMS.txt
El único criterio de éxito es abrir un nuevo adb shell y poder obtener uid=0 a través de /data/local/tmp/su:
$ printf 'id\nexit\n' | adb shell -T /data/local/tmp/su
uid=0(root) gid=0(root) groups=0(root),1004(input),... context=u:r:shell:s0
Observa context=u:r:shell:s0 —— identidad root pero manteniendo el dominio shell, esto es por diseño,
no es un error.
Los tokens clave que se verán durante el proceso (tabla completa en docs/03-tokens.md):
BOOTID_WRITE_PASS attempt=5 q0=... q1=... slide=... kernel_base=...
STAGE0_GATE_PASS slide=... kernel_base=...
MISC_BRIDGE_OPEN_PASS fd=... observed=...
STAGE8_CRED_STAGE_PASS task=... cred=... uid=0 context=shell
ROOT_CHILD_HOLD_PASS child=... uid=0 context=shell selinux_permissive=1
La tasa de éxito no es del 100%. En la etapa Stage0, la tasa de acierto única medida es de aproximadamente 1/5, por lo que el programa reintenta 32 veces por etapa por defecto. La cadena completa es probabilística.
Un fallo puede manifestarse como un cuelgue. Requiere mantener pulsado el botón de encendido para forzar el reinicio. Tras el reinicio, el estado del kernel se borra por completo y se puede volver a intentar.
Tras el éxito quedan dos estados hasta el reinicio:
/data/local/tmp/su se convierte en un proceso demonio que otorga root a cualquier identidad shellEl método de limpieza está al final de docs/02-usage.md.
permissive no es un bug residual, sino la condición previa para cargar módulos del kernel (KernelSU LKM, etc.). Detalles en
docs/04-troubleshooting.md.
dada): autor del repositorio upstreammiro): ver CHANGELOG| Elemento | Valor |
|---|
| Modelo | Redmi K80 Pro (ro.product.device = miro) |
| Huella | Redmi/miro/miro:16/BP2A.250605.031.A3/OS3.0.304.0.WOMCNXM:user/release-keys |
| Kernel | 6.6.118-android15-8-gc44b714366cc-abogki519650608-4k |
| Fecha de compilación del kernel | Thu Jun 4 03:48:35 UTC 2026 |
| Tamaño de página | 4096 (4K) |