
GhostLock (CVE-2026-43499) fork d'exploit pour RootMyVivo Neo — iQOO Neo 11 (PD2520, SM8750, 6.6.89). Pour la recherche autorisée sur ses propres appareils uniquement.
Fork de boxiaolanya2008/CVE-2026-43499-Neo11Plus, retravaillé pour RootMyVivo Neo : tout ce qui n'est pas nécessaire à notre scénario a été retiré, le noyau de l'exploit éprouvé est conservé sans modification des timings.
| Composant | Raison |
|---|---|
| Changement de fond d'écran + kill de system_server | principale source de soft reboot « spontanés » et de changement de fond d'écran après le root |
| démon io (port 39555) | nécessaire uniquement au kernelapp de débogage ; l'application fonctionne via su |
| overlay tmpfs sur /apex/com.android.virt/bin | pouvait figer zygote/system_server lors d'un soft reboot (écran noir) |
| Installation de su dans le mount-namespace adbd | l'application appelle /data/local/tmp/su par chemin complet |
| Service boot 10-neo11-su.sh | la persistance est assurée par l'application : persist.adb.tcp.port + adb_keys + ksud |
| Tables d'offsets des autres appareils | uniquement PD2520-BP2A.250605.031.A3 |
| kernelapp (app/) | remplacé par les fonctionnalités de l'application |
panic_on_oops=0, panic_on_warn=0 (protection contre les panics),
kptr_restrict/dmesg_restrict, empoisonnement AVC (permissive sans casser policycap)/system/bin/su, quand celui-ci apparaîtL'exploit dépose /data/local/tmp/su (0755, root:root, contexte system_file)
et démarre le démon avec le socket /data/local/tmp/temp_su.sock.
L'application appelle su par chemin complet — /apex n'est pas touché du tout.
cd exploit
PATH=/data/data/com.termux/files/usr/bin:$PATH \
make HOST_CLANG=/data/data/com.termux/files/usr/bin/clang \
NDK_ROOT=/root/android-sdk/ndk/26.1.10909125
build/PD2520-BP2A.250605.031.A3/bin/preload.so (~140 Ko)
et build/embed/su_daemon_aarch64_pie (su, ~11 Ko)6.6.89-android15-8-g1f71897ac249-abogki467805059-4k (offsets issus
de kallsyms+BTF de ce boot.img ; changement de noyau = régénération de target.h)cd /data/local/tmp/rmv && LD_PRELOAD=$PWD/preload.so /system/bin/trueRMV_ATTEMPTS=N — nombre de tentatives complètes (par défaut 3)RMV_RETRY_DELAY=N — pause entre les tentatives en secondes (par défaut 8)NEO11_* — les réglages upstream (delay/nice/attempts) sont conservés| Mécanisme | Ce qu'il fait | Ce contre quoi il protège |
|---|
| safety_quiesce | avant la route PI, attend loadavg < 4 (jusqu'à 10 s) | waiter dans une frame étrangère → panic sous forte charge système |
| cred-guard | avant l'écriture de cred, vérifie que les pointeurs sont des adresses kernel canoniques | écriture d'un pointeur poubelle → corruption instantanée de task_struct → panic |
| cycle de retry | jusqu'à 3 passes complètes (chacune dans un fork frais) avec pause de 8 s | loterie de timing : la deuxième tentative passe souvent, l'upstream abandonnait simplement |
| spin adaptatif | threads consumer : 200 itérations yield → nanosleep(0.2 ms) | 100% CPU pendant toute la durée de l'exploit |