FlawOpen

flawopen.com/Teardowns/cve-2026-31431-linux-algif-aead-copy-fail

● CVE-2026-31431 · CVSS 7.8 · Hoch
Sicherheitsforschung · FlawOpen

CVE-2026-31431: Copy-Fail-Fehler im Linux-Kernel

Copy Fail ist eine lokale Rechteausweitung im AEAD-Pfad von Linux AF_ALG. Eine In-place-Optimierung verwechselte Quell- und Ziel-Mappings; der Upstream-Fix stellt Out-of-place-Verarbeitung wieder her, und CISA führt die CVE in KEV.[1], [2], [5]

💡 Einfache Erklärung (ELI5)

Eine Bibliothekarin soll eine Kopie markieren, doch eine Abkürzung führt den Stift zum Originalbuch. Die In-place-Abkürzung ließ einen für das Ergebnis bestimmten Schreibvorgang eine andere gemappte Seite erreichen. Der Fix verarbeitet Quelle und Ziel getrennt.[3], [8]

Kernkonzepte & Begriffe

AF_ALG
Linux-Socket-Schnittstelle für Kryptografie aus Benutzerprozessen.[8], [3]
AEAD
Authenticated Encryption with Associated Data: verschlüsselt Daten und authentifiziert zusätzliche unverschlüsselte Metadaten.[8]
algif_aead
AF_ALG-Implementierung für AEAD einschließlich des anfälligen Quell-/Zielpfads.[3]
Page cache
Kernel-Cache für Dateiinhalte; Schreibzugriffe auf gemappte Seiten können Lesevorgänge vor dem Zurückschreiben beeinflussen.[8]
CWE-1288 / CWE-669
NVD führt CWE-1288 mit redhat-SADP als Quelle der Zuordnung; auch die Red-Hat-Seite nennt diese CWE. Der Hinweis des Canadian Centre for Cyber Security ordnet das Problem CWE-669 zu. Das sind quellenspezifische Klassifizierungen, keine austauschbaren Bezeichnungen.[11], [7], [5], [9], [10]

Framework-Zuordnungen

Ursachenanalyse

Die Änderung 72548b093ee3 von 2017 führte eine In-place-Optimierung in algif_aead ein. Quelle und Ziel können aus unterschiedlichen Mappings stammen. authencesn kann temporäre Daten außerhalb der Ausgabe schreiben; die In-place-Scatterlist konnte eine über splice() bereitgestellte Page-Cache-Seite erreichen. Der Linux-CVE-Hinweis beschreibt die Behebung als Rückkehr zur Out-of-place-Verarbeitung bei erhaltener Kopie der Associated Data. Lokaler Zugriff und ein aktivierter anfälliger Pfad sind erforderlich. CVSS 7,8 (AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H); kein unauthentifizierter Fernzugriff.[1], [3], [8], [7], [9], [10]

Schritt-für-Schritt Angriffsablauf

Schritt 1

Lokaler Prozess erreicht die API

Ein lokaler Prozess fordert über AF_ALG eine AEAD-Operation an, die algif_aead verarbeitet. Eine Remote-Anfrage allein erreicht diese lokale Schnittstelle nicht.[8], [7]

Schritt 2

Datenpfad nutzt In-place

Die Implementierung ordnet Quelle und Ziel so an, als könnten sie Seiten sicher teilen, obwohl ihre Mappings verschieden sind.[8], [3]

Schritt 3

Schreibvorgang verlässt den Ausgabebereich

Während authencesn können temporäre Daten die vorgesehene Ausgabe überschreiten und eine Cache-Seite eines über splice() gelieferten Dateiinhalts erreichen.[8]

Schritt 4

Kernel trennt Mappings wieder

Der Fix entfernt unnötige In-place-Komplexität, kopiert Associated Data und kehrt zur Out-of-place-Verarbeitung zurück.[1], [3]

Quellcode: Verwundbar vs. Sicher

Konzeptionelle Zusammenfassung, kein wörtlicher Kernel-Code und kein kompilierbarer Patch. Laut Upstream-Hinweis macht der Fix 72548b093ee3 größtenteils rückgängig, behält aber die Kopie der Associated Data bei, weil die Mappings verschieden sind.[3], [2]

Quelltextauszug: crypto/algif_aead.c (_aead_recvmsg)

VERWUNDBARE IMPLEMENTIERUNG
/* Vor der Korrektur: Die Kryptografieoperation direkt im selben Puffer ausführen. */
rsgl_src = areq->first_rsgl.sgl.sg;

if (ctx->enc) {
    memcpy_sglist(areq->first_rsgl.sgl.sg, tsgl_src, processed);
    af_alg_pull_tsgl(sk, processed, NULL, 0);
} else {
    memcpy_sglist(areq->first_rsgl.sgl.sg, tsgl_src, outlen);
    /* Eine TX-Scatterlist für den Authentifizierungs-Tag aufbauen und verketten. */
    areq->tsgl_entries = af_alg_count_tsgl(sk, processed, processed - as);
    /* ... */
}

aead_request_set_crypt(&areq->cra_u.aead_req, rsgl_src,
                       areq->first_rsgl.sgl.sg, used, ctx->iv);
GEHÄRTETER SICHERHEITS-PATCH
/* Nach der Korrektur: Eine Quell-Scatterlist pro Anfrage behalten. */
processed = used + ctx->aead_assoclen;
areq->tsgl_entries = af_alg_count_tsgl(sk, processed);
/* areq->tsgl reservieren und initialisieren, dann die TX-Seiten dort eintragen. */
af_alg_pull_tsgl(sk, processed, areq->tsgl);
tsgl_src = areq->tsgl;

/* Zugehörige Daten kopieren, Quelle und Ziel jedoch getrennt halten. */
rsgl_src = areq->first_rsgl.sgl.sg;
memcpy_sglist(rsgl_src, tsgl_src, ctx->aead_assoclen);
aead_request_set_crypt(&areq->cra_u.aead_req, tsgl_src,
                       areq->first_rsgl.sgl.sg, used, ctx->iv);

Checkliste für Engineering & Systemsicherheit

Quellen