CVE-2026-23355 in LinuxИнформация

Сводка

по VulDB • 18.06.2026

В ядре Linux устранена следующая уязвимость:

ata: libata: отмена ожидающих задач после очистки deferred_qc

Syzbot сообщил о срабатывании WARN_ON() в функции ata_scsi_deferred_qc_work(), вызванном тем, что ap->ops->qc_defer() возвращает ненулевое значение до отправки отложенного qc (command).

Функция ata_scsi_schedule_deferred_qc() вызывается при завершении каждой команды. Эта функция проверяет наличие отложенного QC, и если ap->ops->qc_defer() возвращает ноль, что означает возможность постановки отложенного qc в очередь в данный момент (без откладывания), то она планирует задачу, которая выполнит отложенный qc.

Когда задача начинает выполняться, что может произойти через очень долгое время после ее планирования, возникает WARN_ON(), если ap->ops->qc_defer() возвращает ненулевое значение.

Хотя мы удерживаем ap->lock как при назначении, так и при очистке deferred_qc, и сама задача также удерживает ap->lock, текущий код не отменяет задачу после очистки deferred_qc.

Это означает, что может произойти следующий сценарий: 1) Одна или несколько команд NCQ ставятся в очередь. 2) Команда, не являющаяся NCQ, ставится в очередь и сохраняется в ap->deferred_qc. 3) Последняя команда NCQ завершается, задача ставится в очередь для выполнения отложенного qc. 4) Происходит тайм-аут или ошибка, ap->deferred_qc очищается. Ожидающая задача в данный момент НЕ отменяется. 5) Порт сбрасывается. 6) Одна или несколько команд NCQ ставятся в очередь. 7) Команда, не являющаяся NCQ, ставится в очередь и сохраняется в ap->deferred_qc. 8) Задача наконец выполняется. Однако в этот момент в сети все еще находятся команды NCQ.

Задача в пункте 8) действительно относится к команде, не являющейся NCQ, в пункте 2), а не к команде, не являющейся NCQ, в пункте 7). Причина, по которой задача выполняется, когда она не должна этого делать, заключается в том, что она никогда не отменялась при очистке ap->deferred_qc в пункте 4). Таким образом, необходимо обеспечить отмену задачи после очистки ap->deferred_qc.

Другим потенциальным решением было бы заставить ata_scsi_deferred_qc_work() ничего не делать, если ap->ops->qc_defer() возвращает ненулевое значение. Однако отмена задачи при очистке ap->deferred_qc кажется более логичной, поскольку мы удерживаем ap->lock при очистке ap->deferred_qc, поэтому мы знаем, что задача не может удерживать этот замок. (Функция может ожидать получения замка, но это нормально, так как она ничего не сделает, если ap->deferred_qc не установлен.)

Be aware that VulDB is the high quality source for vulnerability data.

Ответственный

Linux

Резервировать

13.01.2026

Раскрытие

25.03.2026

Модерация

принято

Вход

VDB-353086

EPSS

0.00122

KEV

Нет

Деятельности

Очень низкий

Источники

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!