CVE-2026-89847 в Linux Kernel: use-after-free в драйвере qla2xxx

CVE: CVE-2026-89847
Продукт: Linux Kernel
Дата публикации: 16.09.2026
Критичность: CRITICAL
CVSS: 9.8 (3.1)
EPSS: 0,68%; процентиль 50,71%
CISA KEV: нет подтверждения в каталоге CISA KEV

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


В драйвере SCSI qla2xxx обнаружена гонка, приводящая к двойному завершению асинхронной команды и записи в освобождённую память стека. Ошибка затрагивает ядра Linux, использующие контроллеры QLogic, и устранена в серии стабильных релизов. Статья описывает механику срабатывания, условия эксплуатации и безопасные шаги по проверке и обновлению системы.

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


Уязвимость представляет собой гонку условий (race condition) в обработчике таймаута асинхронных команд драйвера qla2xxx, что приводит к записи в освобождённую память (use-after-free). При успешной эксплуатации это может повлечь загрузку ядра (kernel panic) или выполнение кода в контексте ядра.

  • Тип ошибки: Use-after-free (CWE-416) в контексте гонки условий.
  • CVSS 3.1: 9.8 (CRITICAL). Вектор: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H. Высокая оценка отражает потенциальный масштаб последствий при удалённом срабатывании.
  • EPSS: 0,68% (процентиль 50,71%). Вероятность активной эксплуатации в ближайшие 30 дней оценивается как низкая.
  • CISA KEV: Уязвимость не включена в каталог Known Exploited Vulnerabilities.
  • Статус: Патч опубликован в mainline и стабильных ветках ядра Linux.

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


Уязвимость затрагивает ядра Linux, в которых присутствует драйвер qla2xxx и отсутствует исправление, внесённое в коммит bb45bc4bd53c95a7bf6f782577b5ede94c0f8aa8. Конкретные номера версий дистрибутивов не указаны в доступных источниках, однако патч распространён в стабильных ветках.

  • Компонент: drivers/scsi/qla2xxx/qla_init.c.
  • Функция: qla2x00_async_iocb_timeout().
  • Исправляющий коммит: bb45bc4bd53c95a7bf6f782577b5ede94c0f8aa8.
  • Стабильные ветки: Патч включён в релизы, доступные через git.kernel.org.

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


Причина ошибки кроется в отсутствии проверки фактического удаления структуры данных (SRB) из массива outstanding_cmds[] перед вызовом функции завершения sp->done(). В исходном коде обработчик таймаута сканирует массив и, не найдя SRB, всё равно инициирует завершение команды.

Если в этот момент прерывание (ISR) уже обработало ответ и удалило SRB, а вызывающая функция освободила память стека, повторный вызов sp->done() приводит к обращению к уже освобождённой области памяти. Функция complete() записывает данные в стек, который был возвращён системе, что и вызывает use-after-free.

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


Атака эксплуатирует гонку между обработчиком таймаута и прерыванием, обрабатывающим ответ контроллера. Таймер срабатывает, когда асинхронная IOCB не завершилась в отведённое время. Обработчик пытается прервать команду, но если ответ уже пришёл, SRB удаляется из массива под блокировкой.

В этот момент вызывающая функция qla24xx_control_vp() просыпается, очищает указатель sp->comp и возвращает управление, освобождая память стека. Таймер, удерживающий ссылку на SRB, продолжает работу и вызывает sp->done().

Функция qla_ctrlvp_sp_done() проверяет if (sp->comp), но указатель мог быть загружен до его обнуления. Последующий вызов complete(sp->comp) записывает данные в освобождённый стек, нарушая целостность памяти ядра.

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


Для успешной эксплуатации уязвимости необходимо наличие в системе драйвера qla2xxx и работающего контроллера QLogic. Атака требует создания специфической временнóй ситуации, когда таймаут асинхронной команды совпадает по времени с обработкой ответа прерыванием.

  • Наличие драйвера: Система должна использовать SCSI-контроллеры, поддерживаемые модулем qla2xxx.
  • Асинхронные операции: Должны выполняться асинхронные IOCB, способные к таймауту.
  • Гонка условий: Требуется точное совпадение временны́х интервалов между таймером и ISR, что делает эксплуатацию сложной и нестабильной.

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


Сценарий начинается с отправки асинхронной команды на контроллер QLogic. Если контроллер задерживает ответ, срабатывает таймер qla2x00_async_iocb_timeout(). Одновременно контроллер отправляет ответ, который обрабатывается прерыванием (ISR).

ISR удаляет SRB из outstanding_cmds[] и вызывает sp->done(). Вызывающая функция освобождает память стека.

Таймер, не обнаружив SRB в массиве, всё равно вызывает sp->done(). Происходит запись в освобождённую память. В худшем случае это приводит к падению ядра или выполнению вредоносного кода, если атакующий контролирует содержимое освобождённого стека.

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


Публичные эксплойты для CVE-2026-89847 не подтверждены в доступных источниках. Уязвимость была обнаружена и исправлена в рамках регулярного процесса разработки ядра Linux. Отсутствуют сведения о PoC или подтверждённой эксплуатации в реальных атаках.

Низкий показатель EPSS (0,68%) и отсутствие записи в CISA KEV указывают на то, что активная эксплуатация в дикой природе на данный момент не зафиксирована. Однако это не исключает возможности создания эксплойта в будущем.

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


Специфичные индикаторы компрометации (IOC) для этой уязвимости не опубликованы. Поскольку атака приводит к повреждению памяти ядра, следы могут быть неочевидны. Общие признаки, требующие дальнейшего расследования:

  • Kernel Panic: Нестабильность системы или перезагрузки, связанные с драйвером qla2xxx.
  • Аномальные логи: Сообщения об ошибках в dmesg или journalctl, связанные с SCSI-контроллерами QLogic.
  • Неожиданные таймауты: Частые таймауты асинхронных операций на контроллерах QLogic.

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


Обнаружение атаки затруднено из-за природы use-after-free. Рекомендуется мониторинг логов ядра на предмет аномалий в работе драйвера qla2xxx. Используйте следующие команды для проверки состояния системы:

Bash:
# Проверка загрузки модуля qla2xxx
lsmod | grep qla2xxx

# Просмотр логоов ядра на ошибки SCSI
dmesg | grep -i "qla2xxx\|scsi"

# Проверка стабильности системы
journalctl -k -e

При обнаружении повторяющихся таймаутов или падений ядра, связанных с этим драйвером, следует провести углублённый анализ.

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


Для определения, затронута ли система, необходимо проверить версию ядра и наличие исправляющего коммита. Используйте следующие команды:

Bash:
# Проверка версии ядра
uname -r

# Проверка наличия коммита в исходниках (если доступны)
git log --oneline | grep bb45bc4bd53c95a7bf6f782577b5ede94c0f8aa8

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

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


Единственным надёжным способом устранения уязвимости является обновление ядра Linux до версии, содержащей коммит bb45bc4bd53c95a7bf6f782577b5ede94c0f8aa8. Патч распространён в стабильных ветках ядра.

  • Обновление ядра: Используйте пакетный менеджер вашего дистрибутива для установки последней стабильной версии ядра.
  • Перезагрузка: После обновления ядра требуется перезагрузка системы для применения изменений.
  • Проверка: После перезагрузки убедитесь, что новая версия ядра активна и драйвер qla2xxx загружен корректно.

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


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

  • Отключение контроллера: Если контроллер QLogic не критичен для работы, временно отключите его или отключите модуль qla2xxx.
  • Мониторинг: Усиленный мониторинг логов ядра на предмет аномалий в работе SCSI-подсистемы.
  • Резервное копирование: Убедитесь, что данные на дисках, подключённых через QLogic, имеют актуальные резервные копии.

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


После обновления ядра и перезагрузки системы выполните следующие проверки:

Bash:
# Проверка версии ядра
uname -r

# Проверка наличия исправления в исходниках (если доступны)
git log --oneline | grep bb45bc4bd53c95a7bf6f782577b5ede94c0f8aa8

# Проверка стабильности драйвера
dmesg | grep -i "qla2xxx"

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

Вывод​


CVE-2026-89847 представляет собой серьёзную уязвимость в драйвере qla2xxx, способную привести к падению ядра или выполнению кода. Хотя активная эксплуатация не подтверждена, администраторам систем с контроллерами QLogic следует приоритизировать обновление ядра.

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

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


  1. NVD — CVE-2026-89847
  2. FIRST EPSS — CVE-2026-89847
  3. scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
  4. scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
  5. scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
  6. scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
  7. scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
  8. scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
  9. scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
  10. scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree

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


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