В ядре Linux исправлена уязвимость FUSE, позволявшая локально повысить привилегии до root

linux

Исследователи из Bynario обнаружили и подтвердили эксплуатацию уязвимости CVE-2026-31694 в подсистеме FUSE (Filesystem in Userspace) ядра Linux. Проблема позволяет локальному непривилегированному атакующему получить полный контроль над системой, используя переполнение страничного кэша и последующую модификацию SUID-бинарного файла. Патч уже принят в основную ветку ядра.

Уязвимость CVE-2026-31694

Уязвимость вызвана ошибкой в логике кэширования каталогов FUSE, а именно в функции "fuse_add_dirent_to_cache()" в файле "fs/fuse/readdir.c". Когда FUSE-сервер устанавливает флаг "FOPEN_CACHE_DIR", ядро копирует записи каталогов (direntry) в страничный кэш для ускорения последующих операций чтения. Размер каждой записи вычисляется на основе поля "namelen", которое контролируется сервером, то есть потенциальным злоумышленником. Максимальное значение "namelen" - 4095 байт, что с учётом выравнивания даёт общий размер записи до 4120 байт.

В коде проверялось, помещается ли запись в оставшееся место текущей страницы кэша (стандартный размер страницы - 4096 байт на x86_64). Если не помещается, ядро переходит на новую страницу, но не проверяет, превышает ли сама запись размер страницы. В результате при попытке скопировать 4120 байт в свежую страницу происходит переполнение на 24 байта за её границу в следующую физически смежную страницу памяти.

Эксплуатация этой уязвимости стала практически возможной после внесения в ядро коммита "dabb90391028" (увеличение буфера readdir), который позволил принимать от FUSE-сервера записи размером более одной страницы. Таким образом, уязвимость затрагивает ядра, начиная с версии v6.16-rc1. На системах с размером страницы больше 4 КиБ (например, 16 или 64 КиБ) условие переполнения не выполняется.

Исследователи Bynario продемонстрировали, как 24-байтовое переполнение может быть использовано для локального повышения привилегий. Поскольку исполняемые файлы также находятся в страничном кэше, атакующий может перезаписать начальные инструкции SUID-программы, запускаемой с правами root. В качестве цели был выбран бинарный файл "/usr/bin/su" на Ubuntu 26.04. Эксплойт нацелен на секцию ".init", выполняемую динамическим линковщиком до вызова "main()" и до обычной аутентификации.

Методика эксплуатации включала создание набора "жертвенных" файлов, многократное загрузку и вытеснение страниц из кэша, чтобы расположить страницу с переполненной записью непосредственно перед страницей, содержащей ".init"-секцию "su". После попадания 24-байтовые данные перезаписывают первые инструкции. Полезная нагрузка представляет собой минимальный шелл-код для x86_64, который вызывает "setuid(0)" и "setgid(0)" и возвращает управление обратно. После этого "su" продолжает выполнение, но уже с привилегиями root, не запрашивая пароль. В результате атакующий получает полноценную root-оболочку.

Для успешной атаки необходимо, чтобы непривилегированный пользователь имел возможность монтировать FUSE-файловую систему - либо через unprivileged user namespaces, либо с помощью утилиты "fusermount3". Атакующий размещает вредоносный FUSE-сервер, который возвращает запись каталога с превышающим размером, и вызывает системный вызов "getdents64()" на созданном каталоге.

Разработчики ядра приняли патч (коммит "51a8de6c50bf947c8f534cd73da4c8f0a13e7bed"), который добавляет простую, но эффективную проверку: если размер сериализованной записи превышает "PAGE_SIZE", ядро пропускает кэширование такой записи вместо копирования в страничный кэш. Таким образом, переполнение полностью блокируется.

"Этот баг показывает, что даже относительно небольшие детерминированные переполнения в подсистемах ядра, таких как FUSE, могут приводить к надёжным эксплойтам для получения root-привилегий при сочетании с точными манипуляциями со страничным кэшем и целевой коррупцией SUID-бинарных файлов", - отмечают исследователи Bynario в своём отчёте.

Администраторам настоятельно рекомендуется установить обновления ядра, содержащие исправление, на уязвимые системы. В качестве дополнительных мер защиты можно ограничить доступ к FUSE: удалить бит setuid с "fusermount3" (команда "chmod u-s /usr/bin/fusermount3"), если эта утилита не требуется, а также отключить или ограничить использование непривилегированных пространств имён пользователей. Эти шаги существенно снижают поверхность атаки для непривилегированных пользователей.

Ситуация вокруг данной уязвимости в очередной раз подтверждает, что автоматизированное обнаружение и валидация уязвимостей ядра с использованием методов машинного обучения становится всё более результативным. Команда Bynario продемонстрировала возможность не только найти проблемный код, но и построить работающий эксплойт, который позволяет воспроизвести реальное повышение привилегий. В условиях растущего числа автоматически генерируемых отчётов об уязвимостях способность подтверждать их практическую эксплуатацию становится ключевым фактором для отсеивания ложных срабатываний и оперативного приоритизации исправлений.

Ссылки

Комментарии: 0