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-2026-46215-POC — Exploit per CVE-2026-46215, un use-after-free del kernel Linux DRM GEM per l'escalation dei privilegi locali. Utilizza racing, slab spraying e sovrascrittura di file in stile Dirty Pipe per trasformare un utente non privilegiato del nodo di rendering in root senza password. | Kitploit
Strumenti/GitHubGitHub/0xcyberstan/cve-2026-46215-poc
Escalation di PrivilegiMemory ForensicsAnalisi delle VulnerabilitàExploitCTFApprendimento e FormazioneBinary Exploitation
GitHub0xcyberstan/cve-2026-46215-poc

CVE-2026-46215-POC

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

Exploit per CVE-2026-46215, un use-after-free del kernel Linux DRM GEM per l'escalation dei privilegi locali. Utilizza racing, slab spraying e sovrascrittura di file in stile Dirty Pipe per trasformare un utente non privilegiato del nodo di rendering in root senza password.

Vedi Repository
11232 mesi faNon ancora revisionato

CVE-2026-46215: DRM GEM change_handle Use-After-Free (LPE senza privilegi)

Escalation di privilegi locali tramite un use-after-free nell'ioctl del core DRM DRM_IOCTL_GEM_CHANGE_HANDLE (drm_gem_change_handle_ioctl, ioctl nr 0xD2). Raggiungibile da qualsiasi utente con accesso a un nodo di rendering (/dev/dri/renderD*, concesso alla sessione attiva da systemd-logind su tutte le principali distribuzioni desktop). La catena di exploit in questo repository porta dall'UAF a root senza password da un utente non privilegiato.

  • CVE: CVE-2026-46215 (HIGH, 7.8, AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
  • Introdotto: v6.18-rc1, commit 53096728b891 ("drm: Add DRM prime interface to reassign GEM handle", David Francis / AMD), aggiunto per il lavoro CRIU di AMD
  • Corretto in: 6.18.32, 7.0.9, 7.1-rc3 (upstream 5e28b7b94408). L'ioctl viene anche disabilitato upstream nella 7.1 a causa di questa e di altre race condition correlate.
  • Affetto: v6.18-rc1 fino alle versioni corrette sopra

Attribuzione

Questo bug è stato segnalato per la prima volta da Puttimet Thammasaeng, che detiene il credito Reported-by upstream sulla correzione. L'ho trovato e segnalato indipendentemente a [email protected] il 2026-04-12. Il mio report è stato riconosciuto e inoltrato ai manutentori, ma il report precedente è quello accreditato upstream. Questo repository contiene la mia analisi e il mio exploit.

Writeup: https://cyberstan.co.uk

Stato della divulgazione

La correzione è nei kernel stabili rilasciati (6.18.32 e 7.0.9 in poi). Questo repository è stato pubblicato dopo che le correzioni sono diventate ampiamente disponibili.

Il bug

drm_gem_change_handle_ioctl() sposta un oggetto GEM da un handle a un altro ma non regola mai obj->handle_count. Salta anche drm_vma_node_allow/revoke e i callback driver open/close. Poiché handle_count rimane a 1, una GEM_CLOSE concorrente sul vecchio handle lo porta a 0 e libera l'oggetto mentre il nuovo handle lo referenzia ancora nell'IDR. Quel handle pendente è l'use-after-free, successivamente dereferenziato in drm_gem_object_release_handle().

Catena di exploit

  1. Esegui una race condition tra GEM_CHANGE_HANDLE e GEM_CLOSE per ottenere un handle pendente.
  2. Recupera lo slot slab dell'oggetto liberato con un array pipe_buffer spruzzato (feng shui con msg_msg per condizionare kmalloc-512, poi pipe riempite con splice).
  3. Trapela pipe_buf_ops tramite un ioctl info del driver: obj->size (offset 216) si sovrappone a pipe_buf[5].ops, fornendo un puntatore al kernel e la base di KASLR.
  4. FLINK l'handle pendente in modo che obj->name (offset 224) cada su pipe_buf[5].flags e imposti PIPE_BUF_FLAG_CAN_MERGE (name = 16 = 0x10).
  5. Scrivi nelle pipe per fare merge nella cache delle pagine e sovrascrivere un file di sola lettura (stile DirtyPipe). Il bersaglio è /etc/passwd, root diventa senza password.

Gli offset sono verificati tramite pahole e sono specifici del layout attraverso 6.18 fino a 7.0. Sovrascrivi le definizioni GEM_* / PIPEBUF_* per altri kernel.

File

  • poc.c - l'exploit. Compila staticamente con -lpthread.
  • run_exploit.sh - costruisce il PoC e un initramfs minimo, lo avvia in QEMU.

Prerequisiti del host

qemu-system-x86_64, gcc, busybox (statico), fakeroot, cpio, gzip. KVM (/dev/kvm) è raccomandato; la race condition è molto più affidabile con esso.

Costruire un kernel di test

L'exploit necessita di un target vulnerabile compilato con opzioni specifiche:

  • CONFIG_KASAN deve essere SPENTO. KASAN mette in quarantena gli slab liberati e blocca il recupero tramite pipe spray, quindi l'exploit non funzionerà contro una build con KASAN.
  • Un driver DRM che esponga i campi size/name agli offset previsti: virtio_gpu (usato nella demo) o nouveau.
  • CONFIG_DRM=y, CONFIG_DRM_VIRTIO_GPU=y, CONFIG_DEVTMPFS=y, CONFIG_BLK_DEV_INITRD=y.

Passaggi:

  1. Estrarre un albero sorgente da 6.18 a 7.0 (o qualsiasi albero che fallisca il controllo corretto qui sotto).
  2. Impostare le opzioni di configurazione sopra e assicurarsi che CONFIG_KASAN non sia impostato.
  3. make -j"$(nproc)" bzImage, producendo arch/x86/boot/bzImage.

La demo si avvia con nokaslr in modo che il puntatore trapelato sia deterministico. La trapelatura sconfigge KASLR da sola, quindi anche con KASLR acceso funziona, l'indirizzo varia semplicemente a ogni avvio.

Verificare se un albero è vulnerabile o corretto

Guarda in drivers/gpu/drm/drm_gem.c, funzione drm_gem_change_handle_ioctl().

Controllo rapido:

root@kitploit:~
awk '/^int drm_gem_change_handle_ioctl/,/^}/' \
    drivers/gpu/drm/drm_gem.c | grep -c handle_count
  • 0 significa VULNERABILE (nessuna gestione del refcount).
  • non-zero significa CORRETTO.

Per struttura:

  • Vulnerabile: prende file_priv->prime.lock, un singolo idr_alloc(&file_priv->object_idr, obj, ...), poi idr_remove() sul vecchio handle. Nessun drm_gem_object_handle_get.
  • Corretto: inserimento in due fasi (idr_alloc poi idr_replace(NULL) per staccare il vecchio handle), con il vero oggetto scambiato solo dopo che le operazioni prime hanno successo.

Eseguire l'exploit

root@kitploit:~
./run_exploit.sh /path/to/bzImage

Costruisce poc.c, lo impacchetta in un initramfs e avvia QEMU con -device virtio-gpu-pci e nokaslr. Il PoC viene eseguito come uid 1000 (non privilegiato), poi lo script stampa /etc/passwd prima e dopo e ti lascia una shell. Esci dalla VM con poweroff -f o Ctrl-A X.

Output previsto

root@kitploit:~
[!] Race won (iter 977): handle=132049
[!] KASLR: pipe_buf_ops = 0xffffffff82428400
[!] EXPLOIT SUCCESSFUL
[!] FLINK: 16 = 0x10
[*] /etc/passwd:
    root::0:0:pwned:/root:/bin/sh
[!] LPE CONFIRMED
[!] root account is now passwordless

Un /etc/passwd di sola lettura (chmod 444) di proprietà di root viene sovrascritto da un processo non privilegiato. La riga root: perde il campo password.

Affidabilità

  • Circa 99% per avvio nei test (99/100 su 100 avvii freschi, più 53/53 in esecuzioni precedenti). Il PoC riprova internamente: su una trapelatura errata ri-esegue la race per un nuovo oggetto pendente invece di ri-spruzzare uno slot morto, fino a 200 round, ciascun round alcune decine di millisecondi. La maggior parte degli avvii vince al primo tentativo; il peggiore osservato ha usato 11 dei 200 round.
  • Raro (circa 1%) caso di fallimento: un'interleaving di race perdente corrompe lo stato del kernel e blocca la VM (hang silenzioso, nessun verdetto stampato). Questo è inerente a un UAF da race del kernel. Se un'esecuzione non stampa un verdetto entro circa 30 secondi, spegni e riavvia.

Confermare la correzione

Ricostruisci contro un albero corretto (6.18.32, 7.0.9, 7.1-rc3 o successivo, o qualsiasi albero che superi il controllo di cui sopra) e ri-esegui:

root@kitploit:~
./run_exploit.sh /path/to/patched-bzImage

Contro il kernel corretto l'exploit non dovrebbe mai raggiungere "EXPLOIT SUCCESSFUL": la race non libera più l'oggetto mentre il nuovo handle è in uso, quindi la trapelatura non restituisce mai un puntatore valido al kernel.

Disclaimer

Pubblicato per scopi di ricerca e difensivi dopo che le correzioni upstream sono state distribuite. Fornito così com'è. Eseguilo solo su VM che controlli.

Scarica lo strumento