CVE: CVE-2026-89778
Продукт: Linux Kernel
Дата публикации: 16.09.2026
Критичность: CRITICAL
CVSS: 9.8 (3.1)
EPSS: 0,21%; процентиль 10,81%
CISA KEV: нет подтверждения в каталоге CISA KEV
Краткое описание
В драйвере zisofs ядра Linux обнаружена ошибка выхода за границы массива страниц (slab-out-of-bounds) при чтении сжатых файлов ISO9660. Уязвимость возникает из-за некорректного подсчёта смещения в функции
zisofs_uncompress_block() при обработке пустых блоков.Атакующий может вызвать сбой ядра или утечку данных, просто прочитав специально сформированный ISO-образ. Статья разбирает механику ошибки, условия эксплуатации и способы проверки исправления.
Основные характеристики
Риск связан с нарушением целостности памяти ядра при обработке сжатых данных файловой системы ISO9660. Ошибка позволяет нарушителю выйти за выделенные границы массива страниц, что может привести к отказу в обслуживании или утечке конфиденциальных данных ядра.
- Тип ошибки: Выход за границы массива (Out-of-bounds Read) в компоненте zisofs.
- CVSS 3.1: 9.8 (CRITICAL). Вектор:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H. Высокая оценка обусловлена удалённым вектором атаки и отсутствием необходимости в привилегиях.
- Условия атаки: Требуется монтирование специально сформированного ISO9660-образа и чтение сжатого файла из него.
- Эксплуатация: Подтверждено наличие PoC (KASAN-отчёт в описании CVE). Факты о массовой эксплуатации в реальных атаках в источниках отсутствуют.
- EPSS: 0,21% (0.00205). Вероятность эксплуатации в ближайшие 30 дней оценивается как низкая, что характерно для ошибок, требующих специфических условий (монтирование ISO).
Какие продукты и версии затронуты
Уязвимость затрагивает ядра Linux, содержащие код драйвера zisofs (ZISOFS) для чтения сжатых файлов ISO9660. Ошибка была введена в коммите
59bc055211b8 и исправлена в коммите 68d4d3e78150c7ed7d1195af63ad1e6ace30c661.Точные номера версий ядра, в которые внесено исправление, зависят от веток стабильности (stable) и политик дистрибутивов. В предоставленных источниках указаны только идентификаторы коммитов в дереве ядра:
68d4d3e78150c7ed7d1195af63ad1e6ace30c661(mainline)
85904076cece72ee3194646ad7ac8e6659d999aa(stable backport)
8b994ac5778a725982fd6a8a3afcaa068d4a93e3(stable backport)
9c6eace8d07e90f038c89eb3b756d65a7e259d48(stable backport)
ad3249cdf9d4ba34bb8b1ff3956a4020fdfb5b0a(stable backport)
cd616aa0449a772a6956abf03358f0ff31720580(stable backport)
f03425dcbe04aec3c27b9917e97d7d23a2908dda(stable backport)
Для определения актуальной версии ядра и наличия патча используйте команды из раздела «Проверка версии».
Причина уязвимости
Причина ошибки кроется в несогласованности логики возврата количества обработанных байтов в функции
zisofs_uncompress_block() при обработке пустых блоков (empty-block fast path).В нормальном пути декомпрессии функция возвращает количество байтов относительно входящего смещения
poffset. Однако в ветке для пустых блоков код возвращал pcount << PAGE_SHIFT, полностью игнорируя poffset. Это приводит к завышению значения смещения, которое использует zisofs_fill_pages() для продвижения курсора по массиву страниц pages[].Когда размер блока zisofs меньше
PAGE_SIZE и предыдущий блок оставил poffset внутри страницы, последующий пустой блок «пересчитывает» смещение так, что курсор сдвигается за пределы выделенного массива. Далее условие if (poffset && *pages) пытается прочитать pages[1], что вызывает доступ к памяти вне границ (slab-out-of-bounds).Как работает атака
Атака реализуется через чтение данных из специально сформированного ISO9660-образа, содержащего сжатые файлы (ZISOFS).
- Подготовка образа: Атакующий создаёт ISO-образ с Rock Ridge-записью
ZF, в которой размер блока сжатия (block-size shift) установлен нижеPAGE_SHIFT. Драйверrock.cотклоняет только значения сдвига > 17, поэтому малые значения проходят проверку.
- Монтирование: Образ монтируется в систему (например, через
mount). Драйвер zisofs инициализируется.
- Чтение файла: Пользователь или процесс выполняет системный вызов
read()(илиpread64) для чтения сжатого файла из этого образа.
- Срабатывание ошибки: При обработке данных драйвер встречает пустой блок после блока, который не выровнен по границе страницы. Из-за бага в подсчёте смещения курсор массива страниц выходит за границы, и ядро выполняет чтение из недопустимой области памяти.
Результатом может быть сбой ядра (panic) или утечка данных из кэша
kmalloc-8, как показано в KASAN-отчёте.Условия успешной эксплуатации
Для успешной эксплуатации уязвимости необходимо соблюдение следующих условий:
- Монтирование ISO9660: Система должна поддерживать и разрешать монтирование образов ISO9660 с расширением ZISOFS (сжатие).
- Доступ к чтению: Атакующий должен иметь возможность прочитать сжатый файл из сформированного образа. Это может быть локальный пользователь или удалённый сервис, обрабатывающий ISO-образы (например, в контейнерах или CI/CD).
- Специфичная структура данных: Образ должен содержать Rock Ridge-запись
ZFс размером блока, меньшимPAGE_SIZE, и последовательностью блоков, приводящей к некорректному смещениюpoffset.
- Отсутствие исправления: Ядро должно не содержать коммита
68d4d3e78150c7ed7d1195af63ad1e6ace30c661или его backport'ов.
Возможный сценарий атаки
Сценарий атаки предполагает, что атакующий имеет возможность предоставить системе ISO-образ для обработки.
- Атакующий генерирует ISO9660-образ, содержащий сжатый файл с специально настроенными параметрами ZISOFS (малый размер блока, пустые блоки в определённой последовательности).
- Образ передается в систему, где он монтируется. Например, это может быть автоматизированный процесс, который монтирует образы для извлечения файлов, или пользователь, монтирующий образ вручную.
- При чтении файла из образа драйвер zisofs обрабатывает данные. На этапе обработки пустого блока после не выровненного блока срабатывает ошибка выхода за границы массива.
- В зависимости от конфигурации ядра (KASAN, SMEP, SMAP) это может привести к падению ядра (DoS) или чтению конфиденциальных данных из памяти ядра, которые могут быть переданы атакующему через буфер чтения.
Есть ли публичный эксплойт
В описании CVE и коммитах ядра присутствует отладочный вывод KASAN (Kernel Address Sanitizer), который подтверждает воспроизводимость ошибки и наличие PoC (Proof of Concept) на уровне ядра.
- PoC: Подтверждено. KASAN-отчёт в описании CVE демонстрирует срабатывание ошибки при выполнении
read()на специально сформированном образе.
- Техническое описание: Доступно в коммитах ядра и описании CVE. Механика ошибки подробно описана.
- Подтверждённая эксплуатация: В предоставленных источниках нет данных о массовой эксплуатации в реальных атаках (in-the-wild). CVE не включен в каталог CISA KEV (по данным пакета доказательств:
kev: null).
Отсутствие сведений о массовой эксплуатации не означает, что эксплойт не существует. Учитывая низкий порог входа (чтение файла) и высокий CVSS, вероятность появления публичных эксплойтов в будущем высока.
Признаки эксплуатации
Специфичные IOC (Indicators of Compromise) для этой уязвимости в источниках не раскрыты. Однако можно использовать следующие неспецифичные признаки для мониторинга:
- Логи ядра: Записи KASAN или oops/panic, содержащие
zisofs_read_folioилиslab-out-of-boundsвfs/isofs/compress.c.
- Активность монтирования: Частое монтирование ISO9660-образов неизвестного происхождения, особенно в автоматизированных процессах.
- Аномальное чтение: Попытки чтения сжатых файлов из ISO-образов, которые приводят к сбоям или аномальному потреблению ресурсов.
Эти признаки не являются уникальными для CVE-2026-89778 и могут указывать на другие проблемы с обработкой ISO-образов.
Как обнаружить атаку
Для обнаружения попыток эксплуатации или наличия уязвимости можно использовать следующие методы:
- Проверка версии ядра: Сравнение текущей версии ядра с версиями, содержащими исправление (см. раздел «Проверка версии»).
- Мониторинг логов: Анализ
/var/log/kern.logилиdmesgна наличие сообщений об ошибках в zisofs или KASAN-отчетов.
- Сканирование образов: Если система обрабатывает ISO-образы, можно сканировать их на наличие подозрительных Rock Ridge-записей
ZFс аномальными параметрами сжатия.
- Использование KASAN: В тестовых средах можно использовать ядро с включенным KASAN для выявления ошибок выхода за границы памяти при обработке ISO-образов.
Как проверить свою версию
Для проверки версии ядра и наличия исправления используйте следующие команды:
Bash:
# Проверка версии ядра
uname -r
# Подробная информация о ядре
uname -a
# Проверка версии из /proc
cat /proc/version
Чтобы проверить, содержит ли ядро конкретный коммит с исправлением, можно использовать
git (если доступен исходный код) или проверить наличие патча в документации дистрибутива. В большинстве случаев достаточно сравнить версию ядра с релизами, содержащими коммит 68d4d3e78150c7ed7d1195af63ad1e6ace30c661.Пример проверки наличия коммита в локальном дереве ядра (если доступно):
Bash:
git log --oneline | grep 68d4d3e78150c7ed7d1195af63ad1e6ace30c661
Если коммит найден, ядро содержит исправление. Если нет, требуется обновление.
Исправление
Основным и рекомендуемым способом устранения уязвимости является обновление ядра Linux до версии, содержащей исправление.
- Обновление ядра: Установите последнюю доступную версию ядра от вашего дистрибутива или из стабильных веток Linux kernel. Убедитесь, что версия содержит коммит
68d4d3e78150c7ed7d1195af63ad1e6ace30c661или его backport'ы.
- Перезагрузка: После обновления ядра выполните перезагрузку системы для применения изменений.
- Проверка: После обновления проверьте версию ядра и убедитесь, что исправление присутствует (см. раздел «Проверка исправления»).
Если обновление ядра невозможно в краткосрочной перспективе, рассмотрите временные меры митигации, описанные ниже.
Временные меры защиты
Если обновление ядра не может быть выполнено немедленно, можно применить следующие временные меры:
- Ограничение монтирования ISO9660: Запретите или ограничьте монтирование ISO9660-образов, особенно с расширением ZISOFS (сжатие). Это можно сделать через политики AppArmor, SELinux или настройки
mount.
- Изоляция процессов: Если ISO-образы обрабатываются автоматизированными процессами, изолируйте эти процессы в контейнерах или песочницах с ограниченным доступом к ядру.
- Отключение ZISOFS: Если возможно, отключите поддержку ZISOFS в ядре (через модули или конфигурацию), если это не критично для ваших операций.
- Мониторинг: Усиленный мониторинг логов ядра на наличие ошибок zisofs или KASAN-отчетов.
Эти меры снижают риск, но не устраняют уязвимость полностью. Обновление ядра остается приоритетным.
Как проверить устранение уязвимости
Для проверки того, что исправление применено, выполните следующие шаги:
- Проверка версии ядра:
Bash:uname -r
Убедитесь, что версия соответствует релизу, содержащему исправление.
- Проверка наличия коммита (если доступно):
Bash:git log --oneline | grep 68d4d3e78150c7ed7d1195af63ad1e6ace30c661
Если коммит найден, исправление присутствует.
- Функциональная проверка:
Создайте тестовый ISO9660-образ с сжатыми файлами и попробуйте прочитать его. Если ядро не падает и не выдает KASAN-отчеты, исправление, вероятно, работает. Однако это не заменяет проверку версии.
- Проверка логов:
Убедитесь, что в/var/log/kern.logилиdmesgнет новых записей об ошибках zisofs после обновления.
Вывод
CVE-2026-89778 представляет собой серьезную уязвимость в драйвере zisofs ядра Linux, позволяющую нарушителю вызвать выход за границы памяти при чтении сжатых файлов ISO9660. Высокий CVSS-скор (9.8) обусловлен удаленным вектором атаки и отсутствием необходимости в привилегиях. Хотя вероятность эксплуатации в ближайшие 30 дней оценивается как низкая (EPSS 0,21%), наличие PoC и простота атаки делают эту уязвимость значимой для систем, обрабатывающих ISO-образы.
Рекомендуется как можно скорее обновить ядро до версии, содержащей исправление. Если обновление невозможно, примените временные меры митигации, такие как ограничение монтирования ISO9660 и изоляция процессов. Регулярно проверяйте логи ядра на наличие признаков эксплуатации и следите за обновлениями от вашего дистрибутива.
Официальные источники
- NVD — CVE-2026-89778
- FIRST EPSS — CVE-2026-89778
- isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
- isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
- isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
- isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
- isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
- isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
- isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
- CVEs — The Linux Kernel documentation
История обновлений статьи
- 17.09.2026 — Опубликована первая версия материала.
