
# Guida all'analisi e alla mitigazione per CVE-2026-31431, un'escalation dei privilegi locale nel kernel Linux nel sottosistema crypto algif_aead, con valutazione dell'impatto per RHEL e OpenShift, inclusi l'indurimento seccomp e SCC.
Escalatione dei privilegi locali nel sottosistema crittografico algif_aead del kernel Linux.
CVE-2026-31431, soprannominato "Copy Fail", è un bug logico nel template crittografico authencesn del kernel Linux (algif_aead). Consente a un utente locale non privilegiato di eseguire una scrittura controllata di 4 byte nella cache delle pagine di qualsiasi file leggibile, che può essere sfruttata per modificare un binario setuid e ottenere i privilegi di root.
a664bf3d603d| Data | Evento |
|---|---|
| 2026-03-23 | Segnalato al team di sicurezza del kernel Linux |
| 2026-04-01 | Patch committata su mainline |
| 2026-04-22 | CVE assegnato |
| 2026-04-29 | Divulgazione pubblica |
L'exploit richiede due cose: un socket AF_ALG (consentito per impostazione predefinita in tutti i profili seccomp) e un binario setuid (es. /usr/bin/su). La mitigazione chiave è allowPrivilegeEscalation: false — questo imposta il flag no_new_privs del kernel Linux tramite prctl(PR_SET_NO_NEW_PRIVS, 1), che fa sì che il kernel ignori i bit setuid/setgid su execve(). Poiché l'exploit si basa sull'esecuzione di un binario setuid modificato, questo blocca il passaggio finale di escalation.
Questa non è una funzionalità specifica di OpenShift — funziona allo stesso modo su Kubernetes vanilla (Pod Security Standards Restricted), Docker (--security-opt no-new-privileges) e Podman. OpenShift semplicemente la applica per impostazione predefinita tramite l'SCC restricted-v2, mentre altre piattaforme richiedono una configurazione esplicita.
RHEL 8 e RHEL 9 includono kernel che contengono il codice vulnerabile. Un utente locale non privilegiato con accesso shell può sfruttarlo per ottenere i privilegi di root. Applicare la patch immediatamente.
yum updateinfo list cves CVE-2026-31431
yum update kernel
OpenShift gira su RHCOS, che include il kernel vulnerabile. L'impatto pratico dipende dai Security Context Constraints (SCC) del carico di lavoro.
I carichi di lavoro standard che utilizzano l'SCC restricted-v2 predefinito non sono sfruttabili perché allowPrivilegeEscalation: false è applicato.
I pod in esecuzione con SCC elevati (anyuid, privileged o SCC personalizzati che consentono allowPrivilegeEscalation: true) sono vulnerabili. Questo include comunemente:
anyuidL'accesso diretto al nodo (es. tramite oc debug node/) è sempre vulnerabile — escalation dei privilegi locale standard, nessun isolamento del container coinvolto.
Viene fornito un pod di test per verificare se i prerequisiti dell'exploit sono soddisfatti nel tuo cluster. Non tenta di sfruttare la vulnerabilità — controlla solo:
AF_ALG? (superficie di attacco del kernel raggiungibile)no_new_privs è impostato? (blocca l'escalation setuid)oc apply -f test-pod.yaml
oc logs cve-2026-31431-check
oc delete -f test-pod.yaml
Utilizza la variante Deployment per testare su più nodi scalando le repliche o utilizzando l'anti-affinità dei pod:
oc apply -f test-deployment.yaml
oc logs -l app=cve-2026-31431-check
oc delete -f test-deployment.yaml
| Codice | Significato |
|---|---|
0 | Non sfruttabile — socket AF_ALG bloccato da seccomp |
1 | Parzialmente esposto — AF_ALG raggiungibile ma setuid bloccato da no_new_privs |
2 | Vulnerabile — tutti i prerequisiti dell'exploit sono soddisfatti |
Su un cluster OpenShift standard con SCC restricted-v2, dovresti vedere il codice di uscita 1 (parzialmente esposto): il socket AF_ALG può essere creato (RuntimeDefault seccomp non lo blocca), ma no_new_privs impedisce il passaggio di escalation setuid. Il PoC pubblicato non funzionerà, ma la vulnerabilità a livello di kernel è comunque raggiungibile — l'applicazione della patch è consigliata.
Questa è l'unica soluzione completa. Aggiorna il kernel su tutti i nodi e riavvia.
Per OpenShift, aggiorna a una versione RHCOS che includa il fix ed esegui un riavvio rolling dei nodi.
Se algif_aead è compilato come modulo caricabile (CONFIG_CRYPTO_USER_API_AEAD=m):
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
rmmod algif_aead 2>/dev/null || true
Questo NON funziona se algif_aead è integrato (=y), che è il caso su RHCOS. Verifica con:
modinfo algif_aead 2>&1 | grep builtin
grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r)
Se il modulo del kernel è integrato, l'unica mitigazione pre-patch per i container è bloccare la syscall socket(AF_ALG, ...) tramite un profilo seccomp personalizzato.
Crea la MachineConfig per posizionare il profilo su tutti i nodi (ripeti con role: master per i nodi del piano di controllo):
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
labels:
machineconfiguration.openshift.io/role: worker
name: 99-worker-seccomp-deny-af-alg
spec:
config:
ignition:
version: 3.2.0
storage:
files:
- path: /var/lib/kubelet/seccomp/deny-af-alg.json
mode: 0644
contents:
source: data:application/json;charset=utf-8;base64,ewogICJkZWZhdWx0QWN0aW9uIjogIlNDTVBfQUNUX0FMTE9XIiwKICAic3lzY2FsbHMiOiBbCiAgICB7CiAgICAgICJuYW1lcyI6IFsic29ja2V0Il0sCiAgICAgICJhY3Rpb24iOiAiU0NNUF9BQ1RfRVJSTk8iLAogICAgICAiYXJncyI6IFsKICAgICAgICB7CiAgICAgICAgICAiaW5kZXgiOiAwLAogICAgICAgICAgInZhbHVlIjogMzgsCiAgICAgICAgICAib3AiOiAiU0NNUF9DTVBfRVEiCiAgICAgICAgfQogICAgICBdCiAgICB9CiAgXQp9
Il contenuto base64 decodifica in:
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"names": ["socket"],
"action": "SCMP_ACT_ERRNO",
"args": [
{
"index": 0,
"value": 38,
"op": "SCMP_CMP_EQ"
}
]
}
]
}
Nota: L'applicazione di una MachineConfig attiva un riavvio rolling dei nodi.
securityContext:
seccompProfile:
type: Localhost
localhostProfile: deny-af-alg.json
Per proteggere tutti i container senza modificare le specifiche dei pod, sovrascrivi il profilo seccomp predefinito di CRI-O (/etc/crio/seccomp.json) tramite MachineConfig aggiungendo la regola di filtro AF_ALG al profilo esistente.
Identifica i pod in esecuzione con privilegi elevati:
# Trova i pod che non utilizzano restricted-v2
oc get pods -A -o json | jq -r '
.items[] |
select(.metadata.annotations["openshift.io/scc"] != "restricted-v2") |
"\(.metadata.namespace)/\(.metadata.name) → \(.metadata.annotations["openshift.io/scc"])"
'
Questi sono i pod in cui funziona l'intera catena dell'exploit. Dai priorità all'applicazione della patch o alla mitigazione seccomp per i nodi che eseguono questi carichi di lavoro.
Il blocco dei socket AF_ALG ha un impatto trascurabile sulla maggior parte dei carichi di lavoro. I seguenti non sono interessati:
Solo le applicazioni configurate esplicitamente per utilizzare il motore afalg di OpenSSL saranno interessate.
| Ambiente | allowPrivilegeEscalation | Root del container | Root dell'host | Rischio |
|---|
| RHEL 8 / RHEL 9 (utente locale) | n/d | n/d | Sì | Critico |
Nodo OpenShift (accesso shell, es. oc debug node/) | n/d | n/d | Sì | Critico |
Pod OpenShift — SCC restricted-v2 (predefinito) | false | No | No | Basso |
Pod OpenShift — SCC anyuid | true | Sì | No (isolamento del namespace) | Alto |
Pod OpenShift — SCC privileged | true | Sì | Sì (nessun isolamento) | Critico |
| Pod OpenShift — SCC personalizzato | dipende | dipende | dipende | Audit |
| Pod Kubernetes — PSS Restricted | false | No | No | Basso |
| Pod Kubernetes — PSS Baseline / nessuna policy | true (predefinito) | Sì | No | Alto |
Docker / Podman — --security-opt no-new-privileges | false | No | No | Basso |
| Docker / Podman — predefinito | true | Sì | No | Alto |