
Mitigazione basata su Seccomp per CVE-2026-31431, una LPE del kernel Linux. Blocca il socket AF_ALG tramite modulo PAM e wrapper autonomo, con rilevamento automatico dei kernel patchati.
Una mitigazione leggera e reversibile basata su seccomp per CVE-2026-31431, una vulnerabilità di escalation dei privilegi locale nel sottosistema crittografico algif_aead / authencesn del kernel Linux.
Tipo: Escalation dei Privilegi Locale (LPE)
Componente Interessato: crypto/algif_aead.c del kernel Linux - operazione AEAD in-place
Primitiva di Attacco: Una scrittura controllabile di 4 byte nella cache delle pagine di qualsiasi file leggibile tramite il percorso di scrittura scratch dell'algoritmo AEAD authencesn. Prendendo di mira /etc/passwd, un attaccante può cambiare il proprio UID in 0 (root) e ottenere una shell root tramite su.
Kernel Interessati: Confermato sui kernel 6.12+, 6.17+, 6.18+, e riprodotto anche sui kernel RHEL/CentOS 4.18/5.14.
Ambienti Verificati: Rocky Linux 8 (kernel 4.18) e Rocky Linux 9 (kernel 5.14) - exploit completamente bloccato, rimozione sicura confermata.
Causa Principale: Il commit 72548b093ee3 ha introdotto l'operazione AEAD in-place. Quando le pagine della cache di file spliced vengono usate come scatterlist di destinazione, il campo AAD seqno_lo viene scritto erroneamente nella cache delle pagine durante la decrittazione AEAD.
Fix a Monte: Ripristino dell'operazione AEAD out-of-place.
Questa soluzione ha due componenti:
Modulo PAM (pam_block_afalg.so) - La difesa principale. Caricato da PAM durante l'apertura della sessione (pam_sm_open_session), applica un filtro seccomp BPF che blocca socket(AF_ALG, ...) prima che venga eseguito qualsiasi codice utente. Copre TUTTE le sessioni autenticate PAM: su -c, su -, SSH, login TTY, ecc.
Binario standalone (block_afalg) - Opzionale. Può avvolgere programmi specifici per scenari non-PAM (es. job cron, servizi systemd, invocazione manuale).
Il filtro seccomp:
socket(AF_ALG, ...) (restituisce EACCES)setuid, su, sudo)Apertura sessione PAM (su, ssh, login, ecc.)
|
v
pam_block_afalg.so (pam_sm_open_session)
|
+-- Controllo: il kernel è vulnerabile? (prova socket(AF_ALG))
| |
| +-- No --> restituisci PAM_SUCCESS (no-op)
| |
| +-- Sì --> prctl(PR_SET_SECCOMP, filtro BPF)
| |
| +-- filtro seccomp attivo sul processo figlio di sshd
| +-- ereditato dalla shell dell'utente e da TUTTI i processi figli
| +-- socket(AF_ALG, ...) restituisce EACCES
v
La shell / il comando dell'utente viene eseguito con protezione seccomp
|
+-- su, sudo e tutte le altre syscall funzionano normalmente
+-- Solo il socket AF_ALG è bloccato
| File | Scopo |
|---|---|
pam_block_afalg.c | Sorgente del modulo PAM. Applica il filtro seccomp all'apertura della sessione. |
pam_minimal.h | Definizioni minime dei tipi PAM (compila senza pam-devel). |
block_afalg.c | Binario wrapper seccomp standalone. Per uso non-PAM. |
deploy.sh | Script di distribuzione. Compila, installa e gestisce il modulo PAM. |
gcc (per la compilazione)libpam (runtime, solitamente preinstallato)# 1. Compila il modulo PAM
gcc -Wall -O2 -fPIC -shared -o pam_block_afalg.so pam_block_afalg.c \
/usr/lib64/libpam.so.0
# 2. Installa (aggiunge automaticamente le configurazioni PAM a su, sshd, login)
sudo ./deploy.sh install
# 3. Verifica (deve essere una NUOVA sessione)
cat /proc/self/status | grep Seccomp
# Dovrebbe mostrare: Seccomp: 2
python3 -c "
import socket
try:
s = socket.socket(38,2,0); s.close()
print('VULNERABILE')
except OSError:
print('BLOCCATO')
"
# Dovrebbe mostrare: BLOCCATO
# 4. Disinstalla
sudo ./deploy.sh remove
| Comando | Descrizione |
|---|---|
deploy.sh install | Compila il modulo PAM, lo installa in /lib64/security/, aggiunge automaticamente le configurazioni PAM |
deploy.sh remove | Disinstallazione completa: rimuove il modulo, pulisce le configurazioni PAM, elimina i file |
deploy.sh status | Mostra lo stato dell'installazione, le configurazioni PAM, lo stato del kernel |
Per scenari non-PAM, usa block_afalg direttamente:
# Compila
gcc -Wall -O2 -o block_afalg block_afalg.c
# Esegui un comando con AF_ALG bloccato
./block_afalg python3 tuo_script.py
./block_afalg bash
python3 -c "
import socket
try:
s = socket.socket(38, socket.SOCK_SEQPACKET, 0)
s.close()
print('VULNERABILE: socket AF_ALG disponibile')
except:
print('SICURO: socket AF_ALG bloccato o non disponibile')
"
# Controlla lo stato seccomp
cat /proc/self/status | grep Seccomp
# Seccomp: 0 = non protetto
# Seccomp: 2 = protetto
# Test del socket AF_ALG
python3 -c "
import socket
try:
s = socket.socket(38,2,0)
s.close()
print('AF_ALG disponibile - NON protetto')
except OSError:
print('AF_ALG bloccato - PROTETTO')
"
# Controlla i log PAM
grep pam_block_afalg /var/log/secure
# Dovrebbe mostrare: filtro seccomp applicato, AF_ALG bloccato
__NR_socket su x86_64). Altre architetture richiedono l'aggiornamento del numero di syscall.exec() dirette senza PAM non sono coperte (usa block_afalg per quelle).remove.yum update kernel e poi rimuovi il modulo.Questo strumento è fornito esclusivamente per test di sicurezza autorizzati e scopi difensivi. Usalo solo su sistemi di tua proprietà o per i quali sei esplicitamente autorizzato a valutare.