CVE-2026-80917 в Linux Kernel: NULL pointer dereference в PCI CAM

CVE: CVE-2026-80917
Продукт: Linux Kernel
Дата публикации: 09.09.2026
Критичность: не определена
CVSS: нет данных
EPSS: 0,16%; процентиль 5,94%
CISA KEV: нет подтверждения в каталоге CISA KEV

Краткое описание​


В драйвере pci-host-generic ядра Linux обнаружен дефект, вызывающий обращение по нулевому указателю на 32-битных системах с режимом CAM. Сбой происходит при инициализации PCI-шин и приводит к падению ядра (Oops).

Исправление опубликовано в стабильных ветках. Материал описывает механику ошибки, условия проявления и порядок проверки актуальности системы.

Основные характеристики​


Риск представляет собой отказ в обслуживании (DoS) на узком сегменте инфраструктуры: 32-битных системах, использующих драйвер pci-host-cam-generic. Сбой возникает на этапе инициализации оборудования и приводит к остановке работы ядра.

  • Тип ошибки: NULL pointer dereference (обращение по нулевому указателю).
  • CVSS: Официальная оценка NVD не присвоена (статус записи: Received).
  • Условия проявления: Требуется 32-битная архитектура и использование режима CAM в Device Tree.
  • Эксплуатация: Подтверждено локальное падение ядра (Oops) при загрузке; данные об удаленной атаке отсутствуют.
  • EPSS: 0,16% (вероятность эксплуатации в ближайшие 30 дней крайне низкая).

Какие продукты и версии затронуты​


Уязвимость затрагивает ядро Linux, использующее драйвер pci-host-generic в режиме CAM (Configuration Access Mechanism) на 32-битных системах.

  • Компоненты: drivers/pci/controller/pci-host-generic.c и drivers/pci/ecam.c.
  • Архитектура: 32-битные системы (например, RV32, ARM32), где конфигурационное пространство PCI не может быть отображено одним блоком через ioremap.
  • Версии: Ошибка была введена в коммите 8fe55ef23387 и присутствует в версиях, не содержащих патч 008cb88edb41f3c7c8e0ed76719830984.
  • Пример сбоев: Зафиксирован на платформе Digilent Nexys-Video-A7 RV32 с ядром 6.9.7+.

Причина уязвимости​


На 32-битных системах размер конфигурационного пространства PCI превышает возможности единого ioremap. Поэтому функция pci_ecam_create() разделяет маппинг по сегментам шин и полагается на колбэк ->add_bus для заполнения структуры cfg->winp[].

Драйвер pci-host-generic для режима CAM (legacy) не предоставлял колбэки ->add_bus и ->remove_bus, в отличие от режима ECAM. В результате при первом обращении к конфигурационному регистру функция pci_ecam_map_bus() получала NULL как базовый адрес, что вызывало сбой ядра.

Как работает атака​


Сбой происходит во время стандартной процедуры инициализации PCI-шины. При загрузке ядра или подключении устройства драйвер начинает перечисление шин (pci_scan_root_bus_bridge).

Первое чтение конфигурационного регистра (например, pci_bus_read_config_dword) вызывает pci_generic_config_read. Поскольку маппинг шины не был установлен из-за отсутствия колбэка, обращение по нулевому указателю приводит к Oops и остановке работы ядра. Это не атака со стороны злоумышленника, а критический дефект инициализации.

Условия успешной эксплуатации​


Для проявления уязвимости не требуется взаимодействие с внешним сетевым трафиком. Достаточно выполнения следующих условий на целевой системе:

  • Использование 32-битной архитектуры процессора.
  • Наличие PCI-устройств, управляемых драйвером pci-host-generic.
  • Использование режима CAM (compatible string pci-host-cam-generic) в Device Tree.
  • Запуск процесса перечисления PCI-шин (обычно при загрузке ядра).

Возможный сценарий атаки​


Сценарий воспроизведения описан в логах сбоев: система с ядром 6.9.7+ на платформе RV32 пытается инициализировать PCI-шину. В момент первого обращения к конфигурационному пространству возникает Unable to handle kernel NULL pointer dereference at virtual address 00000800.

Стек вызовов показывает путь от pci_host_common_probe до pci_generic_config_read. Результатом является падение ядра (Oops) и невозможность загрузки системы или зависание на этапе инициализации оборудования. Для атакующего это представляет интерес как вектор DoS, если он может инициировать перезагрузку или пересканирование шин.

Есть ли публичный эксплойт​


Публичный эксплойт в виде готового кода для удаленной атаки не опубликован. Однако существует техническое описание сбоев (Oops) и патч, который подтверждает воспроизводимость проблемы.

  • PoC: Логи сбоев ядра, приложенные к отчету об уязвимости.
  • Эксплуатация: Подтверждено локальное падение ядра при инициализации.
  • Удаленная атака: Сведения об удаленной эксплуатации отсутствуют, так как сбой привязан к процессу загрузки/инициализации драйвера.

Признаки эксплуатации​


Специфичных сетевых индикаторов (IOC) для этой уязвимости нет, так как она проявляется на уровне ядра при инициализации оборудования. Общие неспецифичные признаки, которые могут указывать на проблему:

  • Записи в dmesg или системном журнале с текстом Unable to handle kernel NULL pointer dereference.
  • Стек вызовов, содержащий pci_generic_config_read и pci_host_common_probe.
  • Невозможность загрузки системы или зависание на этапе инициализации PCI-устройств.

Как обнаружить атаку​


Для обнаружения проблемы достаточно анализа логов ядра. Если система работает стабильно, признаков эксплуатации нет. При подозрении на сбой из-за этой уязвимости:

  • Проверьте dmesg | grep -i "null pointer".
  • Ищите упоминания pci_generic_config_read в стеках сбоев.
  • Убедитесь, что система не использует pci-host-cam-generic на 32-битных ядрах без патча.
  • Мониторьте логи загрузки (journalctl -b) на наличие Oops-сообщений.

Как проверить свою версию​


Проверьте текущую версию ядра и наличие патча. Команды для проверки версии:

Bash:
uname -r
uname -a
cat /proc/version

Для проверки наличия конкретного исправления в исходниках (если вы собираете ядро): git log --oneline | grep 008cb88edb41f3c7c8e0ed76719830984. В бинарных дистрибутивах сверяйтесь с базами данных обновлений вашего вендора.

Исправление​


Единственный способ устранения уязвимости — обновление ядра до версии, содержащей коммит 008cb88edb41f3c7c8e0ed76719830984.

  • Официальный патч: Доступен в стабильных ветках Linux Kernel (stable tree).
  • Дистрибутивы: Установите последние обновления безопасности от вашего поставщика (Ubuntu, Debian, RHEL и др.).
  • Сборка из исходников: Включите коммит 008cb88edb41f3c7c8e0ed76719830984 в дерево ядра перед сборкой.
  • Альтернатива: Если обновление невозможно, рассмотрите переход на 64-битную архитектуру или использование режима ECAM, если это поддерживается оборудованием.

Временные меры защиты​


Поскольку сбой происходит при инициализации драйвера, временные меры ограничены:

  • Отключение PCI-устройств: Если возможно, отключите PCI-устройства, управляемые pci-host-generic, в Device Tree или BIOS/UEFI.
  • Использование ECAM: Если оборудование поддерживает, переключитесь на режим ECAM (pci-host-ecam-generic), который не подвержен этой ошибке.
  • Переход на 64-бит: Использование 64-битного ядра устраняет проблему с разделением маппинга, так как ioremap может обработать все пространство сразу.

Как проверить устранение уязвимости​


После обновления ядра проверьте, что система загружается без сбоев при инициализации PCI-устройств.

  • Загрузите систему и выполните dmesg | grep -i "pci".
  • Убедитесь, что отсутствуют сообщения об Oops или NULL pointer dereference.
  • Проверьте, что PCI-устройства корректно обнаружены: lspci.
  • Если сбоев нет, уязвимость устранена.

Вывод​


CVE-2026-80917 — это критический дефект инициализации, а не классическая сетевая уязвимость. Он приводит к падению ядра на 32-битных системах с CAM.

Обновление ядра до версии с патчем 008cb88edb41f3c7c8e0ed76719830984 полностью устраняет проблему. Для большинства пользователей 64-битных систем риск минимален, но владельцам 32-битных встраиваемых систем с PCI-устройствами необходимо срочно применить обновление.

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


  1. NVD — CVE-2026-80917
  2. FIRST EPSS — CVE-2026-80917
  3. PCI: host-generic: Fix NULL pointer dereference on 32-bit CAM systems - kernel/git/stable/linux.git - Linux kernel stable tree
  4. PCI: host-generic: Fix NULL pointer dereference on 32-bit CAM systems - kernel/git/stable/linux.git - Linux kernel stable tree
  5. PCI: host-generic: Fix NULL pointer dereference on 32-bit CAM systems - kernel/git/stable/linux.git - Linux kernel stable tree
  6. PCI: host-generic: Fix NULL pointer dereference on 32-bit CAM systems - kernel/git/stable/linux.git - Linux kernel stable tree
  7. PCI: host-generic: Fix NULL pointer dereference on 32-bit CAM systems - kernel/git/stable/linux.git - Linux kernel stable tree
  8. PCI: host-generic: Fix NULL pointer dereference on 32-bit CAM systems - kernel/git/stable/linux.git - Linux kernel stable tree
  9. PCI: host-generic: Fix NULL pointer dereference on 32-bit CAM systems - kernel/git/stable/linux.git - Linux kernel stable tree
  10. PCI: host-generic: Fix NULL pointer dereference on 32-bit CAM systems - kernel/git/stable/linux.git - Linux kernel stable tree

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


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