
Пассивный сканер уязвимостей хостов Linux для CVE-2026-31694: проверяет запущенное ядро, конфигурацию FUSE, метаданные пакетов и признаки установленных исправлений, затем формирует персонализированные рекомендации по устранению уязвимости.
Пассивный инструмент оценки хоста Linux для CVE-2026-31694 — внеграничной записи в кэше readdir подсистемы FUSE в ядре Linux.
Сканер оценивает работающее ядро, подверженность FUSE, локальные метаданные пакетов, свидетельства исходников ядра, среду выполнения и семейство операционной системы. Если хост может быть затронут, он формирует руководство по смягчению последствий, адаптированное к обнаруженному дистрибутиву.
Автор: Aung Myat Thu [w01f]
cve_2026_31694_scanner.py — локальная утилита оценки уязвимостей, не использующая эксплойты.
Она не подтверждает уязвимость путём запуска затронутого участка кода FUSE. Вместо этого она объединяет несколько пассивных индикаторов:
CONFIG_FUSE_FS;/dev/fuse и доступ текущего пользователя;Результат представляет собой оценку подверженности, а не доказательство на основе эксплойта.
CVE-2026-31694 затрагивает кэш readdir подсистемы FUSE в ядре Linux.
Уязвимая логика вычисляет сериализованный размер записи каталога на основе управляемой сервером длины имени и копирует запись на одну страницу page-cache. Запись каталога с длиной имени 4095 может дать сериализованный размер 4120 байт.
В системе с страницами по 4096 байт такая запись превышает одну страницу на 24 байта.
Исправление из апстрима отклоняет записи каталога, которые не помещаются в одну страницу, до выполнения копирования в кэш.
fs/fuse/readdir.c fuse_add_dirent_to_cache()
### Базовые данные сканера
Сканер содержит следующие стабильные исправленные эталонные версии из upstream:
| Серия ядра | Исправленная эталонная версия |
|---|---:|
| 5.10 | 5.10.258 |
| 5.15 | 5.15.209 |
| 6.1 | 6.1.175 |
| 6.6 | 6.6.136 |
| 6.12 | 6.12.84 |
| 6.18 | 6.18.25 |
| 7.0 | 7.0.2 |
| Mainline | 7.1 или новее |
Эти версии используются как один из входных параметров оценки. Они не считаются единственным источником истины, поскольку дистрибьюторы могут перенести исправление, сохраняя при этом более старый номер версии upstream.
---
## Модель безопасности
Сканер спроектирован так, чтобы не вызывать уязвимую операцию.
### Сканер не делает
- не монтирует файловую систему FUSE;
- не открывает и не взаимодействует с `/dev/fuse`;
- не запускает FUSE-сервер;
- не передаёт специально сформированные записи каталогов;
- не выделяет память для тестирования размещения страниц;
- не выполняет груминг аллокаторов ядра;
- не изменяет `/etc/passwd`;
- не изменяет конфигурацию ядра;
- не загружает и не выгружает модули ядра;
- не изменяет права доступа к `/dev/fuse`;
- не устанавливает и не удаляет пакеты;
- не перезагружает систему;
- не пытается повысить привилегии.
### Сканер может
- читать файлы в `/proc`, `/boot`, `/lib/modules`, `/usr/lib/modules`, `/usr/src` и каталогах метаданных пакетов;
- выполнять ограниченные, доступные только для чтения запросы к пакетам;
- проверять активные точки монтирования и регистрацию файловых систем;
- записывать отчёт только при явном указании `--output`;
- выводить команды для смягчения последствий для ознакомления администратора.
Команды для смягчения последствий — это справочный вывод. Они никогда не выполняются автоматически.
---
## Возможности
### Идентификация хоста и ядра
- Читает `platform.release()` и разбирает версию ядра в стиле upstream.
- Читает `/etc/os-release` или `/usr/lib/os-release`.
- Определяет архитектуру CPU и размер страницы памяти.
- Определяет, принадлежит ли сканируемое ядро текущей операционной системе.
### Оценка подверженности FUSE
- Читает `CONFIG_FUSE_FS` из доступных источников конфигурации ядра.
- Определяет встроенную поддержку FUSE и конфигурации подгружаемых модулей.
- Читает `/proc/filesystems`.
- Проверяет метаданные `/dev/fuse` и права чтения/записи текущего пользователя.
- Находит `fusermount3` или `fusermount`.
- Разбирает активные FUSE-монтирования из `/proc/self/mountinfo`.
### Признаки наличия исправления
- Сравнивает текущую версию с исправленными эталонными версиями upstream.
- Ищет в установленных исходниках ядра защиту от записей чрезмерного размера.
- Проверяет локальные журналы изменений пакетов RPM или Debian на наличие:
- `CVE-2026-31694`;
- названия исправления upstream.
### Состояние пакетов и перезагрузки
- Пытается определить пакет, которому принадлежит работающее ядро.
- Запрашивает локальные метаданные менеджера пакетов без обновления репозиториев.
- Определяет более новое установленное ядро, если окружение хоста является авторитетным.
- Проверяет `/var/run/reboot-required`, где это применимо.
### Определение окружения
- Определяет контейнеры, совместимые с Docker.
- Определяет контейнеры, совместимые с Podman.
- Определяет cgroups, связанные с контейнерами.
- Определяет WSL.
- Определяет виртуальные машины с помощью `systemd-detect-virt`, если он доступен.
### Отчётность
- Вывод в текстовом формате, читаемом человеком.
- Вывод в машиночитаемом формате JSON.
- Вывод отчёта в формате Markdown.
- Вывод только команд для смягчения последствий.
- Необязательный вывод в файл.
- Информативные коды завершения процесса.
---
## Требования
### Обязательные
- Linux для оценки ядра.
- Python 3.9 или новее.
- Доступ на чтение к обычным системным метаданным.
Сканер использует только стандартную библиотеку Python.
### Необязательные команды
Дополнительные свидетельства собираются при наличии следующих инструментов:
| Инструмент | Назначение |
|---|---|
| `dpkg-query` | определение владельца пакета ядра и поиск журнала изменений в Debian/Ubuntu |
| `rpm` | проверка владельца пакета и журнала изменений в Fedora/RHEL/SUSE |
| `pacman` | метаданные пакета ядра и обновлений для семейства Arch |
| `apt` | запрос к кэшированным обновлениям в семействе Debian |
| `dnf` или `dnf5` | запрос к кэшированным обновлениям в Fedora/RHEL |
| `zypper` | запрос к кэшированным исправлениям CVE в SUSE |
| `apk` | запрос пакетов/обновлений в Alpine |
| `systemd-detect-virt` | определение контейнеров и виртуальных машин |
Для обычного сканирования права root не требуются.
Некоторые свидетельства могут быть недоступны непривилегированной учётной записи из-за специфических для системы прав на файлы.
---
## Установка
Поместите сканер в рабочий каталог:```bash
chmod +x cve_2026_31694_scanner.py
Запустите напрямую:```bash ./cve_2026_31694_scanner.py
Или запустите его с помощью Python:```bash
python3 cve_2026_31694_scanner.py
Установка Python-пакета не требуется.