
Исследовательский репозиторий для CVE-2026-74469 (DiagSpill) — переполнение счётчика транспорта пира SCTP в ядре Linux, приводящее к записи за границами буфера, с PoC, анализом первопричины и сведениями о патче.
DiagSpill
Уязвимость SCTP в ядре Linux, вызванная переполнением 16-битного счётчика
peer-транспортов, позволяющим счётчику обернуться с 65535 до 0. Во время
диагностического дампа SCTP обёрнутое значение может привести к недостаточному
резервированию полезной нагрузки skb, а затем к записи данных peer-адресов за
пределами границ буфера.
Этот репозиторий предназначен только для авторизованных исследований в области безопасности, анализа уязвимостей ядра, сред CTF, отладки ядра и защитного тестирования.
Не используйте код proof-of-concept против систем без явного разрешения.
В рекомендации по CVE для ядра Linux эта проблема описывается как переполнение
16-битного transport_count в SCTP, за которым следует недостаточное выделение
памяти для INET_DIAG_PEERS и запись за пределами границ во время
диагностического дампа.
Уязвимый код хранит количество уникальных peer-транспортов в 16-битном счётчике:
transport_count
Каждый добавленный уникальный peer увеличивает счётчик.
Критическая граница:
65535
Добавление ещё одного уникального транспорта приводит к:
65535 + 1
↓
0
Возникающее переполнение создаёт несоответствие между:
transport_count
и:
transport_addr_list
Диагностическая подсистема впоследствии доверяет обёрнутому счётчику при вычислении размера буфера ответа, при этом продолжая перебирать полный список peer-адресов.
Уязвимость можно представить так:
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
В upstream-рекомендации прямо указано, что 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 описывается, что результирующий диагностический дамп резервирует пустую полезную нагрузку, а затем записывает примерно 8 MiB peer-адресов за пределами хвоста 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
Коммит:
sctp: prevent peer transport count overflow
Исправление отклоняет новый уникальный peer, когда:
transport_count >= U16_MAX
Важно, что проверка выполняется после поиска существующего peer.
Это сохраняет возможность получить уже существующий транспорт, даже когда ассоциация достигла предела.
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
Важное свойство безопасности — предотвращение любого переполнения счётчика при сохранении обычной семантики поиска существующего peer.
Повреждение памяти потенциально может привести к:
Публичные исследования, опубликованные после раскрытия, сообщают об эксплуатации с получением локального root при определённых условиях, тогда как исходная оценка Linux Kernel CNA использует AV:L/AC:H/PR:L/UI:N.
Уязвимость также описывается как потенциально достижимая удалённо при очень специфических обстоятельствах конфигурации SCTP/адресов, но это не следует рассматривать как эквивалент общедоступной удалённо эксплуатируемой уязвимости.
Рекомендуемая изолированная топология:
┌───────────────────────────────────────────┐
│ Linux VM │
│ │
│ ┌───────────────────┐ │
│ │ SCTP Association │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ Multiple SCTP │ │
│ │ Peer Transports │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ SCTP sock_diag │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ INET_DIAG_PEERS │
│ │
└───────────────────────────────────────────┘
Полезные инструменты:
ip sctp
ss
ss -a
ss -A sctp
dmesg -w
gdb
pwndbg
crash
Проверка поддержки SCTP:
lsmod | grep sctp
Проверка конфигурации ядра:
grep CONFIG_IP_SCTP /boot/config-$(uname -r)
Проверка работающего ядра:
uname -r
Проверка конфигурации SCTP:
grep -E 'CONFIG_IP_SCTP|CONFIG_SCTP' \
/boot/config-$(uname -r)
Проверка загруженных модулей SCTP:
lsmod | grep -i sctp
Просмотр сокетов SCTP:
ss -A sctp
Для контролируемых исследований ядра:
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
Мониторинг вывода ядра:
sudo dmesg -w
Для отладки:
gdb vmlinux
или:
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
Основная мера защиты — обновление до ядра, содержащего upstream-исправление.
Для Debian/Kali:
sudo apt update
sudo apt full-upgrade
Затем перезагрузка:
sudo reboot
Проверка:
uname -r
Если SCTP не требуется, администраторы также могут рассмотреть отключение
затронутой функциональности SCTP в соответствии со своей средой и
эксплуатационными требованиями. В публичном исследовании отключение SCTP /
sctp_diag прямо указано как немедленная мера защиты, когда эти компоненты не
используются.
В объявлении upstream stable перечислены следующие исправленные версии:
Эти версии взяты из объявления CVE для ядра Linux; дистрибутивы могут перенести исправление в пакеты с другой нумерацией версий.
16-битный счётчик имеет жёсткий максимум:
U16_MAX = 65535
Код, критичный для безопасности, должен явно обрабатывать эту границу.
Размер, используемый для выделения буфера, должен соответствовать количеству объектов, фактически скопированных в него.
Диагностические API ядра могут становиться поверхностью атаки для повреждения памяти, когда внутреннее состояние становится несогласованным.
Исходный примитив — целочисленное переполнение, но результирующее влияние на безопасность — запись за пределами границ в ядре.
Ассоциации SCTP могут содержать большие коллекции peer-транспортов, что делает ограничения счётчиков и логику управления списками критичными для безопасности.
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
| Поле | Детали |
|---|
| CVE | CVE-2026-74469 |
| Кодовое имя | DiagSpill |
| Компонент | Linux Kernel |
| Подсистема | SCTP / sock_diag |
| Затронутый файл | net/sctp/associola.c |
| Основная функция | sctp_assoc_add_peer() |
| Класс ошибки | Целочисленное переполнение / запись за границами |
| Влияние | Повреждение памяти ядра |
| Потенциальное влияние | Локальное повышение привилегий |
| CVSS v3.1 | 7.0 — High |
| Вектор атаки | Локальный |
| Сложность атаки | Высокая |
| Требуемые привилегии | Низкие |
| Взаимодействие с пользователем | Отсутствует |
| Статус | Исправлено |
| Свойство безопасности | Уязвимо | Исправлено |
|---|
| Ограничение 16-битного транспорта соблюдается | ❌ | ✅ |
| Переполнение счётчика предотвращено | ❌ | ✅ |
| Существующие peer остаются доступными | ✅ | ✅ |
| Размер диагностической нагрузки надёжен | ❌ | ✅ |
| Запись skb за пределами границ предотвращена | ❌ | ✅ |
| Повреждение памяти ядра устранено | ❌ | ✅ |
| Ветка | Исправленная версия |
|---|
| 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 |