В ядре Linux устранена следующая уязвимость:
nvdimm/btt: обработка приоритета при получении полосы BTT. Линии BTT сериализуют доступ к метаданным каждой линии и состоянию рабочей области.
во время ввода-вывода BTT. Модульный тест btt-check сообщает о несоответствии данных во время
BTT пишет из-за гонки в захвате полосы движения, которая может привести к молчанию
повреждение данных.
Существующая модель дорожек использует спин-блокировку вместе с попроцессорной
счет рекурсии. Эта рекурсивная модель перестала быть действительной после BTT.
полосы стали вытесняемыми: на том же процессоре может выполняться другая задача,
наблюдайте за ненулевым количеством рекурсий, обходите блокировки и используйте тот же
полоса одновременно. Дорожки BTT также удерживаются при вызовах arena_write_bytes().
Этот путь
достигает nsio_rw_bytes(), который сбрасывает записи с помощью nvdimm_flush(). Некоторые обратные вызовы очистки провайдера могут спать, что делает спин-блокировку неправильной.
примитивный для времени жизни полосы. Замените модель рекурсии, основанную на спин-блокировках, на динамическую.
выделенный массив мьютексов для каждой полосы и блокировка полосы
безоговорочно.
Добавьте may_sleep(), чтобы перехватывать любые будущие вызовы атомарного контекста. Найден с помощью модульного теста ndctl btt-check.sh.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: nvdimm/btt: Handle preemption in BTT lane acquisition BTT lanes serialize access to per-lane metadata and workspace state during BTT I/O. The btt-check unit test reports data mismatches during BTT writes due to a race in lane acquisition that can lead to silent data corruption. The existing lane model uses a spinlock together with a per-CPU recursion count. That recursion model stopped being valid after BTT lanes became preemptible: another task can run on the same CPU, observe a non-zero recursion count, bypass locking, and use the same lane concurrently. BTT lanes are also held across arena_write_bytes() calls. That path reaches nsio_rw_bytes(), which flushes writes with nvdimm_flush(). Some provider flush callbacks can sleep, making a spinlock the wrong primitive for the lane lifetime. Replace the spinlock-based recursion model with a dynamically allocated per-lane mutex array and take the lane lock unconditionally. Add might_sleep() to catch any future atomic-context caller. Found with the ndctl unit test btt-check.sh.
Характеристики атаки
Последствия
Строка CVSS v3.1