
Dépôt de recherche pour CVE-2026-74469 (DiagSpill), un débordement de compteur de transport pair SCTP du noyau Linux provoquant une écriture hors limites, avec PoC, analyse de la cause racine et détails du correctif.
DiagSpill
Une vulnérabilité SCTP du noyau Linux causée par un débordement d'un compteur de transports pairs sur 16 bits, permettant au compteur de revenir de 65535 à 0. Lors d'un vidage de diagnostic SCTP, la valeur après débordement peut entraîner une réservation insuffisante de la charge utile skb, suivie d'une écriture hors limites des données d'adresse des pairs.
Ce dépôt est destiné uniquement à la recherche en sécurité autorisée, à l'analyse de vulnérabilités du noyau, aux environnements CTF, au débogage du noyau et aux tests défensifs.
N'utilisez pas le code de preuve de concept contre des systèmes sans autorisation explicite.
| Champ | Détails |
|---|---|
| CVE | CVE-2026-74469 |
| Nom de code | DiagSpill |
| Composant | Noyau Linux |
| Sous-système | SCTP / sock_diag |
| Fichier affecté | net/sctp/associola.c |
| Fonction principale | sctp_assoc_add_peer() |
| Classe de bug | Débordement d'entier / écriture hors limites |
| Impact | Corruption de la mémoire du noyau |
| Impact potentiel | Élévation de privilèges locale |
| CVSS v3.1 | 7.0 — Élevé |
| Vecteur d'attaque | Local |
| Complexité d'attaque | Élevée |
| Privilèges requis | Faibles |
| Interaction utilisateur | Aucune |
| Statut | Corrigé |
L'avis CVE du noyau Linux décrit le problème comme un débordement de
transport_count sur 16 bits dans SCTP, suivi d'une allocation INET_DIAG_PEERS
de taille insuffisante et d'une écriture hors limites lors du vidage de diagnostic.
Le code vulnérable conserve le nombre de transports pairs uniques dans un compteur sur 16 bits :
transport_count
Chaque nouveau pair unique ajouté incrémente le compteur.
La limite critique est :
65535
L'ajout d'un autre transport unique provoque :
65535 + 1
↓
0
L'enroulement qui en résulte crée une incohérence entre :
transport_count
et :
transport_addr_list
Le sous-système de diagnostic fait ensuite confiance au compteur encapsulé lors du calcul de la taille du tampon de réponse, tout en parcourant encore la liste complète des adresses des pairs.
La vulnérabilité peut être représentée comme suit :
SCTP Association
│
▼
Add unique peers
│
▼
transport_count
uint16_t
│
▼
65,535 peers
│
▼
+ 1 unique peer
│
▼
Integer wrap
│
▼
transport_count = 0
│
▼
SCTP sock_diag
│
▼
Reserve incorrect payload
│
▼
Iterate complete peer list
│
▼
Out-of-bounds skb write
L'avis amont indique spécifiquement que le 65 536e transport ramène le compteur à zéro.
Le code de diagnostic repose effectivement sur deux vues différentes du même état.
transport_count
│
▼
payload size
transport_addr_list
│
▼
copy every peer address
Après le débordement de l'entier :
transport_count = 0
transport_addr_list =
[peer 1]
[peer 2]
[peer 3]
...
[peer 65536]
L'allocateur réserve donc de l'espace en fonction de :
0 peers
tandis que l'opération de copie peut encore traiter :
65536 peer addresses
Cette inadéquation produit la violation de sûreté mémoire.
L'avis du noyau Linux décrit le vidage de diagnostic résultant comme réservant une charge utile vide puis écrivant environ 8 MiB d'adresses de pairs au-delà de la queue du skb.
Conceptuellement :
Expected skb:
┌───────────────────────────────┐
│ INET_DIAG header │
├───────────────────────────────┤
│ Peer addresses │
└───────────────────────────────┘
▲
│
valid end
Actual vulnerable state:
┌───────────────────────────────┐
│ INET_DIAG header │
└───────────────────────────────┘
▲
│
skb tail
↓
Peer address writes
↓
Peer address writes
↓
Peer address writes
↓
OUT-OF-BOUNDS WRITE
Red Hat classe la faille comme CWE-787 : écriture hors limites.
Le chemin pertinent peut être résumé comme suit :
SCTP association
│
▼
sctp_assoc_add_peer()
│
▼
transport_count++
│
▼
16-bit overflow
│
▼
SCTP sock_diag
│
▼
INET_DIAG_PEERS
│
▼
skb payload reservation
│
▼
transport_addr_list iteration
│
▼
Out-of-bounds write
Le fichier source affecté est :
net/sctp/associola.c
L'annonce CVE du noyau Linux identifie explicitement ce fichier.
Le correctif amont est :
bd0e9289e2642f6a5c54faad304ce0f41e926d22
Commit :
sctp: prevent peer transport count overflow
La correction rejette un nouveau pair unique lorsque :
transport_count >= U16_MAX
Il est important de noter que la vérification a lieu après la recherche de pairs existants.
Cela préserve la capacité de récupérer un transport déjà existant même lorsque l'association a atteint la limite.
New peer
│
▼
transport_count++
│
▼
Possible 16-bit wrap
│
▼
Diagnostic size mismatch
│
▼
OOB write