CVE-2026-89778 в Linux Kernel: OOB-чтение в zisofs, уязвимые версии и защита

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 и изоляция процессов. Регулярно проверяйте логи ядра на наличие признаков эксплуатации и следите за обновлениями от вашего дистрибутива.

Официальные источники​


  1. NVD — CVE-2026-89778
  2. FIRST EPSS — CVE-2026-89778
  3. isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
  4. isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
  5. isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
  6. isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
  7. isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
  8. isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
  9. isofs: fix out-of-bounds page array access on empty zisofs block - kernel/git/stable/linux.git - Linux kernel stable tree
  10. CVEs — The Linux Kernel documentation

История обновлений статьи​


  • 17.09.2026 — Опубликована первая версия материала.
 
Назад
Верх Низ