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 следует приоритизировать обновление ядра.Механика ошибки сложна, но патч прост и безопасен для применения. Регулярное обновление ядра и мониторинг логов являются ключевыми мерами по снижению риска.
Официальные источники
- NVD — CVE-2026-89847
- FIRST EPSS — CVE-2026-89847
- scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
- scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
- scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
- scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
- scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
- scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
- scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
- scsi: qla2xxx: Avoid double completion in async IOCB timeout - kernel/git/stable/linux.git - Linux kernel stable tree
История обновлений статьи
- 19.09.2026 — Опубликована первая версия материала.
