
Seccomp-basierte Abschwächung für CVE-2026-31431, eine Linux-Kernel-LPE. Blockiert AF_ALG-Sockets über ein PAM-Modul und einen eigenständigen Wrapper, mit automatischer Erkennung gepatchter Kernel.
Eine leichtgewichtige, reversible seccomp-basierte Mitigation für CVE-2026-31431, eine lokale Privilegieneskalations-Schwachstelle im algif_aead-/authencesn-Krypto-Subsystem des Linux-Kernels.
Typ: Lokale Privilegieneskalation (LPE)
Betroffene Komponente: Linux-Kernel crypto/algif_aead.c – In-Place-AEAD-Operation
Angriffsprimitive: Ein 4-Byte-kontrollierbarer Schreibzugriff in den Page-Cache einer beliebigen lesbaren Datei über den Scratch-Write-Pfad des authencesn-AEAD-Algorithmus. Durch das Zielen auf /etc/passwd kann ein Angreifer seine UID auf 0 (root) ändern und über su eine Root-Shell erhalten.
Betroffene Kernel: Bestätigt auf Kernel 6.12+, 6.17+, 6.18+ und ebenfalls reproduziert auf RHEL/CentOS-4.18/5.14-Kerneln.
Verifizierte Umgebungen: Rocky Linux 8 (Kernel 4.18) und Rocky Linux 9 (Kernel 5.14) – Exploit vollständig blockiert, sichere Entfernung bestätigt.
Grundursache: Commit 72548b093ee3 führte die In-Place-AEAD-Operation ein. Wenn gespleißte Page-Cache-Seiten als Ziel-Scatterlist verwendet werden, wird das AAD-Feld seqno_lo während der AEAD-Entschlüsselung fälschlicherweise zurück in den Page-Cache geschrieben.
Upstream-Fix: Rückkehr zur Out-of-Place-AEAD-Operation.
Diese Lösung besteht aus zwei Komponenten:
PAM-Modul (pam_block_afalg.so) – Die primäre Verteidigung. Wird von PAM beim Öffnen einer Sitzung (pam_sm_open_session) geladen und wendet einen seccomp-BPF-Filter an, der socket(AF_ALG, ...) blockiert, bevor Benutzercode ausgeführt wird. Dies deckt ALLE PAM-authentifizierten Sitzungen ab: su -c, su -, SSH, TTY-Login usw.
Standalone-Binary (block_afalg) – Optional. Kann bestimmte Programme für Nicht-PAM-Szenarien umschließen (z. B. Cron-Jobs, systemd-Dienste, manuelle Aufrufe).
Der seccomp-Filter:
socket(AF_ALG, ...) (gibt EACCES zurück)setuid, su, sudo)PAM-Sitzungsöffnung (su, ssh, login usw.)
|
v
pam_block_afalg.so (pam_sm_open_session)
|
+-- Prüfung: Ist der Kernel verwundbar? (socket(AF_ALG) versuchen)
| |
| +-- Nein --> PAM_SUCCESS zurückgeben (No-op)
| |
| +-- Ja --> prctl(PR_SET_SECCOMP, BPF-Filter)
| |
| +-- seccomp-Filter aktiv auf sshd-Kindprozess
| +-- wird von der Benutzer-Shell und ALLEN Kindprozessen geerbt
| +-- socket(AF_ALG, ...) gibt EACCES zurück
v
Benutzer-Shell / Befehl läuft mit seccomp-Schutz
|
+-- su, sudo und alle anderen Syscalls funktionieren normal
+-- Nur der AF_ALG-Socket ist blockiert
| Datei | Zweck |
|---|---|
pam_block_afalg.c | PAM-Modul-Quellcode. Wendet seccomp-Filter beim Sitzungsöffnen an. |
gcc (für die Kompilierung)libpam (Laufzeit, normalerweise vorinstalliert)# 1. PAM-Modul kompilieren
gcc -Wall -O2 -fPIC -shared -o pam_block_afalg.so pam_block_afalg.c \
/usr/lib64/libpam.so.0
# 2. Installieren (fügt PAM-Konfigurationen automatisch zu su, sshd, login hinzu)
sudo ./deploy.sh install
# 3. Verifizieren (muss eine NEUE Sitzung sein)
cat /proc/self/status | grep Seccomp
# Sollte anzeigen: Seccomp: 2
python3 -c "
import socket
try:
s = socket.socket(38,2,0); s.close()
print('VULNERABLE')
except OSError:
print('BLOCKED')
"
# Sollte anzeigen: BLOCKED
# 4. Deinstallieren
sudo ./deploy.sh remove
| Befehl | Beschreibung |
|---|---|
deploy.sh install | PAM-Modul kompilieren, nach /lib64/security/ installieren, PAM-Konfigurationen automatisch hinzufügen |
deploy.sh remove | Vollständige Deinstallation: Modul entfernen, PAM-Konfigurationen bereinigen, Dateien löschen |
Für Nicht-PAM-Szenarien block_afalg direkt verwenden:
# Kompilieren
gcc -Wall -O2 -o block_afalg block_afalg.c
# Einen Befehl mit blockiertem AF_ALG ausführen
./block_afalg python3 your_script.py
./block_afalg bash
python3 -c "
import socket
try:
s = socket.socket(38, socket.SOCK_SEQPACKET, 0)
s.close()
print('VULNERABLE: AF_ALG socket available')
except:
print('SAFE: AF_ALG socket blocked or unavailable')
"
# Seccomp-Status prüfen
cat /proc/self/status | grep Seccomp
# Seccomp: 0 = nicht geschützt
# Seccomp: 2 = geschützt
# AF_ALG-Socket testen
python3 -c "
import socket
try:
s = socket.socket(38,2,0)
s.close()
print('AF_ALG available - NOT protected')
except OSError:
print('AF_ALG blocked - PROTECTED')
"
# PAM-Logs prüfen
grep pam_block_afalg /var/log/secure
# Sollte anzeigen: seccomp filter applied, AF_ALG blocked
__NR_socket auf x86_64). Für andere Architekturen muss die Syscall-Nummer aktualisiert werden.exec()-Aufrufe ohne PAM sind nicht abgedeckt (dafür block_afalg verwenden).remove aufräumen.yum update kernel und dann das Modul entfernen.Dieses Tool wird ausschließlich für autorisierte Sicherheitstests und defensive Zwecke bereitgestellt. Verwenden Sie es nur auf Systemen, die Ihnen gehören oder für die Sie ausdrücklich zur Bewertung autorisiert sind.
pam_minimal.h | Minimale PAM-Typdefinitionen (kompiliert ohne pam-devel). |
block_afalg.c | Standalone-seccomp-Wrapper-Binary. Für Nicht-PAM-Verwendung. |
deploy.sh | Bereitstellungsskript. Kompiliert, installiert und verwaltet das PAM-Modul. |
deploy.sh status | Installationsstatus, PAM-Konfigurationen und Kernel-Status anzeigen |