
Adaptação de CVE-2026-64560 vinculada ao dispositivo para RedMi K80pro miro OS 3.0.304.0
Projeto de portabilidade de escalação de privilégios local em espaço de usuário do CVE-2026-64560 para o Redmi K80 Pro (miro).
🚀 Não quer ler toda essa documentação?
Se você não quer se aprofundar, ou não quer ler essa pilha de
.mdgerados por IA, vá direto paradyc.md—— um guia rápido em linguagem simples: do zero ao jailbreak (incluindo KernelSU), só diz o que digitar, sem explicar o porquê.
O exploit upstream e a adaptação para o Xiaomi 15 (dada) vêm de
quyicheng03-boop,
e este repositório é o resultado da portabilidade para o K80 Pro, com endereços e constantes
rederivados a partir daquele.
Este projeto apenas faz portabilidade, não inclui a descoberta da vulnerabilidade. O princípio da vulnerabilidade e o design da cadeia de exploração pertencem inteiramente ao autor upstream. Veja
docs/UPSTREAM.mdeNOTICE.
O código-fonte e os binários deste repositório só são válidos para esta versão de firmware:
Trocar para qualquer outra versão de OTA fará com que pare de funcionar. Os offsets de estruturas no kernel, endereços de símbolos e intervalos de KASLR
foram todos derivados especificamente para este Image; um caractere de diferença já impede a execução.
Quando o fingerprint não corresponde, o programa sai logo na entrada:
TARGET_PROFILE_GATE_FAIL fingerprint=...
Isso é uma falha segura, não toca no kernel. Se o seu firmware não for a versão da tabela acima, faça a portabilidade você mesmo seguindo
docs/05-technical.md, não aplique diretamente
as constantes deste repositório.
docs/04-troubleshooting.md),
mas não execute em dispositivos que não sejam seus ou cujos dados não estejam com backup.fastboot.k80pro-miro-cve-2026-64560/
├── README.md Este arquivo
├── dyc.md Guia rápido (versão em linguagem simples), iniciantes comecem por aqui
├── LICENSE Licença upstream
├── NOTICE Declaração de atribuição upstream
├── SHA256SUMS.txt Valores de verificação dos três artefatos em release_build/
│
├── src/ Código-fonte para compilação
│ ├── exploit-fanout-miro.c
│ ├── exploit-rotate-miro.c
│ ├── temp-su.c
│ ├── miro-profile.h Referência de constantes (não participa da compilação)
│ ├── miro-integration.c Referência de integração (não participa da compilação)
│ └── exploit-*.c Arquivos originais upstream (entrada do gerador, não participam da compilação)
│
├── release_build/ Artefatos pré-compilados (prontos para uso)
│ ├── cve-2026-64560-fanout
│ ├── cve-2026-64560-rotate
│ └── su
│
├── docs/
│ ├── 01-build.md Como compilar
│ ├── 02-usage.md Como usar no adb shell
│ ├── 03-tokens.md Tabela de consulta rápida dos tokens de saída
│ ├── 04-troubleshooting.md Solução de problemas e explicação de riscos
│ ├── 05-technical.md Explicação técnica da portabilidade
│ └── UPSTREAM.md Origem upstream
│
└── tools/ Scripts de build e ferramentas de reprodução/diagnóstico (não participam da exploração)
├── build.sh Compilação com um clique (sh tools/build.sh)
└── *.py Scripts de reprodução / diagnóstico
Veja docs/02-usage.md.
Primeiro confirme que os artefatos estão íntegros:
sha256sum -c SHA256SUMS.txt # Linux / macOS
certutil -hashfile <arquivo> SHA256 # Windows, verifique um por um
Veja docs/01-build.md.
É necessário o Android NDK (não é possível usar o gcc do sistema, o motivo está nesse documento). A forma mais prática é
usar o script incluído no repositório, que localiza o NDK sozinho, escolhe a toolchain correta, compila e compara os hashes
um a um com SHA256SUMS.txt:
sh tools/build.sh # compilar + verificar
sh tools/build.sh --no-check # apenas compilar
O script apenas compila, não toca no dispositivo, não faz push, não executa o exploit.
Se não quiser usar o script, também pode digitar manualmente os três comandos clang, gerando
cve-2026-64560-fanout, cve-2026-64560-rotate e su.
Após a compilação, compare se os bytes são idênticos aos de release_build/:
sha256sum build/* # compare com os três valores em SHA256SUMS.txt
O único critério de sucesso é abrir um novo adb shell e conseguir obter uid=0 atravé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
Observe context=u:r:shell:s0 —— identidade root mas mantendo o domínio shell, isso é por design,
não é um erro.
Os tokens-chave que aparecerão durante o processo (tabela completa em 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
A taxa de sucesso não é 100%. Na fase Stage0, a taxa de acerto único medida é de cerca de 1/5, por isso o programa, por padrão, tenta novamente 32 vezes em cada fase. Toda a cadeia é probabilística.
Uma falha pode se manifestar como travamento. É necessário segurar o botão de energia para forçar a reinicialização. Após reiniciar, o estado do kernel é completamente limpo e você pode tentar novamente.
Após o sucesso, dois estados permanecem até a reinicialização:
/data/local/tmp/su se torna um daemon que concede root para qualquer identidade shellVeja como limpar no final de docs/02-usage.md.
O permissive não é um bug residual, mas sim o pré-requisito para carregar módulos do kernel (KernelSU LKM etc.). Detalhes em
docs/04-troubleshooting.md.
dada): autor do repositório upstreammiro): veja CHANGELOG| Item | Valor |
|---|
| Modelo | Redmi K80 Pro (ro.product.device = miro) |
| Fingerprint | 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 |
| Data de build do kernel | Thu Jun 4 03:48:35 UTC 2026 |
| Tamanho de página | 4096 (4K) |