
CVE-2026-31431 (Copy Fail) nuovo exploit: corruzione del codice in tempo reale tramite page cache. Sovrascrive il codice di exit() di libc attraverso la condivisione delle pagine MAP_PRIVATE — colpisce TUTTI i processi in esecuzione.
Una tecnica di sfruttamento innovativa per CVE-2026-31431 ("Copy Fail") che corrompe il codice eseguibile dei processi in esecuzione attraverso la page cache del kernel Linux, ottenendo l'elevazione dei privilegi a root.
Tutti gli exploit pubblicati per questa CVE corrompono file di dati — modificando /etc/passwd per cambiare l'UID di root, o patchando i binari setuid su disco. Questo exploit fa qualcosa di fondamentalmente diverso: corrompe il codice eseguibile live in memoria attraverso il meccanismo della page cache del kernel.
| Exploit pubblicati | Questo exploit | |
|---|---|---|
| Obiettivo | File di dati (/etc/passwd, /usr/bin/su) | Codice eseguibile (sezione .text di libc) |
| Meccanismo | Contenuto del file analizzato dai programmi | Pagine di codice eseguite direttamente dalla CPU |
| Ambito | Singolo file | TUTTI i processi che mappano libc |
| Modifica su disco | Sì (contenuto del file modificato) | No (solo page cache in memoria) |
| Rilevamento | Monitoraggio dell'integrità dei file | Invisibile ai controlli del filesystem |
Quando Linux mappa una libreria condivisa con MAP_PRIVATE, non copia immediatamente le pagine del file. Invece, le voci della tabella delle pagine del processo puntano direttamente alle pagine fisiche della page cache. La copia avviene solo in scrittura (copy-on-write). Per le pagine di codice (.text), i processi non vi scrivono mai — quindi rimangono condivise con la page cache per sempre.
Processo A (bash) Processo B (su) Page Cache (libc)
┌──────┐ ┌──────┐ ┌──────────┐
│ PTE │───────────>│ │ │ exit(): │
│ │ │ PTE │───────────>│ endbr64 │
└──────┘ └──────┘ │ push rax │
MAP_PRIVATE MAP_PRIVATE │ ... │
(pagina pulita) (pagina pulita) └──────────┘
↑
Copy Fail scrive qui!
CVE-2026-31431 ci fornisce una scrittura controllata di 4 byte nella page cache di qualsiasi file leggibile. Corrompendo le pagine di codice di libc, modifichiamo le istruzioni che ogni processo esegue.
on_exit() nella page cache di libc — 10 scritture di 4 byte ciascunaexit() per saltare al nostro shellcode — 1 scrittura di 4 byteexit() (praticamente ogni programma) esegue il nostro shellcodeLo shellcode esegue setuid(0) → setgid(0) → execve("/bin/sh"), fornendo una shell root.
crypto/algif_aead.c — l'ottimizzazione in-place del 2017 (72548b093ee3) consente a splice() di alimentare le pagine della page cache nella decrittazione AEAD. Il riarrangiamento ESN dell'algoritmo authencesn scrive 4 byte scratch di ritorno nello scatterlist di origine, corrompendo la page cache del file spliced.# Compilazione
gcc -o exploit exploit.c
# Esecuzione come utente non privilegiato
./exploit /lib/x86_64-linux-gnu/libc-2.31.so
# Trigger — esegui qualsiasi programma (chiama exit())
su -c id
# uid=0(root) gid=0(root) groups=0(root)
process 'id' launched '/bin/sh'exploit.c — Exploit completo con iniezione di shellcodecopyfail_test.c — Verifica della primitiva (testa la scrittura di 4 byte)72548b093ee3)Questo strumento è fornito esclusivamente per ricerca sulla sicurezza autorizzata e scopi educativi. Non utilizzarlo contro sistemi di cui non sei proprietario o per i quali non hai esplicita autorizzazione al test.
Dirty Frag ha divulgato altre due varianti di scrittura nella page cache nella stessa classe di bug:
esp4/esp6): Stesso sink authencesn di Copy Fail, raggiunto tramite IPsec ESP-in-UDP. Richiede user namespaces. Scrittura di 4 byte.rxrpc/rxkad): Decrittazione in-place pcbc(fcrypt) su pagina pinnata da splice. Nessun namespace richiesto. Scrittura di 8 byte.La tecnica di corruzione del codice live in questo repository funziona con qualsiasi di queste primitive di scrittura nella page cache — basta sostituire la funzione write4() con il trigger ESP o RxRPC. La tecnica è agnostica rispetto alla primitiva.