CVE-2026-97528 в Linux Kernel: use-after-free в qla2xxx при обработке NVMe unsolicited LS responses

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

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


Уязвимость CVE-2026-97528 затрагивает драйвер qla2xxx в Linux Kernel. В функции qla_nvme_xmt_ls_rsp() объект uctx освобождается через kfree(), но при этом остаётся привязанным к списку fcport->unsol_ctx_head. Последующие операции добавления или удаления из списка работают с уже освобождённой памятью, что приводит к повреждению структуры данных или аварийному завершению ядра.

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


Ошибка — это use-after-free в драйвере qla2xxx при обработке NVMe unsolicited LS responses. Повреждение списка unsol_ctx_head может повлиять на SCSI-подсистему и вызвать panic.

  • Тип ошибки: use-after-free в списке ядра Linux Kernel
  • CVSS 3.1: CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — оценка 8.8, severity HIGH
  • Вектор атаки: удалённый доступ без привилегий и взаимодействия пользователя
  • Факт эксплуатации: в предоставленных источниках не подтверждено
  • EPSS: 0,318% (процентиль 22,28%)

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


Затронут драйвер qla2xxx в Linux Kernel.

  • Файл: drivers/scsi/qla2xxx/qla_nvme.c
  • Функция: qla_nvme_xmt_ls_rsp()
  • Структура: fcport->unsol_ctx_head
  • Компонент: NVMe unsolicited LS request/response support в qla2xxx

Точный диапазон версий ядра, где ошибка воспроизводится, в предоставленных источниках не раскрыт. Исправление входит в stable-ветку Linux Kernel и связано с upstream commit e46160a5d4fa59bf4d5f3412b6b5cb79edb967dd.

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


В qla_nvme_xmt_ls_rsp() переменная uctx получает указатель на объект, который ранее был добавлен в список fcport->unsol_ctx_head функцией qla2xxx_process_purls_iocb(). Когда NVMe transport вызывает передачу LS response, объект ещё остаётся в списке.

На пути ошибки (out:) функция освобождает uctx через kfree(), но не удаляет его из списка. В результате узел списка продолжает существовать как часть структуры данных, хотя память под ним уже освобождена.

Далее при следующем вызове list_add_tail() для этого fcport запись происходит в освобождённую область памяти, а последующий list_del() может повредить список или вызвать panic.

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


Ошибка проявляется при обработке unsolicited LS responses в NVMe-режиме qla2xxx. Для её воспроизведения необходимо, чтобы драйвер получил объект uctx, добавленный в список, а затем вошёл в путь ошибки при передаче LS response.

После освобождения памяти через kfree() узел остаётся в списке. При следующем обращении к списку ядро записывает данные в уже освобождённую область. Это может привести к повреждению соседних структур или вызову panic.

В предоставленных источниках не описано конкретное поведение атакующего, который управляет этим сценарием. Механика ошибки подтверждена кодом исправления и описанием уязвимости.

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


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

  • Наличие драйвера qla2xxx в ядре Linux Kernel
  • Поддержка NVMe unsolicited LS request/response в qla2xxx
  • Обработка unsolicited LS response, которая приводит к пути ошибки в qla_nvme_xmt_ls_rsp()
  • Доступ к SCSI-подсистеме или возможность вызвать обработку соответствующего события

Точные условия ввода данных из внешнего устройства не раскрыты в предоставленных источниках. Путь ошибки зависит от внутреннего состояния драйвера и обработки ошибок при передаче LS response.

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


Сценарий начинается с работы qla2xxx в режиме NVMe unsolicited LS support. Драйвер регистрирует uctx в списке fcport->unsol_ctx_head.

Далее происходит обработка LS reject error, и функция входит в путь out:. В этом месте вызывается kfree(uctx), но list_del(&uctx->elem) не выполняется. Узел остаётся в списке.

При следующем обращении к списку для этого fcport ядро использует освобождённый узел как активный элемент списка. Запись через list_add_tail() или удаление через list_del() нарушает целостность структуры данных и может привести к аварийному завершению ядра.

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


В предоставленных источниках не указано, что публичный эксплойт для CVE-2026-97528 опубликован.

Отсутствует подтверждение:

  • Наличие готового PoC
  • Подтверждённой эксплуатации в реальных атаках
  • Конкретного инструмента или скрипта воспроизведения
  • Публичной базы данных эксплойтов с записью по этому CVE

Сами источники содержат только описание ошибки и код исправления. Отсутствие сведений об эксплойте не означает, что он не существует.

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


Специфичных индикаторов компрометации для этой уязвимости в предоставленных источниках нет.

Неспецифичные точки контроля:

  • Аномальные ошибки ядра в dmesg или /var/log/kern.log
  • Повторяющиеся panic или kernel oops с упоминанием qla2xxx, NVMe, unsol_ctx или SCSI
  • Неожиданные сбои при работе с NVMe/SCSI устройствами
  • Рост количества ошибок в драйвере qla2xxx после обновления ядра или изменения конфигурации хранилища

Эти признаки не являются подтверждёнными IOC для CVE-2026-97528 и требуют сопоставления с контекстом системы.

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


Для обнаружения последствий ошибки можно использовать:

  • dmesg -T | grep -iE 'qla2xxx|nvme|unsol_ctx|panic|oops'
  • Анализ /var/log/kern.log на аномальные сообщения ядра
  • Проверку журналов SCSI и NVMe после сбоев хранилища
  • Мониторинг kernel oops, которые содержат ссылки на qla2xxx или unsol_ctx

Такие методы не подтверждают наличие CVE-2026-97528 напрямую. Они помогают выявить последствия ошибки памяти в драйвере.

Для проверки версии ядра:

Bash:
uname -r
uname -a
cat /proc/version

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


Проверка версии ядра Linux Kernel выполняется стандартными командами:

  • uname -r — возвращает номер ядра
  • uname -a — возвращает полную информацию о системе и ядре
  • cat /proc/version — показывает версию ядра из /proc

Пример вывода:

Bash:
$ uname -r
6.12.0-rc5

Точная версия, в которой ошибка уже исправлена, в предоставленных источниках не указана. Исправление связано с stable commit c55d649a6cc246c3ccd5d118faea230c46b60f35 и upstream commit e46160a5d4fa59bf4d5f3412b6b5cb79edb967dd.

Для точной проверки нужно сопоставить версию ядра с веткой stable, куда было внесено исправление.

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


Исправление входит в Linux Kernel stable tree и добавляет вызов list_del(&uctx->elem) перед kfree(uctx) в функции qla_nvme_xmt_ls_rsp().

  • Commit: e46160a5d4fa59bf4d5f3412b6b5cb79edb967dd
  • Stable commit: c55d649a6cc246c3ccd5d118faea230c46b60f35
  • Файл: drivers/scsi/qla2xxx/qla_nvme.c
  • Изменение: 1 строка вставки перед освобождением памяти

Рекомендуется:

  • Обновить ядро до версии stable, содержащей исправление
  • Проверить наличие qla2xxx через lsmod | grep qla или lspci -k | grep -i qla
  • Перезагрузить систему после обновления ядра
  • Повторить проверку версий и журналов после применения патча

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


В предоставленных источниках не описаны временные меры, которые гарантированно устраняют ошибку.

Неспецифичные действия для снижения риска:

  • Ограничить использование NVMe unsolicited LS support в qla2xxx, если это возможно через параметры ядра или драйвера
  • Избегать сценариев, которые вызывают частые ошибки LS reject в qla2xxx
  • Мониторить dmesg и логи ядра после изменений конфигурации хранилища
  • Откладывать обновление до применения патча stable, если система критична

Эти меры не являются подтверждённым обходом уязвимости и могут зависеть от конкретной конфигурации системы.

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


После обновления ядра нужно проверить:

  • Версию ядра: uname -r
  • Наличие qla2xxx: lsmod | grep qla
  • Отсутствие новых ошибок в dmesg после работы с NVMe/SCSI устройствами
  • Сравнение версии ядра с веткой stable, содержащей commit c55d649a6cc246c3ccd5d118faea230c46b60f35

Пример проверки:

Bash:
uname -r
dmesg -T | grep -iE 'qla2xxx|nvme|panic|oops'

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

Вывод​


CVE-2026-97528 — это ошибка use-after-free в драйвере qla2xxx Linux Kernel. Она возникает из-за освобождения узла списка без его удаления из fcport->unsol_ctx_head. Последствия могут включать повреждение структуры данных и panic ядра.

Исправление добавляет вызов list_del() перед kfree(). Для защиты нужно обновить ядро до stable-версии, содержащей патч, и проверить отсутствие ошибок qla2xxx после обновления.

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


  1. NVD — CVE-2026-97528
  2. FIRST EPSS — CVE-2026-97528
  3. scsi: qla2xxx: Unlink NVMe unsol ctx before freeing on LS reject error - kernel/git/stable/linux.git - Linux kernel stable tree
  4. scsi: qla2xxx: Unlink NVMe unsol ctx before freeing on LS reject error - kernel/git/stable/linux.git - Linux kernel stable tree
  5. scsi: qla2xxx: Unlink NVMe unsol ctx before freeing on LS reject error - kernel/git/stable/linux.git - Linux kernel stable tree
  6. CVEs — The Linux Kernel documentation

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


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