Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
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.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
ghostlock-k419-adapter — GhostLock (CVE-2026-43499) adattatore per kernel Android 4.19.152-perf+ | Kitploit
Strumenti/GitHubGitHub/xiaobailovesstirring/ghostlock-k419-adapter
Sicurezza AndroidEscalation di PrivilegiFramework di ExploitExploitPost-ExploitPenetration TestingSicurezza MobileSviluppo PayloadBinary Exploitation

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
GitHubxiaobailovesstirring/ghostlock-k419-adapter

ghostlock-k419-adapter

GhostLock (CVE-2026-43499) adattatore per kernel Android 4.19.152-perf+

Vedi Repository
1 giorno faNon ancora revisionato

GhostLock — Jailbreak per Bootloader Bloccato OnePlus

Exploit del kernel per dispositivi OnePlus/OPPO/realme con bootloader bloccato. Ottiene la root + installazione di KernelSU senza sbloccare il bootloader o modificare l'immagine di boot. Rilevamento automatico a runtime della versione del kernel con tabella di offset multi-dispositivo.

GhostLock in esecuzione su OnePlus Ace 6T con KernelSU (LKM, modalità Jailbreak)

Vulnerabilità

CVE-2026-43499 — Futex PI (Priority Inheritance) Use-After-Free

Colpisce il kernel Linux 2.6.39 ~ 7.1. Corretto nel mainline 7.1 (commit 3bfdc63936dd). Android GKI 6.12.x rimane vulnerabile.

La syscall pselect6 copia i dati fd_set sullo stack del kernel. Quando combinata con il meccanismo futex PI waiter, un frame di stack liberato può essere riutilizzato come struttura rt_mutex_waiter. Il ribilanciamento dell'albero rb durante la scansione della catena PI scrive quindi valori controllati a indirizzi arbitrari del kernel.

Dispositivi Supportati

Verificati

Offset Estratti (in attesa di test sul dispositivo)

DispositivoSoCKernelNote
OnePlus 15T (PLZ110)SM88456.12.38-...-ab14552068Stesso kernel di Ace 6T. QEMU ha verificato SP diff=-64.

Non Realizzabile (layout dello stack incompatibile)

L'overlay dello stack pselect funziona solo quando il rt_mutex_waiter liberato ricade nella regione controllabile dall'utente del buffer stack_fds. La posizione del waiter è determinata dall'output del compilatore (PGO + LTO), non dalla versione del kernel. Vedere Layout dello Stack per i dettagli.

Flusso dell'Exploit

Due percorsi di root, selezionati automaticamente in base alle capacità del dispositivo:

Percorso A: Root UMH (preferito, dispositivi con ashmem C)

Richiede off_ashmem_misc_fops != 0 (ashmem C con miscdevice statico in BSS).

root@kitploit:~
PI write (mode=4)  →  redirect miscdevice fops to fake fops (via W0 pi_tree)
                      configfs r/w established
                   →  pipe physrw (1-byte precise kernel r/w)
                   →  SELinux enforcing = 0 (single byte, no policycap corruption)
                   →  UMH: inject work_struct into system_unbound_wq
                      kernel executes /data/local/tmp/a/e --umh as UID 0
                   →  root script → ksud late-load → KSU installed

Vantaggi rispetto al Percorso B:

  • Scrittura SELinux a 1 byte — non corrompe selinux_state.policycap (risolve i problemi di rete su OnePlus 13)
  • Nessun perf_event_open — funziona sotto restrizioni seccomp
  • Nessuna patch alle credenziali — evita di modificare la task_struct in esecuzione

Attualmente disponibile su: OnePlus 13 (kernel 6.6, ashmem C). Non disponibile su dispositivi con ashmem Rust (6.12 GKI) — il miscdevice è allocato sullo heap, l'indirizzo non è prevedibile in fase di compilazione.

Percorso B: Scrittura PI Diretta (fallback, tutti i dispositivi)

Usato quando gli offset UMH o i misc_fops dell'ashmem C non sono disponibili.

root@kitploit:~
Write 1 (mode=1)  →  SELinux enforcing = 0
                      (low byte of kernel ptr = 0x00, 8-byte write)

Write 2 (mode=2)  →  task->cred = init_cred
                      (uid=0, all capabilities)

Root shell         →  ksud late-load (KernelSU LKM)
                   →  su -c load_policy (fix SELinux policycap)
                   →  dynamic manager registration

Modalità Bootstrap (telefono autonomo)

root@kitploit:~
App (seccomp)  →  Write 1 (no perf needed)
               →  mini-adb connect TCP (port from /data/local/tmp/a/adb_port, default 5555)
               →  adb shell: full exploit (perf works, no seccomp)
               →  root → KSU → network fix

Avvio Automatico (tramite integrazione ReSukiSU)

root@kitploit:~
BOOT_COMPLETED → BootCompletedReceiver
  ├─ su available → skip (soft reboot / already rooted)
  └─ no root → GhostlockService → setsid exploit --bootstrap

Fattibilità del Layout dello Stack

Con NFDS=320, core_sys_select del kernel alloca un buffer stack_fds di 256 byte:

root@kitploit:~
stack_fds:  0    5    10   14 | 15   20   25   29
            ├─in─┤─out─┤─ex──┤ ├res_in┤res_out┤res_ex┤
            ◄── USER CONTROLLED ──►│◄── KERNEL ZEROED ──►

L'exploit scrive campi fittizi del waiter (task, lock) nelle bitmap di input fd_set. Perché funzioni, i campi task e lock del waiter devono ricadere nella zona controllabile (word 0-14).

root@kitploit:~
Ace 6T ✅ (waiter at word 2):
  ░░████████████████░░│░░░░░░░░░░░░░░░░░░
    ▲waiter      t  l │
    task/lock controllable

RMX5070 ❌ (waiter at word 13):
  ░░░░░░░░░░░░░████│██████████████░░░░░░
                 ▲  │    t     l
               waiter  task/lock ZEROED

Regola di fattibilità: waiter word + 11 (offset di lock in rt_waiter_node) deve essere ≤ 14. La word massima di waiter fattibile è 3.

La posizione del waiter è determinata dal layout dei frame di stack del compilatore (profili di ottimizzazione PGO + LTO + BOLT), che varia in base al ramo del SoC. La stessa versione del kernel può avere layout diversi su SoC diversi.

kernel_phys_load

Tutte le scritture sul kernel passano attraverso l'alias linear-map dell'immagine:

root@kitploit:~
data_addr(x) = PAGE_OFFSET + (kernel_phys_load - PHYS_OFFSET) + (x - KIMAGE_TEXT_BASE)

Il bootloader sceglie kernel_phys_load, quindi varia in base al SoC e non è presente in boot.img né nel DT. Campo per-dispositivo in struct kernel_offsets; 0 = usa il valore predefinito di target.h.

SoCkernel_phys_load
SM8845 (Ace 6T, 15T)0xa8000000
SM8750 (OnePlus 13, OPPO Pad 4 Pro)0xa8000000
SM8850 (OnePlus 15, Xiaomi 17)0xc7800000

Un valore errato fallisce silenziosamente — la scrittura finisce comunque nella RAM mappata, quindi non c'è crash e nessun effetto. Non confonderlo con un problema di PSELECT_SHIFT. Leggilo su un dispositivo rooted dello stesso modello (Kernel code inizia a _stext; _text è più in basso di 0x10000):

root@kitploit:~
su -c 'grep -i "Kernel code" /proc/iomem'   # c7810000-... -> 0xc7800000

PSELECT_SHIFT

Kernel diversi posizionano il waiter in posizioni diverse all'interno della zona controllabile. Usa PSELECT_SHIFT per regolare:

root@kitploit:~
# Default (Ace 6T + OnePlus 15, 6.12): shift=0
/data/local/tmp/a/e

# OnePlus 13 (6.6): shift=-2
PSELECT_SHIFT=-2 /data/local/tmp/a/e

# Override kernel_phys_load for new SoCs (when /proc/iomem is not accessible):
KPHYS=0xc7800000 /data/local/tmp/a/e

Il waiter word di check_feasibility.py è inaffidabile: l'aritmetica sui frame è corretta, ma gli offset delle struct che deduce dagli zero-store non lo sono (su OnePlus 15 restituisce word 3; il valore misurato è word 2). Uno shift errato costa un kernel panic per tentativo, quindi misuralo su un dispositivo rooted:

root@kitploit:~
echo 'p:ds do_select fdsin=+0(%x1)' >> /sys/kernel/tracing/kprobe_events
echo 'p:rw rt_mutex_wait_proxy_lock waiter=%x2' >> /sys/kernel/tracing/kprobe_events
# trigger FUTEX_CMP_REQUEUE_PI, then:
#   PSELECT_SHIFT = ((waiter & 0x3fff) - (fdsin & 0x3fff)) / 8 - 2

Compilazione

root@kitploit:~
NDK=/path/to/android-ndk
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android35-clang \
  -O2 -Wall -Isrc/core -Isrc/devices -DTARGET_CONFIG_H="target.h" \
  src/core/main.c src/core/util.c src/core/slide.c \
  src/core/fops.c src/core/pipe_physrw.c src/core/root.c \
  src/core/miniadb.c src/core/umh_root.c \
  -o ghostlock -fPIE -pie -pthread

Prerequisiti

ksud (richiesto per l'installazione di KSU)

GhostLock fornisce solo la root. L'installazione di KernelSU dipende da ksud — un binario che contiene moduli kernelsu.ko integrati per ogni versione KMI. Lo script di root trova ksud sul dispositivo e chiama ksud late-load --kmi android16-6.12.

Senza ksud, l'exploit ottiene la root (uid=0) ma KSU non verrà installato e su non persisterà.

Configurazione (una tantum)

root@kitploit:~
# Enable ADB TCP (use any port)
adb tcpip 5555

# Push exploit binary and ADB key
adb push ghostlock /data/local/tmp/a/e && adb shell chmod 755 /data/local/tmp/a/e
adb push ~/.android/adbkey /data/local/tmp/a/adbkey

# If using a non-default ADB port (e.g. 23946):
adb shell "echo 23946 > /data/local/tmp/a/adb_port"

Dopo il primo jailbreak riuscito, persist.adb.tcp.port viene impostato tramite resetprop — i riavvii successivi sono completamente automatici.

Utilizzo

root@kitploit:~
/data/local/tmp/a/e                        # Full exploit (adb shell)
/data/local/tmp/a/e --bootstrap            # Phone standalone (app context)
/data/local/tmp/a/e --write1               # SELinux disable only
PSELECT_SHIFT=-2 /data/local/tmp/a/e       # Override stack layout shift

Importante: esegui entro 30 secondi dall'avvio per la migliore affidabilità di temporizzazione di KernelSnitch.

Aggiungere Nuovi Dispositivi / Versioni del Kernel

È necessario solo boot.img — nessuna root, nessun accesso al dispositivo richiesto.

Estrarre gli offset da boot.img

root@kitploit:~
# 1. Extract kernel
python -c "import struct; d=open('boot.img','rb').read(); open('kernel','wb').write(d[4096:4096+struct.unpack_from('<I',d,8)[0]])"

# 2. Global symbols (kallsyms)
python tools/extract_target.py    # 28 offsets, auto-validated

# 3. Struct fields (BTF)
python tools/extract_btf.py kernel  # 57 offsets, auto-validated

# 4. Add to offsets.h, rebuild

Copertura: 103/103 offset da boot.img

Adattamento a dispositivi non OnePlus

Il nucleo dell'exploit è indipendente dal dispositivo. L'adattamento può richiedere:

  • VA_BITS diverso (48 vs 39) → aggiornare il layout di memoria in target.h
  • kernel_phys_load diverso → leggere da /proc/iomem o usare la variabile d'ambiente KPHYS=
  • Parametri di temporizzazione diversi → regolare common.h
  • Implementazione ashmem diversa (C vs Rust) → l'ashmem C abilita il percorso UMH; l'ashmem Rust ricade su W1+W2
  • PSELECT_SHIFT diverso → determinarlo tramite test kprobe in QEMU
  • Offset delle struct diversi (6.6 vs 6.12) → usare STRUCT_OFFSETS_6_6 o STRUCT_OFFSETS_6_12 nella voce del dispositivo

Requisiti della root UMH

Il percorso di root UMH (call_usermodehelper) richiede:

  • off_system_unbound_wq e off_call_usermodehelper_exec_work da kallsyms
  • off_ashmem_misc_fops = ashmem_misc + 0x10 (solo ashmem C, miscdevice.fops in BSS)
  • L'ashmem Rust (GKI 6.12) alloca il miscdevice sullo heap → indirizzo non prevedibile → UMH non disponibile

File

Licenza

Solo per ricerca sulla sicurezza autorizzata e scopi educativi.

Scarica lo strumento
DispositivoSoCKernelStato
OnePlus Ace 6T (PLR110)SM88456.12.38-...-ab14275539Funzionante
OnePlus Ace 6T (PLR110)SM88456.12.38-...-ab14552068Funzionante
OnePlus 15 (CPH2749)SM88506.12.23-...-ab14541642Funzionante
Xiaomi 17 (pudding)SM88506.12.23-...-abogki463945075Funzionante
Xiaomi 17 (pudding)SM88506.12.69-...-abogki514973465Funzionante (aggiornamento di agosto 2026)
OnePlus 13 (IN2060)SM87506.6.89-...-abogki446052083Funzionante (PSELECT_SHIFT=-2)
OPPO Pad 4 ProSM87506.6.89-...-ab14358676Funzionante (PSELECT_SHIFT=-2)
DispositivoSoCKernelMotivo
OPPO Find X9 UltraSM87506.12.58-android16-6PGO elimina il frame do_futex → SP diff=+32, waiter word=14. Non esiste uno shift sicuro.
OPPO Find X7—6.1.1576.1 GKI: waiter a word 13 (tutti i dispositivi 6.1 OPLUS/GKI)
realme RMX5070SM66506.1.1416.1 GKI: waiter a word 13
realme RMX3852SM86356.1.141Stesso ramo 6.1 di RMX5070
OnePlus 13R / Ace 5SM86506.1.xStesso ramo 6.1
OnePlus 12SM86506.1.1416.1 GKI: do_futex inline con PGO, waiter word=13/19
OPPO Pad 5 (OPD2502)MT68786.1.134Stesso ramo 6.1
OPPO PKW110—5.15.180Frame do_futex 0x140 (4,5x normale) → waiter word=-29, irraggiungibile
Motorola Edge 60 FusionMT68786.1.1456.1 GKI: waiter a word 13 (non OPLUS, stesso risultato)
iQOO Z9 5G—5.15.178Frame do_futex troppo grande, waiter irraggiungibile. Non è un dispositivo OPLUS (vivo).
Metodo
Passaggi
APK ReSukiSU (consigliato)Installa ReSukiSU o questo fork. La release ufficiale include libksud.so.
Release CIScarica ksud-aarch64-linux-android.zip da ReSukiSU CI
FonteConteggioMetodo
kallsyms (simboli globali)28extract_target.py
BTF (campi delle struct)57extract_btf.py
Derivati (stessa struct, uso diverso)9Automatico
Costanti (valori fissi)12Nessuna estrazione necessaria
FileDescrizione
src/core/main.cPunto di ingresso dell'exploit, Write 1/2, percorso UMH, bootstrap, script di root
src/core/fops.cPercorso pselect, meccanismo di scrittura PI, stadio CFI
src/core/util.cHeap spray, kernelsnitch, slab drain, preparazione del payload
src/core/pipe_physrw.cLettura/scrittura della memoria fisica basata su pipe buffer (potenzia la r/w di configfs)
src/core/umh_root.cRoot UMH tramite iniezione su workqueue + handler --umh
src/core/miniadb.cClient ADB mini (TCP + autenticazione RSA)
src/core/common.hParametri di temporizzazione, macro
src/core/target.hLayout di memoria, valori predefiniti dei campi delle struct (6.12)
src/core/runtime_struct_offsets.hOverride per-dispositivo dei campi delle struct (6.6 vs 6.12)
src/devices/offsets.hAggrega tutte le tabelle di offset dei dispositivi + macro STRUCT_OFFSETS_*
src/devices/<device>/offsets.hVoci di offset del kernel per-dispositivo
src/core/slide.cLeak dell'indirizzo del kernel SLIDE
src/core/root.cConfigurazione della shell di root (patch diretta delle credenziali tramite pipe physrw)
tools/extract_target.pyEstrazione degli offset da kallsyms
tools/extract_btf.pyEstrazione degli offset delle struct da BTF
tools/check_feasibility.pyVerifica della fattibilità del layout dello stack