
Passiver Linux-Host-Scanner, der die Exposition gegenüber CVE-2026-31431 über Kernel-Version, Distro-Changelog, Modulstatus und AF_ALG-Erreichbarkeit klassifiziert, mit JSON-Ausgabe für die SIEM-Integration.
Autoren/Mitwirkende: Patrick Doyle (Autor/Maintainer), Effie Renard (Co-Autorin), Kimberly-Lee Banks (Co-Autorin), Chris F. (Support/Code-Review)
KI-Offenlegung: Claude Code wurde zum Schreiben von Testdateien, zum Erstellen von Testdaten und für eine Code-Sicherheitsüberprüfung verwendet. Alle Änderungen wurden manuell von einem der Mitwirkenden geprüft.
Ein einzelnes statisch gelinktes Go-Binary, das die Exposition eines Linux-Hosts gegenüber CVE-2026-31431 klassifiziert.
Das Tool ist passiv. Es nutzt den Bug nicht aus. Der Mechanismus-Probe (siehe Sicherheitserklärung unten) führt genau zwei Syscalls aus und berührt niemals den verwundbaren Codepfad.
| Signal | Quelle | Flag |
|---|
| Kernel-Version vs. Upstream-Fix | uname(2) | --kernel-version |
| Distro-Changelog erwähnt die CVE | apt/rpm/apk oder changelog.Debian.gz auf der Platte | --changelog |
Status des algif_aead-Moduls | /proc/modules, modprobe.d, /lib/modules | --module |
| Verwundbare Oberfläche erreichbar | socket(AF_ALG) + bind(authencesn(...)) | --mechanism |
| In vmlinux einkompiliert | /boot/config-$(uname -r) oder /proc/config.gz | (Teil von --module) |
Wenn keine Check-Flags angegeben sind, laufen alle vier.
| Modus | Auslöser | Anwendungsfall |
|---|---|---|
| Hübsch formatiert (Standard) | TTY-Stdout, kein --format-Override, keine NO_COLOR-Umgebungsvariable | Interaktive Shell-Ausführungen |
| Klartext | Nicht-TTY-Stdout, ODER --format=text, ODER NO_COLOR=1, ODER --no-color | Shell-Skripte, Pipes |
| JSON | --format=json | Syslog/SIEM-Erfassung, Shell-Skripte |
| Quiet | --quiet | Nur Exit-Code (Automatisierung/Skripte) |
Hübsche Ausgabe bei Pipe erzwingen: cvecheck --pretty | tee report.txt.
Klartext in einer TTY erzwingen: cvecheck --no-color oder NO_COLOR=1 cvecheck.
Der Probe führt genau zwei Syscalls aus: socket(AF_ALG, SOCK_SEQPACKET, 0) und bind(fd, &SockaddrALG{Type:"aead", Name:"authencesn(hmac(sha256), cbc(aes))"}). Danach folgt close(fd). Es werden keine setsockopt für einen Schlüssel, kein accept, kein sendmsg, kein splice und keine Pipe-Erstellung durchgeführt. Der verwundbare Codepfad erfordert sendmsg von Krypto-Daten in Kombination mit einem splice von einem page-cache-gestützten Dateideskriptor; keine dieser Operationen findet statt, daher kann der Bug nicht ausgelöst werden.
Ein erfolgreicher Probe bedeutet, dass die Oberfläche erreichbar ist. Ob der Kernel den Bug noch enthält, wird durch die Kernel-Versions- und Changelog-Signale entschieden.
Nebeneffekt: Ein erfolgreiches bind lädt algif_aead automatisch über den Kernel-Modul-Autoloader nach. Der Modul-Check läuft vor dem Mechanismus-Probe, sodass der Ladezustandsbericht vor dem Probe erstellt wird. Um das Autoloaden vollständig zu unterdrücken, muss algif_aead zuerst auf die Blacklist gesetzt werden.
| Code | Bedeutung |
|---|---|
0 | PATCHED / NOT_VULNERABLE / MITIGATED / LIKELY_NOT_EXPLOITABLE |
2 | VULNERABLE oder MECHANISM_REACHABLE (partieller Scan, Kernel-Version nicht geprüft) |
3 | INCONCLUSIVE (unzureichende Signale) |
| Distro | Erkennung | Kernel-Paket | Hinweise |
|---|---|---|---|
| Ubuntu / Debian / Mint / Pop!_OS | apt | linux-image-$(uname -r) | Plattenbasierte Changelog-Lesung vermeidet Netzwerk-Fragilität von apt changelog bei signierten Kerneln |
| RHEL / CentOS / Rocky / Alma / Fedora / Amazon Linux | rpm | kernel | Liefert algif_aead eingebaut (CONFIG_..._AEAD=y); Blacklist-Mitigation nicht wirksam |
| Oracle Linux | rpm | kernel oder kernel-uek | UEK wird über den Teilstring uek in uname -r erkannt |
| openSUSE / SLES | rpm | kernel-default | |
| Alpine | apk | linux-lts / linux-virt / usw. | Variante wird aus dem Release-Suffix gewählt |
| Arch / CachyOS / Manjaro / Endeavour / Gentoo | keine | n/v | Rolling/Source: verlässt sich auf den Kernel-Versions-Check |
Erkennt automatisch Ihre Architektur, lädt das richtige Binary in $(pwd) herunter und verifiziert dessen SHA-256 gegen die veröffentlichten SHA256SUMS:
curl -fsSL https://copyfail.pcdoyle.dev/install.sh | sh
Das Skript beendet sich mit einem Nicht-Null-Exit-Code bei Prüfsummenabweichung und entfernt die fehlerhafte Datei.
Wählen Sie das Binary für Ihre Host-Architektur:
| Architektur | Binary |
|---|---|
Intel/AMD 64-Bit (x86_64) | cvecheck-linux-x86_64 |
ARM 64-Bit (aarch64) | cvecheck-linux-arm64 |
Intel/AMD 32-Bit (i?86) | cvecheck-linux-x86 |
Vor der Ausführung verifizieren:
curl -LO https://github.com/pcdoyle/copy-fail-cve-2026-31431/releases/latest/download/cvecheck-linux-x86_64
curl -LO https://github.com/pcdoyle/copy-fail-cve-2026-31431/releases/latest/download/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS
chmod +x cvecheck-linux-x86_64
make build # bin/cvecheck-linux-{x86_64,arm64,x86}
# SCP(SFTP) zum Server:
scp ./bin/cvecheck-linux-x86_64 host:/tmp/ # Weniger als 4 MB, statisch, keine glibc-Abhängigkeit
# SSH:
ssh <host>
# Binary ausführen:
/tmp/cvecheck-linux-x86_64 # Menschlich lesbare, hübsche Ausgabe.
/tmp/cvecheck-linux-x86_64 --format=json # Für Skripte, Syslog und SIEM geeignet
/tmp/cvecheck-linux-x86_64 --format=text # Für Skripte und Pipes geeignet
ssh <host> /tmp/cvecheck-linux-x86_64 # Bei direkter Ausführung Standard: --format=text
ssh <host> /tmp/cvecheck-linux-x86_64 --format=json # Für Syslog/SIEM geeignet
Hängen Sie das Host-Rootverzeichnis lesbar ein und übergeben Sie --root:
docker run --rm -v /:/host:ro alpine /tmp/cvecheck --root /<host-path>
--root steuert alle plattenbasierten Abfragen (/etc/os-release, modprobe.d, /lib/modules, /boot/config-*, Changelog-Dateien). Die Kernel-Versions- und Mechanismus-Probes berühren weiterhin den laufenden Kernel über uname(2) und socket(AF_ALG, ...).
Wird in dieser Reihenfolge aufgelöst (erster Treffer gewinnt):
PATCHED: Distro-Changelog verweist auf die CVE-ID.NOT_VULNERABLE: Laufender Kernel >= Upstream-Fixversion.MITIGATED: algif_aead auf der Blacklist und nicht geladen und nicht in vmlinux eingebaut.LIKELY_NOT_EXPLOITABLE: AF_ALG nicht verfügbar und Modul nicht auf der Platte.MECHANISM_REACHABLE: Oberfläche erreichbar, aber Kernel-Version nicht geprüft.VULNERABLE: Kernel im verwundbaren Bereich und Mechanismus erreichbar.INCONCLUSIVE: Keiner der obigen Punkte trifft zu.Wenn --mechanism zusammen mit --kernel-version läuft und beide Signale auf ein Problem hinweisen, ist das Ergebnis VULNERABLE mit einem Sanierungshinweis.
algif_aead auf die Blacklist setzen, bis das Kernel-Update eintrifft.
echo 'blacklist algif_aead' | sudo tee /etc/modprobe.d/cve-2026-31431.conf
sudo rmmod algif_aead 2>/dev/null
CONFIG_CRYPTO_USER_API_AEAD=y das Symbol in vmlinux platziert. Nur ein Kernel-Update (oder ein kpatch-artiger Live-Patch) behebt die Exposition. Das Tool erkennt dies.| Symptom | Ursache | Lösung |
|---|---|---|
changelog: error="apt: exit status 100 ... Changelog unavailable for linux-signed-amd64" | Debian/Ubuntu signierter Kernel; apt-Mirror stellt das Changelog des Quellpakets nicht bereit | Fehler erscheint nur, wenn die Datei auf der Platte zusätzlich zum unzugänglichen Mirror fehlt; apt-doc installieren oder auf den Mirror warten. |
module: ... config_src="" | Keine Kernel-Konfiguration lesbar (kein /boot/config-*, kein /proc/config.gz, /boot nur für Root) | Als Root ausführen oder akzeptieren, dass BuiltIn nicht bestimmt werden kann. Das Urteil kann trotzdem über andere Signale erfolgen. |
mechanism: error="EAFNOSUPPORT" | Kernel ohne CONFIG_CRYPTO_USER_API gebaut, daher ist der Host über AF_ALG nicht verwundbar | Urteil wird LIKELY_NOT_EXPLOITABLE sein. |