
GhostLock (CVE-2026-43499) pour le Galaxy S25 FE (W.I.P)
CVE-2026-43499 porté sur la série Samsung Galaxy S26 — Android 16 / GKI 6.12. Un seul binaire, trois lignes de noyau, correspondance dynamique des paramètres à l'exécution : couvre théoriquement toute la série S26 sans compilation par build.
La plupart des efforts de portage de GhostLock ciblent un seul appareil ou un seul firmware. Ce dépôt est un portage neuf qui réécrit chaque mécanisme pour la cible S26 et devrait couvrir toute la famille.
En maintenant snothin/CyberMeowfia, j'ai constaté que le canal physrw par pipe d'origine était instable (il coupait le réseau), donc j'ai abandonné cette voie et exploré des alternatives. Plus tard, j'ai découvert que monovibe était allé plus loin sur le chemin que j'explorais, j'ai adopté l'approche, et après de nombreux débogages, ce dépôt a pris forme.
uid=0(root) context=u:r:kernel:s0 ; shell
root persistant via su_daemon sur un socket unix abstrait.work_struct sur
system_unbound_wq dont la fonction est call_usermodehelper_exec_work, donc le noyau
exécute notre démon avec les creds d'init. La protection EL2 de KDP sur les pages de credentials n'est
jamais déclenchée.course pselect + futex PI
→ une écriture qword alignée par cycle
→ porteur attr (deux faux fds misc)
le fd contrôleur redirige le pointeur de données
le fd de données lit/écrit n'importe quelle adresse noyau
→ oracle de glissement (tracefs)
→ root UMH (injection workqueue)
system_unbound_wq
tempête d'ouvertures/fermetures ptmx réveille un worker
le noyau exécute le démon avec les creds d'init
→ contournement DEFEX (bind-mount)
→ su_daemon écoute sur /data/local/tmp/temp_su.sock
Les paramètres sont associés par ligne de noyau (trois lignes : cn, intl, exynos), pas
par build individuel. Les builds OTA inconnus retombent sur la ligne connue la plus proche par modèle
et CSC. Les modèles totalement inconnus sont rejetés (échec fermé). La liste de builds intégrée
fait autorité dans exploit/src/params_table.c.
Voir PORTING.md pour les paramètres nécessaires lors d'un portage vers un nouvel
appareil ou firmware.
Nécessite le NDK Android (r26+). Il suffit d'exécuter :
cd exploit
make preload
# produit build/bin/preload.so (exploit) et build/embed/su_daemon_aarch64_pie (démon intégré)
Poussez preload.so, su_daemon_aarch64_pie et ksud sur l'appareil (exécuté depuis une
session shell adb, uid 2000) :
adb push exploit/build/bin/preload.so /data/local/tmp/
adb push exploit/build/embed/su_daemon_aarch64_pie /data/local/tmp/cve-2026-43499-root
adb push <ksud> /data/local/tmp/ksud
adb shell chmod 755 /data/local/tmp/cve-2026-43499-root /data/local/tmp/ksud
# Tentative unique :
adb shell "env LD_PRELOAD=/data/local/tmp/preload.so sh"
L'exploit est probabiliste (une course) et nécessite généralement plusieurs tentatives. Lors d'une
exécution réussie, su_daemon écoute sur /data/local/tmp/temp_su.sock, et n'importe quel
processus local peut s'y connecter.
La garde de revendication de boot (/data/local/tmp/ghostlock-boot.log) enregistre le résultat de
chaque exécution par boot ; une seconde exécution complète de la chaîne dans le même boot est rejetée
(elle peut faire planter l'appareil). Supprimez le fichier ou définissez BOOT_FORCE=1 pour passer outre.
exploit/src/kernelsnitch/)Ce dépôt est publié sous la licence Apache-2.0 ; voir LICENSE pour le texte complet et NOTICE pour la provenance du code.
| Modèle | Nom de code appareil | Builds testés |
|---|
| SM-S942x (S26 Snapdragon) | m1q | S9420ZCS4AZG1, S942QOPU1AZDE, S942U1UES4AZG3, S942USQS4AZG3 |
| SM-S947x (S26+ Snapdragon) | m2q | S9470ZCS4AZG1, S947USQS4AZG3 |
| SM-S9480 (S26 Ultra CN) | m3q | S9480ZCS3AZF1, S9480ZCS4AZG1 (build testé) |
| SM-S948x (S26 Ultra) | m3q | S9480ZHS4AZG1, S948BXXS4AZG5/6, S948NKSS4AZG3, S948U1UES2AZE1, S948USQS4AZG3 |
| SM-S942B (S26 Exynos) | m1s | S942BXXS4AZG5 |
| SM-S947B (S26+ Exynos) | m2s | S947BXXS3AZF1, S947BXXS4AZG5 |