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
mt6985-CVE-2026-43499 — CVE-2026-43499 adattatore di exploit per MT6985 MediaTek Dimensity 9300 (vivo PD2241) | Kitploit
Strumenti/GitHubGitHub/233laoliu/mt6985-cve-2026-43499
Framework di ExploitAnalisi delle VulnerabilitàExploitReverse EngineeringInformatica ForenseSicurezza MobileAnalisi del FirmwareBinary Exploitation
GitHub233laoliu/mt6985-cve-2026-43499

mt6985-CVE-2026-43499

CVE-2026-43499 adattatore di exploit per MT6985 MediaTek Dimensity 9300 (vivo PD2241)

Vedi Repository
1111 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

Registro di fallimento CVE-2026-43499: tentativo di adattamento MT6985

Conclusione: spesi 68M token, nessun root ottenuto.
Motivo: l'attacco di timing KernelSnitch non è affidabile su MTK Dimensity 9200, CONFIG_PANIC_ON_OOPS=y non lascia spazio a tentativi ed errori.
Questo articolo documenta l'intero processo di difficoltà incontrate, come riferimento per evitare le stesse trappole.


Contesto

ProgettoValore
Dispositivovivo PD2241 (Dimensity 9200 / MT6985), Android 15
FirmwarePD2241_A_15.2.10.2.W10.V000L1
Kernel5.15.178-android13-8-gfb31f5bdd612-dirty
BootloaderBloccato (ro.boot.flash.locked=1)
SELinuxEnforcing
panic_on_oopsAttivo → qualsiasi OOPS del kernel = riavvio immediato
ExploitCyberMeowfia — CVE-2026-43499 (IonStack)
Albero sorgenteandroid_15.0_kernel_MT6985 (5.15.178) — non corrisponde alla versione del dispositivo (sorgente è android15 GKI, il dispositivo esegue android13 GKI)

Cosa è stato fatto

1. Analisi del codice sorgente → estrazione degli offset delle strutture

Estratto da arch/arm64/include/asm/memory.h + include/linux/fs.h + android/abi_gki_aarch64.xml:

  • Layout di memoria: KIMAGE_TEXT_BASE = 0xffffffc008000000, VA_BITS=39, DIRECT_MAP=256GB
  • task_struct: 36864 bit, completamente analizzato (ABI XML layout-offset-in-bits)
  • file_operations: nessun iopoll (android13 GKI), IOCTL=0x48, open=0x68
  • cred: atomic_t usage = 4 byte, uid=0x04
  • struct page: 64 byte, slab_cache=0x18

Scoperta chiave: il sorgente è android15 GKI, il dispositivo è android13 GKI — gli offset di task_struct differiscono di 0x40~0x88 byte, non si possono copiare direttamente dal sorgente.

2. Decompressione del firmware → estrazione dei simboli

root@kitploit:~
OTA zip (8.3GB)
  → payload.bin (8.2GB)
    → payload_dumper → boot.img (96MB, header v4)
      → decompressione LZ4 → Image (50MB ARM64)
        → kallsyms-finder → 187810 simboli

Simboli estratti da due versioni di firmware (15.2.7.6 / 15.2.10.2) — lo stesso simbolo differisce di 10KB~200KB tra le due versioni, è necessario usare la versione corretta.

3. Verifica tramite disassemblaggio → capstone conferma gli offset critici

root@kitploit:~
# In rt_mutex_adjust_pi:
LDR x21, [x19, #0x8b0]  → pi_blocked_on = 0x8b0 (valore android15, non frankel)

Questo conferma che il layout di task_struct è il ramo android15, non l'android13 di frankel.

4. Compilazione → superata

NDK r29, make PROJECT=android_15.0_kernel_MT6985 → preload.so (150KB).

5. Esecuzione → crash ripetuti

root@kitploit:~
[+] preload starting pid=25414
[+] p0 profile ... tutti i simboli caricati correttamente
[-] KernelSnitch mm_struct leak failed     ← a volte assente (occasionalmente riuscito)
[+] slide child context route=pselect      ← avvio processo figlio per leak KASLR slide
[panic del kernel]                          ← rt_mutex_adjust_prio_chain+0x1b0

Istruzione del crash (capstone):

root@kitploit:~
ldar w8, [x27]    ; x27 = waiter->lock (caricato da [x28, #0x38])
                  ; il valore di x27 è spazzatura → nessuna mappatura nella tabella pagine → translation fault
                  ; → die() → panic → riavvio

Perché è fallito

Causa principale 1: KernelSnitch non affidabile su MTK

KernelSnitch è il punto di ingresso dell'intero exploit — sfrutta la differenza di timing nei bucket hash di futex per rivelare l'indirizzo di mm_struct:

  1. Rilevamento collisioni riuscito — trovati 5 collisioni con soglia bassa
  2. Corrispondenza bruteforce fallisce quasi sempre — il problema principale è:
root@kitploit:~
MT6985 ha CONFIG_KASAN_HW_TAGS=y → il kernel etichetta le allocazioni slab con tag MTE
il puntatore di mm_struct ha un tag KASAN → futex_hash calcola basandosi sul puntatore taggato

ma la scansione bruteforce della direct map (indirizzi untagged) → l'hash calcolato non corrisponde
anche aggiungendo l'iterazione dei tag MTE (0-14, 15 totali), su sistemi con VA_BITS=39
i bit del tag (bit56-59) si sovrappongono ai bit di estensione del segno → alcune combinazioni di tag
producono indirizzi non validi → mancato rilevamento

I dispositivi Pixel non hanno KASAN_HW_TAGS, questo meccanismo funziona. Su MTK no.

Causa principale 2: CONFIG_PANIC_ON_OOPS è il killer

root@kitploit:~
Pixel:  OOPS del kernel → dump_stack → continua → l'exploit può riprovare
MT6985: OOPS del kernel → die() → panic() → riavvio immediato → nessuno spazio per tentativi
una minima deviazione nella catena π e tutto crolla; su Pixel una deviazione significa solo
"questo tentativo non è riuscito, riprova con un altro set di indirizzi".

E il bootloader è bloccato (flash.locked=1) → non è possibile flashare un kernel personalizzato per rimuovere questa opzione.

Causa principale 3: Deriva della versione del kernel

root@kitploit:~
Albero sorgente: 5.15.178 android15 GKI
Dispositivo:     5.15.178-android13 (vendor vivo)

Sebbene il numero di versione principale sia lo stesso 5.15.178, i rami GKI differiscono (android13 vs android15), quindi il layout delle strutture critiche come task_struct/cred non è coerente. Dopo ripetuti tentativi di passare tra gli offset frankel/android15, solo il disassemblaggio ha permesso di fissare la versione corretta.


Regolazioni tentate (tutte inutili)

ModificaScopoRisultato
THRESHOLD_MULT 10→5→3Abbassare la soglia di rilevamento collisioni<5 troppi falsi positivi
APPENDED_FUTEXES 4096→8192Aumentare la differenza nella catena hashNessun effetto
REPEAT_MEASUREMENT/AVERAGEAumentare la precisione del campionamentoNessun effetto
MTE=1Far iterare i tag al bruteforcePiù lento, anzi meno crash
MM_STRUCT_SZ 0x500→0x400Correggere il passo di mm_structNecessario, l'ABI reale è 992 byte
IDENTITY_END 64GB→256GBAmpliare l'intervallo di scansioneTroppo lento (iterazione MTE), ancora nessuna corrispondenza
Offset TASK: android15↔frankelFissare gli offset correttiDisassemblaggio conferma android15
Offset FOPS: android15↔frankelandroid13 non ha iopollUsato frankel

Stato attuale di target.h

In exploit/targets/android_15.0_kernel_MT6985/target.h:

CategoriaAffidabilitàMetodo di verifica
Layout di memoriaCorrettoCalcolo da memory.h + verifica kallsyms _text
Offset simboli (22)CorrettiEstratti da boot.img 15.2.10.2
Offset task_structCorrettiABI XML + disassemblaggio capstone (pi_blocked_on=0x8b0)
Offset FOPSErrati (corretti il 2026-07-31)Valori originali copiati da frankel (android13 senza iopoll); l'ABI dell'albero sorgente ha effettivamente iopoll@0x30, ioctl=0x50, open=0x70 — vedi VERIFICATION.md
Offset CREDCorretti (verificati)ABI XML: uid=0x04, securebits=0x24, caps=0x28, security=0x78

L'assembly compila, l'esecuzione parte, si perde solo nell'ultimo chilometro.


Se vuoi continuare

Requisiti necessari (indispensabili)

  1. Rimuovere CONFIG_PANIC_ON_OOPS — o flashare un kernel personalizzato (richiede sblocco del bootloader), oppure trovare un dispositivo MT6985 con questa opzione disattivata di default
  2. Risolvere KernelSnitch — serve una calibrazione del timing della cache per MTK Dimensity 9200, oppure sostituire completamente KernelSnitch nell'exploit con un altro metodo di leak di mm_struct

Possibili approcci alternativi

  • /proc/self/pagemap — limitato su questo dispositivo (restituisce tutti zeri)
  • Interfacce di debug specifiche MTK (/proc/mtk_*) — esistono ma richiedono ulteriore analisi
  • Vulnerabilità ioctl nei driver camera/GPU MTK — percorso di privilege escalation più semplice
  • Attendere un adattamento della community per la variante MTK

Valore residuo di questo repository

  • symbols/kallsyms_PD2241_15.2.10.2.txt — tabella simboli completa della 15.2.10.2, utilizzabile direttamente da altri
  • device_config.txt — configurazione reale del kernel del dispositivo, mostra cosa ha modificato il vendor
  • exploit/targets/android_15.0_kernel_MT6985/target.h — offset delle strutture verificati
  • scripts/server_compile.py — compilazione automatizzata, ricompilazione rapida dopo modifiche ai parametri

Elenco delle trappole incontrate (per evitarle in futuro)

  1. Decompressione di file su Windows: tar -xf può fallire su zip di grandi dimensioni, usare Python zipfile o decomprimere prima manualmente
  2. Conflitto di versione protobuf in payload_dumper: il update_metadata_pb2.py generato richiede protobuf 5.x, è necessario rimuovere manualmente la riga di importazione runtime_version
  3. Eseguire direttamente ./preload.so causa segfault: è obbligatorio usare /system/bin/linker64 /data/local/tmp/preload.so
  4. L'ABI XML è più accurato del codice sorgente: layout-offset-in-bits è calcolato dal compilatore, 100 volte più preciso che contare manualmente 5000 byte
  5. Il ramo GKI influenza il layout: task_struct è diverso tra android13/14/15, non si possono copiare offset tra rami diversi
  6. Versioni firmware diverse → offset simboli diversi: 15.2.7.6 e 15.2.10.2 differiscono di 10KB~200KB
  7. Il vendor vivo ha aggiunto molti campi OEM: CONFIG_ANDROID_VENDOR_OEM_DATA=y, CONFIG_SCHED_INFO=y, CONFIG_RSC_* → devia dal GKI standard
  8. Toolchain di estrazione simboli end-to-end: boot.img → kernel.bin → decompressione LZ4 → Image → kallsyms-finder → tabella simboli

Cronologia

root@kitploit:~
07/28  Download repository CyberMeowfia + sorgente MT6985
07/29  Analisi sorgente (memory.h, fs.h, ABI XML, varie struct)
       Decompressione firmware (payload.bin → boot.img → Image)
       Estrazione simboli (kallsyms-finder → 187810 simboli)
       Molteplici cicli di compilazione + crash + verifica disassemblaggio
       5 tentativi automatici → tutti falliti
       Scrittura di questo articolo
-------------------------------------------
Totale: ~68M token, 0 shell root

2026-07-29, sopravvissuto per raccontarlo


2026-07-31 Aggiornamento: verifica e correzione dopo l'arrivo del codice sorgente

Dopo aver ottenuto android_15.0_kernel_MT6985.tar.gz (albero sorgente 5.15.178 + ABI XML) è stata eseguita una verifica incrociata completa, dettagli in VERIFICATION.md. Riepilogo:

  1. MT6985 = Dimensity 9200 (MT6989 è il 9300), corretto nel testo precedente.
  2. Offset simboli 23/23 corretti (verifica kallsyms), offset di task_struct / cred / waiter / page / pipe / configfs tutti coerenti con l'ABI dell'albero sorgente.
  3. Gli offset FOPS erano errati: i valori originali copiati da frankel (android13 GKI, senza iopoll, ioctl=0x48); ma il layout di task_struct del dispositivo (pi_blocked_on=0x8b0, confermato da disassemblaggio a runtime) è coerente con questo albero sorgente, quindi lo stesso kernel dovrebbe avere file_operations con iopoll@0x30, ioctl=0x50, open=0x70 ecc. — target.h è stato corretto, con autoverifica di fallback sul dispositivo reale tramite leak_kernel_base() integrato nell'exploit.
  4. Patch di compatibilità MTK per KernelSnitch (patches/kernelsnitch_mtk_fixes.patch):
    • La dimensione della tabella hash futex in spazio utente è ora allineata al kernel (possible CPU + 2 arrotondato a potenza di 2), evitando il fallimento certo del bruteforce quando possible≠online;
    • L'iterazione dei tag MTE ora include 0xf (untagged) e KSNITCH_MTE_ENABLED=1 è realmente effettivo (il util.c originale aveva mte=0 hardcoded);
    • Nessun impatto sui target non MTK.
  5. Il punto di crash rt_mutex_adjust_prio_chain+0x1b0 si trova nella fase pselect/pi chain, prima dell'autoverifica FOPS; dopo le correzioni sopra vale la pena rieseguire la verifica sul dispositivo.

2026-07-31 Test su dispositivo reale: KernelSnitch funziona, la fase slide è ancora un muro

Dispositivo (PD2241, compiler251203103903) testato in 8+ round:

  • KernelSnitch riparato e verificato: MM_STRUCT_SZ=0x400 (l'originale 0x500 causava una griglia di scansione disallineata e solo falsi positivi) + iterazione tag MTE 0..15 (il tag del puntatore mm del dispositivo cambia) + untag degli indirizzi falsificati. Ora trova stabilmente il vero mm_struct.
  • Ogni round crasha ancora in rt_mutex_adjust_prio_chain+0x1b0: competizione di timing nella catena pselect/pi (il waiter falsificato non raggiunge l'offset corretto nello stack del kernel). Lo scheduler RSC di vivo ha modificato il percorso futex/pi, probabilmente rompendo alla radice questa race condition. L'allineamento dello stack slide è stato parametrizzato come variabile d'ambiente SLIDE_SHIFT, scansione non completata.
  • Le fasi FOPS/pipe/cred non sono ancora state raggiunte, la verifica su dispositivo reale è in sospeso.

Scelta finale: downgrade a sblocco bootloader a pagamento (non si dipende più da questo percorso).

Scarica lo strumento