Уязвимость в 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’ы в следующей версии.

Источник: opennet.ru

Добавить комментарий