
Исследовательский репозиторий для CVE-2026-74469 (DiagSpill) — переполнение счётчика транспорта пира SCTP в ядре Linux, приводящее к записи за границами буфера, с PoC, анализом первопричины и сведениями о патче.
DiagSpill
Уязвимость в SCTP ядра Linux, вызванная переполнением 16-битного счётчика
транспортов пиров, из-за чего счётчик может переполниться с 65535 до 0.
Во время диагностического дампа SCTP переполненное значение может привести к
недостаточному резервированию полезной нагрузки skb, а затем к записи за
границы буфера данных адреса пира.
Этот репозиторий предназначен только для авторизованных исследований в области безопасности, анализа уязвимостей ядра, сред CTF, отладки ядра и защитного тестирования.
Не используйте код proof-of-concept против систем без явного разрешения.
| Поле | Детали |
|---|---|
| CVE | CVE-2026-74469 |
| Кодовое имя | DiagSpill |
| Компонент | Linux Kernel |
| Подсистема | SCTP / sock_diag |
| Затронутый файл | net/sctp/associola.c |
| Основная функция | sctp_assoc_add_peer() |
| Класс ошибки | Целочисленное переполнение / запись за границы буфера |
| Воздействие | Повреждение памяти ядра |
| Потенциальное воздействие | Локальное повышение привилегий |
| CVSS v3.1 | 7.0 — High |
| Вектор атаки | Локальный |
| Сложность атаки | Высокая |
| Требуемые привилегии | Низкие |
| Взаимодействие с пользователем | Отсутствует |
| Статус | Исправлено |
В рекомендации по CVE для ядра Linux проблема описывается как переполнение
16-битного transport_count в SCTP, за которым следует недостаточный по
размеру выделенный буфер INET_DIAG_PEERS и запись за границы буфера во
время диагностического дампа.
Уязвимый код хранит количество уникальных транспортов пиров в 16-битном счётчике:
transport_count
Каждый вновь добавленный уникальный пир увеличивает счётчик.
Критическая граница:
65535
Добавление ещё одного уникального транспорта вызывает:
65535 + 1
↓
0
Получившееся «обёртывание» создаёт несоответствие между:
transport_count
и:
transport_addr_list
Подсистема диагностики впоследствии доверяет обёрнутому счётчику при вычислении размера буфера ответа, при этом продолжая перебирать полный список адресов пиров.
Уязвимость можно представить как:
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
В исходном рекомендации конкретно указано, что 65 536-й транспортный блок вызывает переполнение счётчика до нуля.
Диагностический код фактически опирается на два разных представления одного и того же состояния.
transport_count
│
▼
payload size
transport_addr_list
│
▼
copy every peer address
После переполнения целого числа:
transport_count = 0
transport_addr_list =
[peer 1]
[peer 2]
[peer 3]
...
[peer 65536]
Таким образом, аллокатор резервирует пространство на основе:
0 peers
в то время как операция копирования всё ещё может обрабатываться:
65536 peer addresses
Это несоответствие приводит к нарушению безопасности памяти.
В рекомендациях по Linux Kernel результирующий диагностический дамп описывается как резервирование пустой полезной нагрузки и последующая запись примерно 8 MiB адресов пиров за пределами хвоста skb.
Концептуально:
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 классифицирует эту уязвимость как CWE-787: запись за границами буфера.
Соответствующий путь можно кратко описать так:
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
Затронутый исходный файл:
net/sctp/associola.c
Объявление о CVE в ядре Linux явно указывает на этот файл.
Исправление в upstream выглядит так:
bd0e9289e2642f6a5c54faad304ce0f41e926d22
Commit:
sctp: prevent peer transport count overflow
Исправление отклоняет нового уникального пира, когда:
transport_count >= U16_MAX
Важно, что проверка выполняется после поиска существующего пира.
Это сохраняет возможность получить уже существующий транспорт, даже когда ассоциация достигла предела.
New peer
│
▼
transport_count++
│
▼
Possible 16-bit wrap
│
▼
Diagnostic size mismatch
│
▼
OOB write