Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
ghostlock-sabrina — CVE-2026-43499 exploit root GhostLock per Chromecast con Google TV (sabrina) | Kitploit
Strumenti/GitHubGitHub/k-o-n-t-o-r/ghostlock-sabrina
Sicurezza AndroidSicurezza Sistemi EmbeddedEscalation di PrivilegiAnalisi delle VulnerabilitàExploitSicurezza Hardware e IoTPaper e RicercaSviluppo PayloadBinary Exploitation
GitHubk-o-n-t-o-r/ghostlock-sabrina

ghostlock-sabrina

113731 mese faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-43499 exploit root GhostLock per Chromecast con Google TV (sabrina)

Vedi Repository

GhostLock Sabrina

Exploit root per Chromecast con Google TV (sabrina) tramite CVE-2026-43499 -- una use-after-free nel sottosistema futex PI (priority inheritance) del kernel Linux.

Ottiene root su un dispositivo con bootloader bloccato che esegue Android 14 con kernel 5.15.170 (PGO+BOLT+LTO, clang 17).

La vulnerabilità

GhostLock sfrutta un bug in remove_waiter() chiamato dal percorso di rollback -EDEADLK in rt_mutex_start_proxy_lock(). La funzione azzera current->pi_blocked_on (quello del requeuer, già NULL) invece di quello del task waiter. Il pi_blocked_on del waiter non viene mai azzerato, lasciando un puntatore pendente a un rt_mutex_waiter liberato sullo stack del kernel.

Una successiva sched_setattr attiva rt_mutex_adjust_pi -> rt_mutex_adjust_prio_chain, che segue il puntatore pendente e percorre una catena PI su dati controllati dall'attaccante in una pagina heap riallocata -- fornendo una primitiva di scrittura arbitraria tramite rb_erase.

Catena di exploit

FaseTecnica
Leak KASLRperf_event_open con PERF_SAMPLE_IP (vincolato al TID) — l'IP minimo del kernel è in .entry.text (+0x10000), _text è allineato a 2MB e lo slide KASLR è un multiplo di 2MB, quindi min_ip & ~0x1fffff recupera esattamente il _text a runtime
Leak task structperf_event_open con PERF_SAMPLE_REGS_INTR (vincolato al TID, modalità degli indirizzi della mappa lineare)
Validazione della symbol tableI campioni perf di &init_user_ns dagli argomenti di registro di security_capable() durante una raffica di setpriority(-20) vengono confrontati con kaslr_base + off_init_user_ns — dimostra che il layout .data/.bss del kernel in esecuzione corrisponde alla tabella degli offset prima di qualsiasi scrittura cieca
Leak mm_structKernelSnitch -- side-channel temporale su collisione dell'hash futex
Heap sprayCoreografia di scarto SLUB (memfd-close, overflow CPU-partial) + recupero di pagine di ordine 2 tramite io_uring_setup(256)
Sovrapposizione dello stackAF_UNIX SOCK_SEQPACKET sendmsg -- move_addr_to_kernel copia 128 byte di sockaddr sullo stack del kernel, sovrapponendosi ai campi task/lock/prio del waiter pendente
Trigger del walksched_setattr con scala nice monotona (7 -> 14 -> 19) attiva il walk della catena PI, uno per ogni round di sovrapposizione
Primitiva di scritturarb_erase Caso 1: `{pc=(TARGET-8)
Disattivazione SELinux (walk 0)Zero a 8 byte su selinux_state azzera enforcing, checkreqprot, initialized e policycap[0..4] — avc_denied() non nega mai (enforcing=0) e security_compute_av() va in cortocircuito verso allow-all (!initialized), quindi il kernel-SID post-swap (u:r:kernel) smette di avere importanza
Scambio credenziali (walk 1+2)task->cred = fake_cred e task->real_cred = fake_cred (uid=0, caps FULL, user_namespace fittizio autocontenuto sulla pagina dello spray; entrambe le scritture necessarie — commit_creds() all'exec va in BUG_ON a meno che cred == real_cred)
Batteria di test rootsonde solo raw-syscall (uid/SELinux//proc/1//dev/kmsg/wifi/pacchetti//data/data/kallsyms) in /data/local/tmp/.ghostlock_out
Shell rootexecve("/system/bin/sh") — commit_creds nel percorso di exec copia fake_cred in una credenziale slab pulita; vincolata al fatto che tutte le cancellazioni pianificate siano andate a segno

Innovazioni chiave

  • SIGUSR1 walk-before-cleanup: l'overlay SEQPACKET viene eseguito all'interno di un signal handler che interrompe l'attesa futex, quindi le percorrenze della catena PI scattano prima che il percorso di cleanup del futex possa contendere gli spinlock della pagina spray (elimina il blocco del qspinlock MCS)
  • Tre scritture da un singolo reclaim (modalità 7): SELinux-off + cred + real_cred scattano tutti contro la stessa pagina reclamata tramite round di retry dell'overlay sulla stessa pagina, consumando esattamente i tre gradini della scala nice — i dadi del heap-reclaim vengono lanciati una sola volta per l'intera catena
  • SELinux off tramite zero-write: la primitiva rb_erase con rb_right = 0 esegue un singolo store pulito di 8 byte a zero su un indirizzo kernel arbitrario (nessuno store collaterale, nessuna dereferenziazione selvaggia); azzerare il primo qword di selinux_state produce il doppio permissive (enforcing=0 + !initialized → allow-all), che sblocca tutto l'I/O su file post-root nonostante il SID del kernel
  • Validazione dei simboli lato device: la tabella degli offset proviene da un vmlinux di riferimento, ma il kernel del device è compilato con una toolchain diversa — prima della scrittura cieca su SELinux, l'exploit effettua un perf-leak di &init_user_ns dal percorso live di security_capable() e interrompe verso il flusso solo-cred a meno che non corrisponda a kaslr_base + off_init_user_ns
  • user_namespace fittizio: un namespace autocontenuto sulla pagina spray con mappe uid/gid identità e ucounts = NULL -- cap_capable trova corrispondenza alla prima iterazione e inc_rlimit_ucounts termina dopo un solo ciclo, eliminando la necessità di fare leak di &init_user_ns
  • Campionamento perf vincolato al TID: i filtri PERF_SAMPLE_TID garantiscono che vengano conteggiati solo gli snapshot dei registri del thread chiamante, impedendo ai servizi di sistema più attivi di dominare il voto della modalità

Target

  • Device: Chromecast con Google TV (sabrina), Amlogic S905X3 (4x A55), 2 GB RAM
  • Kernel: 5.15.170-android14-11-gf4a1f03072af (aarch64, PGO+BOLT+LTO, clang 17.0.2)
  • Android: 14, build UTTC.250917.004, patch di sicurezza 2025-10-01
  • Config: CONFIG_FUTEX_PI=y, CONFIG_IO_URING=y, perf_event_paranoid=-1, SELinux enforcing, panic_on_oops=1, nessun user namespace

Compilazione

export ANDROID_NDK_HOME=/path/to/android-ndk
make -j$(nproc)

Richiede l'Android NDK (testato con r27). Produce un binario aarch64 collegato staticamente.

Utilizzo

adb push ghostlock /data/local/tmp/
adb shell "cd /data/local/tmp && ./ghostlock --cred"

L'exploit richiede circa 25 secondi (leak di KASLR/task/layout + heap spray + bruteforce di KernelSnitch + tre round di overlay da 3 secondi). In caso di successo scrive la batteria root in /data/local/tmp/.ghostlock_out, il marker in /data/local/tmp/.ghostlock_root, ed esegue /system/bin/sh con uid=0 sotto un kernel permissivo.

Parametri di ambiente:

  • GHOST_SELINUX=0 — salta la scrittura SELinux, esegue il percorso cred-only collaudato (modalità 6)
  • GHOST_SELINUX_FORCE=1 — attiva la scrittura SELinux anche se la validazione del layout dei simboli del dispositivo fallisce
  • GHOST_EXEC=0 — scrive la batteria ed esce con exit(99) invece di eseguire una shell
  • CRED_ATTEMPTS=n — tentativi di full-spray quando un'esecuzione non riesce a recuperare la memoria (default 3)

Paternità

Questo exploit è stato portato e sviluppato da Claude Opus 4.6 (Anthropic) con GLM-5.3 (Z.ai) come consulente per lo sfruttamento del kernel.

Riferimenti

Scarica lo strumento