Уязвимость в XFS, позволяющая читать сырые данные блочного устройства

В коде файловой системы XFS обнаружена уязвимость (CVE-2021-4155), позволяющая локальному непривилегированному пользователю читать данные неиспользуемых блоков напрямую с блочного устройства. Все значительные версии ядра Linux старше 5.16, содержащие драйвер XFS, подвержены этой проблеме. Исправление вошло в версию 5.16, а также в обновления ядер 5.15.14, 5.10.91, 5.4.171, 4.19.225 и т.д. Состояние формирования обновлений с устранением проблемы в дистрибутивах можно отследить на данных страницах: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch.

Уязвимость вызвана некорректным поведением двух специфичных для XFS ioctl(XFS_IOC_ALLOCSP) и ioctl(XFS_IOC_FREESP), которые являются функциональным аналогом общеядерного системного вызова fallocate(). При увеличении размера файла, не выровненного на размер блока, ioctl XFS_IOC_ALLOCSP/XFS_IOC_FREESP не обнуляют хвостовые байты до следующей границы блока. Таким образом, на XFS со стандартным размером блока 4096 байт из каждого блока атакующий может прочитать 4095 байт предыдущих записанных данных. В указанных областях могут содержаться данные удалённых файлов дефрагментированных файлов, а также данные файлов с дедуплицированными блоками.

Проверить свою систему на наличие проблемы можно с помощью простого прототипа эксплоита. Если после выполнения предложенной последовательности команд удастся прочиласть текст Шекспира, то драйвер ФС уязвим. Изначальное монтирование раздела XFS для демонстрации требует прав суперпользователя.

Поскольку ioctl(XFS_IOC_ALLOCSP) и ioctl(XFS_IOC_FREESP) по функциональности практически не отличаются от стандартного fallocate(), и единственным их отличием является утечка данных, их наличие похоже на бекдор. Не смотря на общую политику не изменять существующие интерфейсы в ядре, по предложению Линуса принято решение полностью удалить эти ioctl’ы в следующей версии.

Источник: http://www.opennet.ru/opennews/art.shtml?num=56508