CVE-2026-97562 в Linux Kernel: use-after-free в SMB DFS и исправление

CVE: CVE-2026-97562
Продукт: Linux Kernel
Дата публикации: 25.09.2026
Критичность: HIGH
CVSS: 7.5 (3.1)
EPSS: 0,41%; процентиль 32,48%
CISA KEV: нет подтверждения в каталоге CISA KEV

Краткое описание​


В клиенте SMB ядра Linux обнаружена race condition при работе с DFS-ссылками. Функция tcon_super_cb() сохраняет указатель на superblock без активного референса, а __cifs_get_super() устанавливает его только после освобождения s_umount в iterate_supers_type(). Параллельное истечение DFS automount может освободить superblock до использования в cifs_sb_active(), что приводит к use-after-free и сбою ядра.

Основные характеристики​


Ошибка возникает в SMB-клиенте Linux Kernel при совпадении failover и освобождении DFS-суперблока. Уязвимость подтверждена детерминированным KASAN-тестом, а публичная эксплуатация на реальных системах не задокументирована.

  • Тип ошибки: use-after-free (slab-use-after-free)
  • CVSS: CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H — 7.5 HIGH
  • Вектор атаки: удалённый, без необходимости привилегий и взаимодействия с пользователем
  • Эксплуатация: подтверждена KASAN-тестом; публичный PoC для реальных систем не задокументирован
  • EPSS: 0,41% (процентиль 32,48%)

Какие продукты и версии затронуты​


Затронут Linux Kernel с включённым клиентом SMB и поддержкой DFS.

  • Файл: fs/smb/client/misc.c
  • Функции: tcon_super_cb(), __cifs_get_super(), iterate_supers_type(), cifs_sb_active()
  • Сценарий: автоматическое монтирование DFS и failover SMB-соединений
  • Версии ядра: конкретные диапазоны версий в источниках не указаны; исправление распространено на stable-ветки через commits d806d5a85dcbe2a0f181b2f0f9f61ddfbefa1818 и его порты
  • Платформы: все системы Linux, использующие SMB-клиент с DFS-поддержкой

Причина уязвимости​


Ошибка связана с несогласованным управлением референсами superblock в клиенте SMB.

Функция tcon_super_cb() вызывается как колбэк и сохраняет указатель на superblock в структуре sd. Активный референс через cifs_sb_active() устанавливается не в момент сохранения указателя, а позже — уже после выхода из iterate_supers_type(), когда общий референс s_umount освобождён.

В окне между сохранением указателя и установкой активного референса другой поток может выполнить DFS automount expiry. Этот процесс освобождает superblock. Когда __cifs_get_super() затем вызывает cifs_sb_active() на уже освобождённом объекте, возникает use-after-free.

Исправление переносит вызов cifs_sb_active() внутрь колбэка tcon_super_cb(), пока iterate_supers_type() ещё удерживает общий референс s_umount. Соответствующий release остаётся в cifs_put_tcp_super().

Как работает атака​


Уязвимость реализуется через race condition между двумя потоками ядра.

Первый поток выполняет failover SMB-соединения и вызывает __cifs_get_super(). Внутри этой функции вызывается iterate_supers_type() с колбэком tcon_super_cb(). Колбэк находит подходящий superblock по критериям DFS (совпадение dfs_root_ses, server и origin_fullpath) и сохраняет указатель в sd.sb.

Второй поток параллельно обрабатывает истечение DFS automount. Он освобождает superblock, потому что активный референс ещё не был установлен.

После завершения iterate_supers_type() функция __cifs_get_super() получает указатель из sd.sb и вызывает cifs_sb_active(). Если к этому моменту superblock уже освобождён, вызов работает с валидным по памяти, но логически недействительным объектом.

KASAN фиксирует ошибку как slab-use-after-free in cifs_sb_active+0x77/0x80.

Условия успешной эксплуатации​


Для воспроизведения ошибки необходимы следующие условия:

  • Включённый SMB-клиент в ядре Linux
  • Поддержка DFS и автоматическое монтирование DFS-ссылок
  • Наличие failover-сценария, вызывающего __cifs_get_super()
  • Параллельное истечение DFS automount во время выполнения failover
  • Доступ к системе или возможность инициировать SMB-failover и DFS-expiry одновременно

Возможный сценарий атаки​


Система подключена к SMB-серверу через DFS-ссылку. Во время переключения на резервный сервер ядро запускает процесс failover.

В этот момент другой поток обрабатывает истечение автоматического монтирования DFS. Указатель superblock сохраняется в структуре данных, но активный референс устанавливается с задержкой.

Если освобождение superblock происходит раньше установки референса, функция cifs_sb_active() обращается к уже выделенной памяти. Это приводит к повреждению ядра и возможному падению системы.

Сценарий воспроизводится детерминированно в тестовой среде с KASAN включённым.

Есть ли публичный эксплойт​


Доступны исходные коды исправления и описание ошибки.

  • Commit: d806d5a85dcbe2a0f181b2f0f9f61ddfbefa1818 — исходный фикс
  • Порт на stable: 5b01a8c0209690db75341528ec53fd87e0ac1460 — порт
  • Порт на stable: a6b6561522212af852c9ad8a7dca8d59ef2c7377 — порт
  • Порт на stable: ea43a15cea36dc5ddd832be5bddeac7dd804cbcf — порт

Публичный PoC в виде готового эксплойта для реальных систем не подтверждён. Есть детерминированный KASAN-тест, воспроизводящий race condition.

Подтверждённая эксплуатация на продакшн-системах не задокументирована.

Признаки эксплуатации​


Специфичные IOC для этой уязвимости не предоставлены в источниках. Ниже приведены общие точки контроля, которые можно использовать при подозрении на эксплуатацию.

  • Внезапное падение ядра с сообщениями KASAN или oops в dmesg/journalctl
  • Повторяющиеся ошибки SMB failover и DFS automount expiry одновременно
  • Аномальная активность в логировании SMB-клиента (fs/smb/client/misc.c)
  • Повышенная загрузка ядра во время операций с DFS-ссылками

Эти признаки неспецифичны и могут возникать при других сбоях. Для подтверждения эксплуатации требуется корреляция с конкретным сценарием failover + expiry.

Как обнаружить атаку​


Для обнаружения уязвимости и её возможной эксплуатации используйте следующие методы.

  • Проверка версии ядра: uname -r, uname -a, cat /proc/version
  • Мониторинг системного журнала на ошибки KASAN, oops, panic с упоминанием cifs_sb_active или slab-use-after-free
  • Анализ логов SMB-клиента на частые failover и DFS automount expiry
  • Проверка наличия исправленных commits в ядре: d806d5a85dcbe2a0f181b2f0f9f61ddfbefa1818 или его порты
  • Включение KASAN в тестовых средах для воспроизведения race condition

Команды проверки:

Bash:
uname -r
uname -a
cat /proc/version
git log --oneline | grep d806d5a85dcbe2a0f181b2f0f9f61ddfbefa1818
git log --oneline | grep 5b01a8c0209690db75341528ec53fd87e0ac1460

Как проверить свою версию​


Проверьте текущую версию ядра и наличие исправления.

  • uname -r — краткая версия ядра
  • uname -a — полная информация о ядре
  • cat /proc/version — версия из /proc
  • git log --oneline | grep d806d5a85dcbe2a0f181b2f0f9f61ddfbefa1818 — наличие исходного фикса в tree
  • git log --oneline | grep 5b01a8c0209690db75341528ec53fd87e0ac1460 — наличие порта на stable

Если вы используете дистрибутив, проверьте пакет ядра через менеджер пакетов:

Bash:
dpkg -l | grep linux-image  # Debian/Ubuntu
rpm -qa | grep kernel        # RHEL/CentOS/Fedora

Исправление​


Исправление распространено через commits в Linux Kernel stable tree.

  • Исходный фикс: d806d5a85dcbe2a0f181b2f0f9f61ddfbefa1818 — commit
  • Порт на stable: 5b01a8c0209690db75341528ec53fd87e0ac1460 — commit
  • Порт на stable: a6b6561522212af852c9ad8a7dca8d59ef2c7377 — commit
  • Порт на stable: ea43a15cea36dc5ddd832be5bddeac7dd804cbcf — commit

Рекомендации:

  • Обновите ядро до версии, содержащей один из портов
  • Если обновление не возможно немедленно, рассмотрите временные меры из раздела «Временные меры защиты»
  • Проверьте наличие исправления после обновления: git log --oneline | grep d806d5a85dcbe2a0f181b2f0f9f61ddfbefa1818

Ссылки на исходники:


Временные меры защиты​


При невозможности немедленного обновления ядра можно снизить вероятность срабатывания race condition.

  • Отключите DFS automount, если это допустимо в вашей конфигурации
  • Ограничьте частоту SMB failover через настройку таймаутов и повторных попыток
  • Изолируйте системы с критичными SMB/DFS-соединениями от нагрузок, вызывающих одновременный failover и expiry
  • Включите KASAN в тестовых средах для раннего обнаружения проблем
  • Мониторинг системного журнала на ошибки KASAN и oops

Эти меры не устраняют уязвимость, но снижают вероятность её срабатывания.

Не используйте временные меры как замену обновлению ядра.

Как проверить устранение уязвимости​


После обновления проверьте наличие исправления.

  • uname -r — убедитесь, что версия ядра соответствует релизу с исправлением
  • git log --oneline | grep d806d5a85dcbe2a0f181b2f0f9f61ddfbefa1818 — наличие исходного фикса
  • git log --oneline | grep 5b01a8c0209690db75341528ec53fd87e0ac1460 — наличие порта на stable
  • Проверьте логи после обновления: нет новых ошибок KASAN или oops с упоминанием cifs_sb_active
  • Проведите повторный KASAN-тест в тестовой среде, если доступен

Если исправление не найдено, обновите ядро до более поздней версии или обратитесь к дистрибутору за патчем.

Вывод​


CVE-2026-97562 — это use-after-free в клиенте SMB Linux Kernel, связанный с race condition при DFS automount expiry и failover. Ошибка подтверждена KASAN-тестом и исправлена переносом установки активного референса внутрь колбэка.

Риск связан с падением ядра и потенциальным повреждением памяти. Эксплуатация возможна при наличии SMB/DFS-соединений и параллельного failover + expiry.

Обновление ядра до версии с исправлением — основной способ устранения уязвимости. Временные меры снижают вероятность, но не заменяют патч.

Официальные источники​


  1. NVD — CVE-2026-97562
  2. FIRST EPSS — CVE-2026-97562
  3. smb: client: pin DFS superblock in iterator callback - kernel/git/stable/linux.git - Linux kernel stable tree
  4. smb: client: pin DFS superblock in iterator callback - kernel/git/stable/linux.git - Linux kernel stable tree
  5. smb: client: pin DFS superblock in iterator callback - kernel/git/stable/linux.git - Linux kernel stable tree
  6. smb: client: pin DFS superblock in iterator callback - kernel/git/stable/linux.git - Linux kernel stable tree
  7. CVEs — The Linux Kernel documentation

История обновлений статьи​


  • 30.09.2026 — Опубликована первая версия материала.
 
Назад
Верх Низ