FlawOpen

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

● CVE-2026-31431 · CVSS 7.8 · Haute
Recherche · FlawOpen

CVE-2026-31431 : faille Copy Fail du noyau Linux

Copy Fail est une élévation locale de privilèges dans le chemin AEAD d’AF_ALG sous Linux. Une optimisation in-place confondait les mappages source et destination ; le correctif amont rétablit le traitement out-of-place et la CISA inscrit le CVE dans KEV.[1], [2], [5]

💡 Explication en Langage Simple (ELI5)

Imaginez un bibliothécaire chargé d’annoter une copie, mais dont le raccourci mène le crayon au livre original. Le raccourci in-place permettait à une écriture destinée au résultat d’atteindre une autre page mappée. Le correctif traite séparément source et destination.[3], [8]

Concepts Clés et Termes

AF_ALG
Interface de sockets cryptographiques Linux pour les processus utilisateur.[8], [3]
AEAD
Chiffrement authentifié avec données associées : chiffre les données et authentifie des métadonnées supplémentaires non chiffrées.[8]
algif_aead
Implémentation AF_ALG des algorithmes AEAD, y compris le chemin source/destination vulnérable.[3]
Page cache
Cache mémoire du noyau pour les fichiers ; une écriture dans une page mappée peut affecter les lectures avant l’écriture disque.[8]
CWE-1288 / CWE-669
NVD répertorie CWE-1288 avec redhat-SADP comme source du mappage ; la page de Red Hat répertorie également cette CWE. L’alerte du Centre canadien pour la cybersécurité classe le problème sous CWE-669. Ce sont des classifications attribuées à des sources distinctes, et non des étiquettes interchangeables.[11], [7], [5], [9], [10]

Correspondances de référentiels

Analyse de Cause Racine

La modification de 2017 72548b093ee3 a introduit une optimisation in-place dans algif_aead. Source et destination peuvent provenir de mappages différents. authencesn peut écrire des données temporaires hors de la sortie prévue ; la scatterlist in-place pouvait atteindre une page de cache associée à un fichier fourni via splice(). L’avis CVE Linux décrit la correction comme un retour au traitement out-of-place tout en conservant la copie des données associées. Accès local et chemin vulnérable activé sont nécessaires. CVSS 7,8 (AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) ; pas d’entrée distante sans authentification.[1], [3], [8], [7], [9], [10]

Déroulement de l'Attaque Étape par Étape

Étape 1

Un processus local atteint l’API

Un processus local demande une opération AEAD via AF_ALG, transmise à algif_aead. Une requête distante seule n’atteint pas cette interface locale.[8], [7]

Étape 2

Le chemin utilise in-place

L’implémentation organise source et destination comme si elles pouvaient partager des pages, alors que leurs mappages diffèrent.[8], [3]

Étape 3

L’écriture dépasse la sortie

Pendant authencesn, des données temporaires peuvent sortir de la zone prévue et atteindre le cache d’un fichier transmis par splice().[8]

Étape 4

Le noyau sépare les mappages

Le correctif supprime la complexité in-place inutile, copie les données associées et revient au traitement out-of-place.[1], [3]

Code Source : Vulnérable vs Sécurisé

Résumé conceptuel, pas code littéral du noyau ni correctif compilable. L’avis amont indique que le correctif revient en grande partie sur 72548b093ee3, sauf la copie des données associées, car les mappages source et destination diffèrent.[3], [2]

Extrait source: crypto/algif_aead.c (_aead_recvmsg)

IMPLÉMENTATION VULNÉRABLE
/* Avant le correctif : effectuer l’opération cryptographique sur place. */
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);
    /* Construire et chaîner une scatterlist TX pour le tag d’authentification. */
    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);
PATCH SÉCURISÉ ET ROBUSTE
/* Après le correctif : conserver une scatterlist source par requête. */
processed = used + ctx->aead_assoclen;
areq->tsgl_entries = af_alg_count_tsgl(sk, processed);
/* Allouer et initialiser areq->tsgl, puis y ajouter les pages TX. */
af_alg_pull_tsgl(sk, processed, areq->tsgl);
tsgl_src = areq->tsgl;

/* Copier les données associées tout en séparant la source de la destination. */
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);

Liste de Contrôle de Sécurité pour l'Ingénierie

Sources