CVE-2026-52924: Use-After-Free в SCTP при обработке устаревших cookie
Сводка по уязвимости
CVE ID: CVE-2026-52924
Критичность: КРИТИЧЕСКАЯ (CVSS 9.8)
Компонент: Ядро Linux — SCTP (протокол передачи с управлением потоком)
Тип: Use-After-Free (CWE-416, CWE-825)
Опубликовано: 2026-06-24
Статус: Исправлено
Затронутые версии
- Ядро Linux < 5.10.259
- Ядро Linux < 5.15.210
- Ядро Linux < 6.1.176
- Ядро Linux < 6.6.143
- Ядро Linux < 6.12.94
- Ядро Linux < 6.18.36
- Ядро Linux < 7.0.13
- Ядро Linux < 7.1
Технические детали
Корневая причина
Уязвимость возникает в обработке устаревших пакетов COOKIE-ECHO конечным автоматом SCTP. Проблема связана с некорректной очисткой очереди исходящих потоков при откате ассоциации.
Сценарий атаки
- Нормальная работа: Ассоциация переходит в состояние COOKIE_ECHOED
- Постановка пользовательских данных в очередь: Приложение отправляет данные, которые помещаются в очередь для передачи
- Ошибка устаревшего cookie: Удалённый узел отправляет ошибку Stale Cookie
- Запуск отката: Ассоциация откатывается из состояния COOKIE_ECHOED → COOKIE_WAIT
- Обновление состояния потока:
sctp_stream_update() освобождает старую таблицу потоков и устанавливает новую
- Некорректный указатель:
stream->out_curr по-прежнему указывает на освобождённую запись sctp_stream_out
- Доступ при извлечении из очереди: Когда планировщик пытается извлечь данные (FCFS, RR, PRIO), он обращается к
out_curr->ext
- Use-After-Free: Обращение к освобождённой памяти → крах ядра, обнаруживаемый с помощью KASAN
Проблемный поток кода
sctp_sf_do_5_2_6_stale():
├─ Получение ошибки Stale Cookie
├─ Откат состояния ассоциации
└─ Вызов sctp_stream_update()
├─ Освобождение старой таблицы потоков
├─ Установка новой таблицы потоков
└─ ОШИБКА: stream->out_curr НЕ инвалидируется ❌
Позже при извлечении из очереди:
sctp_sched_fcfs_dequeue():
└─ Доступ к stream->out_curr->ext (ОСВОБОЖДЁННАЯ ПАМЯТЬ) 💥
Пример краха
BUG: KASAN: slab-use-after-free in sctp_sched_fcfs_dequeue+0x13a/0x140
Read of size 8 at addr ff1100004d4d3208 by task mini_poc/9312
CPU: 1 UID: 1001 PID: 9312 Comm: mini_poc Not tainted 7.1.0-rc1-00305-gbd3a4795d574 #5 PREEMPT(full)
Call trace:
sctp_sched_fcfs_dequeue+0x13a/0x140
sctp_outq_flush+0x1603/0x33e0
sctp_do_sm+0x31c9/0x5d30
sctp_assoc_bh_rcv+0x392/0x6f0
sctp_inq_push+0x1db/0x270
sctp_rcv+0x138d/0x3c10
Почему простого обновления out_curr недостаточно
Наивное исправление может заключаться в простой очистке stream->out_curr:
// НЕДОСТАТОЧНОЕ ИСПРАВЛЕНИЕ ❌
stream->out_curr = NULL;
Проблема: Очередь исходящих данных (outqueue) по-прежнему содержит:
- Поставленные в очередь блоки данных, ссылающиеся на старое состояние потока
- Записи очереди повторной передачи, указывающие на старые потоки
- Управляющие блоки, связанные с метаданными старых потоков
Эти устаревшие ссылки по-прежнему вызовут use-after-free при обращении.
Правильное исправление
Решение: Полная очистка очереди исходящих данных ассоциации при обработке устаревшего cookie.
// ПРАВИЛЬНОЕ ИСПРАВЛЕНИЕ ✓
sctp_outq_free(&asoc->outqueue);
Это гарантирует:
- Все ожидающие передачи данные отбрасываются
- Все записи очереди повторной передачи освобождаются
- Кэшированные указатели планировщика (out_curr и др.) инвалидируются
- Состояние потока может быть безопасно перестроено при перезапуске COOKIE_WAIT
- Отсутствуют висячие ссылки на освобождённые записи потоков
Место внедрения
Файл: net/sctp/sm_statefuns.c
Функция: sctp_sf_do_5_2_6_stale()
Добавление: Вызов sctp_outq_free(&asoc->outqueue) перед sctp_stream_update()
enum sctp_disposition sctp_sf_do_5_2_6_stale(...)
{
// ... существующий код ...
// Очистка очереди исходящих данных перед перестроением состояния потока
sctp_outq_free(&asoc->outqueue);
// Теперь безопасно обновлять поток
sctp_stream_update(&asoc->stream, &asoc->c.h_init_tag);
// ... остальная часть функции ...
}
Анализ воздействия
Факторы критичности (CVSS 9.8)
- Вектор атаки: Сетевой (CVSS:3.1/AV:N)
- Сложность атаки: Низкая (CVSS:3.1/AC:L)
- Требуемые привилегии: Отсутствуют (CVSS:3.1/PR:N)
- Взаимодействие с пользователем: Отсутствует (CVSS:3.1/UI:N)
- Область воздействия: Без изменений (CVSS:3.1/S:U)
- Влияние на конфиденциальность: Высокое (CVSS:3.1/C:H)
- Влияние на целостность: Высокое (CVSS:3.1/I:H)
- Влияние на доступность: Высокое (CVSS:3.1/A:H)
Требования для эксплуатации
- Сетевой доступ к целевой системе (открытый порт SCTP)
- Возможность отправки SCTP-пакетов для установления соединения
- Отправка ошибки Stale Cookie в определённый момент (состояние COOKIE_ECHOED)
- Запуск операции извлечения из очереди планировщиком
Сценарии атак
- Отказ в обслуживании: Многократный крах ядра → DoS
- Раскрытие информации: Чтение памяти ядра через UAF
- Повышение привилегий: Возможно через манипуляцию памятью
- Удалённое выполнение кода: Возможно при эксплуатации повреждения памяти
Методы обнаружения
Обнаружение с помощью KASAN (во время выполнения)
# Включение KASAN в конфигурации ядра
CONFIG_KASAN=y
CONFIG_KASAN_GENERIC=y
# Вывод во время выполнения показывает:
BUG: KASAN: slab-use-after-free
Статический анализ
# Поиск небезопасного доступа к stream->out_curr без проверки
grep -r "out_curr->ext" net/sctp/
grep -r "out_curr->" net/sctp/sched*.c
Сетевое обнаружение
- Мониторинг SCTP-пакетов ошибки Stale Cookie (тип 3, код 1)
- Отслеживание паттернов отката соединений
- Оповещение о быстрых переходах COOKIE_ECHOED → COOKIE_WAIT
Стратегии смягчения последствий
Временные меры (до установки исправления)
-
Отключение SCTP: Удаление модуля SCTP или блокировка SCTP-портов (132, 132 UDP)
echo "install sctp /bin/true" >> /etc/modprobe.d/sctp-disable.conf
-
Правила межсетевого экрана: Блокировка SCTP-трафика на сетевой границе
iptables -A INPUT -p sctp -j DROP
-
Версия ядра: Обновление до исправленных версий
- 5.10.259+
- 5.15.210+
- 6.1.176+
- 6.6.143+
- 6.12.94+
- 6.18.36+
- 7.0.13+
- 7.1+ (последняя)
Постоянное исправление
Применение патча ядра, вызывающего sctp_outq_free() в sctp_sf_do_5_2_6_stale().
Ссылки
Рекомендации по тестированию
Модульные тесты
- Проверка, что
sctp_outq_free() корректно инвалидирует out_curr
- Проверка освобождения всех поставленных в очередь данных при outq_free
- Проверка очистки очереди повторной передачи
- Тестирование поведения планировщика после очистки outq
Интеграционные тесты
- Обычный процесс восстановления после устаревшего cookie
- Данные в полёте при получении устаревшего cookie
- Несколько быстрых устаревших cookie подряд
- Различные планировщики SCTP (FCFS, RR, PRIO)
Фаззинг-тестирование
- Отправка SCTP-пакетов с ошибками устаревшего cookie
- Варьирование времени внедрения ошибки
- Варьирование объёма данных в полёте
- Тестирование в условиях высокой нагрузки
Хронология
- 2026-06-24: Публичное раскрытие уязвимости
- Статус: Исправление доступно
- Оценка EPSS: 0,3% (27-й процентиль)
- Низкая вероятность эксплуатации
- Требуются специфические сетевые условия
- Ограниченное количество реальных эксплойтов в индексах
Автор: Elliot
Версия документа: 1.0
Последнее обновление: 2026-09-07
Классификация: Публичная информация