
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 passer 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 du 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.
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 maintient 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
Le débordement résultant crée une incohérence entre :
transport_count
et :
transport_addr_list
Le sous-système de diagnostic fait ensuite confiance au compteur après débordement lors du calcul de la taille du tampon de réponse, tout en parcourant toujours 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 fait passer le compteur à zéro.
Le code de diagnostic s'appuie en réalité 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 sur la base de :
0 peers
tandis que l'opération de copie peut toujours traiter :
65536 peer addresses
Cette incohérence 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 Mio d'adresses de pairs au-delà de la fin 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 cette 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
Le correctif rejette un nouveau pair unique lorsque :
transport_count >= U16_MAX
Point important : la vérification intervient après la recherche du pair existant.
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
New peer
│
▼
Existing peer?
│
┌─┴──────────┐
│ │
YES NO
│ │
▼ ▼
Reuse Check U16_MAX
transport │
▼
Reject at limit
La propriété de sécurité importante est d'empêcher le compteur de déborder, tout en préservant la sémantique normale de recherche d'un pair existant.
La corruption de mémoire peut potentiellement entraîner :
Des recherches publiques publiées après la divulgation rapportent une exploitation en root local dans des conditions spécifiques, tandis que le score d'origine du CNA du noyau Linux utilise AV:L/AC:H/PR:L/UI:N.
La vulnérabilité est également décrite comme potentiellement atteignable à distance dans des circonstances très spécifiques de configuration SCTP/adresses, mais cela ne doit pas être considéré comme équivalent à une vulnérabilité généralement exploitable à distance.
Topologie isolée recommandée :
┌───────────────────────────────────────────┐
│ Linux VM │
│ │
│ ┌───────────────────┐ │
│ │ SCTP Association │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ Multiple SCTP │ │
│ │ Peer Transports │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ SCTP sock_diag │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ INET_DIAG_PEERS │
│ │
└───────────────────────────────────────────┘
Outils utiles :
ip sctp
ss
ss -a
ss -A sctp
dmesg -w
gdb
pwndbg
crash
Vérifier le support SCTP :
lsmod | grep sctp
Vérifier la configuration du noyau :
grep CONFIG_IP_SCTP /boot/config-$(uname -r)
Vérifier le noyau en cours d'exécution :
uname -r
Vérifier la configuration SCTP :
grep -E 'CONFIG_IP_SCTP|CONFIG_SCTP' \
/boot/config-$(uname -r)
Vérifier les modules SCTP chargés :
lsmod | grep -i sctp
Inspecter les sockets SCTP :
ss -A sctp
Pour une recherche contrôlée sur le noyau :
01. Build vulnerable kernel
↓
02. Boot isolated VM
↓
03. Enable SCTP
↓
04. Create controlled SCTP association
↓
05. Populate unique peer transports
↓
06. Reach transport-count boundary
↓
07. Trigger SCTP diagnostic dump
↓
08. Monitor skb diagnostics
↓
09. Capture kernel behavior
↓
10. Apply upstream fix
↓
11. Repeat test
↓
12. Compare vulnerable vs patched
Surveiller la sortie du noyau :
sudo dmesg -w
Pour le débogage :
gdb vmlinux
ou :
pwndbg vmlinux
CVE-2026-74469-DiagSpill/
│
├── README.md
│
├── exploit/
│ ├── poc.c
│ └── Makefile
│
├── analysis/
│ ├── root-cause.md
│ ├── sctp-transport-count.md
│ ├── sock-diag.md
│ ├── skb-overflow.md
│ └── patch-analysis.md
│
├── kernel/
│ ├── vulnerable/
│ └── patched/
│
├── lab/
│ ├── setup.sh
│ ├── cleanup.sh
│ └── topology.md
│
├── screenshots/
│
├── docs/
│ └── research-notes.md
│
└── LICENSE
L'atténuation principale consiste à mettre à niveau vers un noyau contenant le correctif amont.
Pour Debian/Kali :
sudo apt update
sudo apt full-upgrade
Puis redémarrer :
sudo reboot
Vérifier :
uname -r
Si SCTP n'est pas nécessaire, les administrateurs peuvent également envisager
de désactiver la fonctionnalité SCTP affectée en fonction de leur environnement
et de leurs exigences opérationnelles. La recherche publique liste
spécifiquement la désactivation de SCTP / sctp_diag comme atténuation
immédiate lorsque ces composants ne sont pas utilisés.
L'annonce stable amont liste ces versions corrigées :
Ces versions proviennent de l'annonce CVE du noyau Linux ; les distributions peuvent rétroporter le correctif dans des paquets dont la numérotation de version diffère.
Un compteur sur 16 bits a un maximum absolu :
U16_MAX = 65535
Le code sensible à la sécurité doit gérer explicitement cette limite.
La taille utilisée pour allouer un tampon doit correspondre au nombre d'objets effectivement copiés dedans.
Les API de diagnostic du noyau peuvent devenir des surfaces d'attaque par corruption de mémoire lorsque l'état interne devient incohérent.
La primitive d'origine est un débordement d'entier, mais l'impact de sécurité résultant est une écriture hors limites dans le noyau.
Les associations SCTP peuvent contenir de grandes collections de transports pairs, ce qui rend les limites de compteurs et la logique de gestion de listes critiques pour la sécurité.
net/sctp/associola.csctp_assoc_add_peer()sctp: prevent peer transport count overflowbd0e9289e2642f6a5c54faad304ce0f41e926d22Linux Kernel · SCTP · sock_diag · OOB Write · Kernel Security
Research • Analyze • Reproduce • Harden
| 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 locale de privilèges |
| CVSS v3.1 | 7.0 — Élevé |
| Vecteur d'attaque | Local |
| Complexité d'attaque | Élevée |
| Privilèges requis | Faibles |
| Interaction utilisateur | Aucune |
| Statut | Corrigé |
| Propriété de sécurité | Vulnérable | Corrigé |
|---|
| Limite de transport sur 16 bits appliquée | ❌ | ✅ |
| Débordement du compteur empêché | ❌ | ✅ |
| Pairs existants toujours utilisables | ✅ | ✅ |
| Taille de charge utile de diagnostic fiable | ❌ | ✅ |
| Écriture skb hors limites empêchée | ❌ | ✅ |
| Corruption de la mémoire du noyau atténuée | ❌ | ✅ |
| Branche | Version corrigée |
|---|
| 5.10 | 5.10.265 |
| 5.15 | 5.15.216 |
| 6.1 | 6.1.183 |
| 6.6 | 6.6.151 |
| 6.12 | 6.12.103 |
| 6.18 | 6.18.44 |
| 7.1 | 7.1.8 |
| 7.2 | 7.2-rc6 |