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.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2023-20938-poc — Proof-of-concept di escalation dei privilegi locale per CVE-2023-20938, un use-after-free in Android binder, che raggiunge root e disabilita SELinux su build di test vulnerabili. | Kitploit
Strumenti/GitHubGitHub/byt3quester/cve-2023-20938-poc
Sicurezza AndroidEscalation di PrivilegiExploitCTFApprendimento e FormazioneBinary Exploitation
GitHubbyt3quester/cve-2023-20938-poc

CVE-2023-20938-poc

Proof-of-concept di escalation dei privilegi locale per CVE-2023-20938, un use-after-free in Android binder, che raggiunge root e disabilita SELinux su build di test vulnerabili.

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
Vedi Repository
1193 mesi faNon ancora revisionato

CVE-2023-20938 — Escalation di privilegi UAF del binder Android

Una prova di concetto di escalation di privilegi locale per CVE-2023-20938, un use-after-free nel driver binder di Android. Da una shell senza privilegi ottiene uid 0 e porta SELinux a permissive, quindi avvia una shell di root.

Target di questa build: Android Cuttlefish / Goldfish AVD, x86_64, kernel 5.10.107.

⚠️ Solo per uso di ricerca autorizzato / didattico. Eseguilo solo contro i tuoi dispositivi di test ed emulatori. Il bug è corretto nella Android attuale; questa PoC ha come target una vecchia build di test deliberatamente vulnerabile. Nessuna garanzia.


Demo

demo dell'exploit

Registrata con asciinema e resa in GIF con agg:


La vulnerabilità

  • CVE: CVE-2023-20938
  • Componente: drivers/android/binder.c, binder_transaction_buffer_release()
  • Classe: use-after-free (kmalloc-128)

binder_transaction_buffer_release() si fida di un offsets_size fornito dall'attaccante. L'invio di una transazione il cui offsets_size è di un byte più corto di una voce completa (sizeof(offset) - 1 == 7) fa sì che il percorso di rilascio interpreti erroneamente il flat_binder_object finale e decrementi eccessivamente il refcount di un binder_node, liberandolo mentre un riferimento pendente è ancora attivo.


Come funziona

L'exploit combina una cross-cache leak in una lettura arbitraria e una scrittura controllata, quindi riscrive le credenziali. Fase per fase (vedi main() in poc_cf.c):

 B. Cross-cache leak
      free a wave of binder_nodes (kmalloc-128) -> page returns to the buddy
      allocator -> reclaim the page with eventpoll epitems (eventpoll_epi cache,
      0x80-byte objects). A dangling binder transaction now reads kernel
      pointers out of an epitem, leaking a struct file and its epitem address.

 C. Arbitrary read
      re-trigger the UAF and use a sprayed fake binder_node to turn binder's
      hlist_del unlink into a controlled *(where) = what write. Two writes
      redirect a victim file's f_inode at a fake inode overlaid on the epitem
      and mark it S_PRIVATE. FIGETBSZ on the file then returns
      *(epitem.event.data + 24): a steerable 4-byte read.

 D/E/F. Privilege escalation
      defeat KASLR (leak eventfd_fops via f_op), walk init_task's task list to
      the launcher's cred, zero its uid/gid set and seccomp.mode, then zero
      selinux_state to drop SELinux to permissive.

 G. A pre-forked, eventfd-free launcher execs a root shell.

Due processi senza privilegi devono condividere un nodo binder per guidare la UAF; tramite l'ITokenManager di hwservicemanager (createToken /get-by-token).


Compilazione

clang -static -Wall -Wextra -o poc_cf poc_cf.c -lpthread

binder.h deve trovarsi accanto a poc_cf.c. La build è volutamente statica, così il singolo binario gira sul target senza che sia presente una toolchain.


Esecuzione

1. Avvia la guest Cuttlefish vulnerabile

Dalla directory del pacchetto host di Cuttlefish, avvia l'AVD con il kernel + initramfs corrispondente:

HOME=$PWD ./bin/launch_cvd \
  --kernel_path=bzImage \
  --initramfs_path=initramfs.img

2. Copia ed esegui

adb push poc_cf /data/local/tmp/
adb shell /data/local/tmp/poc_cf

Una esecuzione riuscita attraversa le fasi e termina in una shell di root:


Affidabilità

L'exploit è probabilistico. Ogni fase riprova internamente.

Quindi, che tu veda un'uscita pulita o un panic della guest, basta riesegui (la /data dell'AVD viene cancellata al riavvio, quindi ricopialo dopo un panic).

Se il tasso di successo del reclaim è scarso su un target più lento o più occupato, allarga le attese o aumenta il numero di spray (i #define vicino all'inizio di poc_cf.c):

MacroPredefinitoSignificato
SETTLE_US5000pausa dopo che il nodo è stato liberato, prima dello spray
FAKE_SPRAY_COUNT8sendmsg() bloccati in competizione per reclamare lo slot
FAKE_WAIT_US10000pausa dopo il rilascio degli spray, prima dell'unlink
PRESKIP_US1000pausa dopo il primo sendmsg sacrificale
KW_RETRY_COUNT8tentativi per ogni singola scrittura di unlink
STAGE_C_TRIES8tentativi per portare online la lettura arbitraria

Riadattamento a un'altra build

Gli offset delle struct e la baseline dei simboli non randomizzati (*_NOKASLR) sono specifici di questa esatta build 5.10.107 e non funzioneranno altrove. Per portare su un kernel diverso, aggiorna il blocco degli offset e il blocco dei simboli vicino all'inizio di poc_cf.c con i valori della vmlinux corrispondente. Ho provato su Pixel 7 dopo aver estratto gli offset.


Riferimenti

  • Blog Android Offensive Security di Google [https://androidoffsec.withgoogle.com/posts/attacking-android-binder-analysis-and-exploitation-of-cve-2023-20938/]
Scarica lo strumento