CVE-2026-80916 в Linux Kernel: гонка в KCOV, уязвимые версии и защита

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

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


В подсистеме KCOV ядра Linux устранена уязвимость, приводящая к повреждению данных и гонкам на ядрах с PREEMPT_RT. Проблема возникает при вложенной прерываемости softirq-тредов, что может привести к потере состояния KCOV, выходу за границы буфера и утечке памяти. Статья разбирает механику сбоя, условия эксплуатации и способы проверки исправления.

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


Уязвимость затрагивает подсистему сбора покрытия кода (KCOV) в ядре Linux. Риск реализуется только на ядрах, собранных с опцией PREEMPT_RT, где softirq-обработчики выполняются как прерываемые потоки. При вложенном прерывании потоков происходит перезапись общего per-CPU буфера, что приводит к потере данных и потенциальному повреждению памяти.

  • Тип ошибки: Race condition и data corruption. Официальные CWE-идентификаторы в NVD не присвоены.
  • CVSS: Официальная оценка NVD не присвоена (данные отсутствуют).
  • Условия атаки: Требуется ядро с PREEMPT_RT и активная сессия remote KCOV.
  • Факт эксплуатации: Подтверждено фаззингом (syzbot), подтвержденная эксплуатация в реальных атаках не зафиксирована.
  • EPSS: 0,18% (процентиль 7,83%), что указывает на низкую вероятность эксплуатации в ближайшем будущем.

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


Уязвимость затрагивает подсистему kernel/kcov.c в ядре Linux. Проблема проявляется исключительно в конфигурациях с включенной опцией CONFIG_PREEMPT_RT.

  • Версии ядра: Исправление внесено в ветки stable (5.15, 6.1, 6.6, 6.12 и другие). Точные номера версий, в которых отсутствует патч, необходимо сверять с официальными релизами дистрибутива.
  • Компоненты: include/linux/sched.h, kernel/kcov.c, lib/Kconfig.debug.
  • Опции сборки: CONFIG_KCOV, CONFIG_PREEMPT_RT.

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


Причина кроется в использовании per-CPU области памяти для временного хранения состояния KCOV при переходе в контекст softirq. В ядрах PREEMPT_RT softirq-обработчики (например, ksoftirqd) выполняются как обычные прерываемые потоки.

Когда softirq-поток прерывает задачу, работающую с remote KCOV, состояние задачи сохраняется в per-CPU буфер. Если этот softirq-поток, в свою очередь, прерывается другим softirq-потоком более высокого приоритета на том же CPU, второй поток перезаписывает тот же per-CPU буфер. Это приводит к безвозвратной потере исходного состояния KCOV.

Дополнительная проблема возникает при неудачном выделении памяти в kcov_init(). Если vmalloc_node() возвращает NULL, переменная irq_area остается NULL, но kcov_remote_start() ожидает ее ненулевое значение, что ведет к выделению памяти в недопустимом контексте и выходу за границы массива.

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


Атака эксплуатирует гонку условий при вложенном прерывании потоков. Атакующий должен иметь возможность запускать процессы с активированным KCOV (например, через prctl или ioctl), чтобы инициировать remote-сессию.

  • Запускается процесс с активной сессией remote KCOV.
  • На том же CPU срабатывает softirq, который прерывает выполнение задачи.
  • Softirq-поток сохраняет состояние KCOV задачи в per-CPU буфер.
  • До завершения первого softirq срабатывает второй softirq более высокого приоритета.
  • Второй softirq перезаписывает per-CPU буфер, уничтожая сохраненное состояние.

В результате при возврате управления первому softirq или задаче происходит обращение к поврежденным данным. Это может привести к записи за пределы выделенного буфера (out-of-bounds write) или утечке памяти, что в худшем случае позволяет атакующему повредить структуры ядра и получить повышение привилегий.

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


Для успешной эксплуатации уязвимости необходимо соблюдение ряда строгих условий:

  • Ядро с PREEMPT_RT: Уязвимость проявляется только в ядрах, собранных с опцией CONFIG_PREEMPT_RT.
  • Включенный KCOV: Подсистема KCOV должна быть скомпилирована в ядро (CONFIG_KCOV=y или m).
  • Права на запуск KCOV: Атакующий должен иметь возможность создавать процессы и настраивать KCOV (обычно требуется CAP_SYS_ADMIN или соответствующие права на использование prctl/ioctl).
  • Специфичная загрузка CPU: Необходимо, чтобы два softirq-потока с разной приоритетностью были запланированы на одном CPU в момент, когда первый из них прерывает задачу с KCOV.

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


Сценарий атаки предполагает, что атакующий имеет доступ к запуску процессов на целевой системе. Он запускает процесс, который инициализирует сессию remote KCOV. В этот момент на том же CPU происходит срабатывание softirq (например, обработка сетевого пакета или таймера).

Softirq-поток ksoftirqd прерывает выполнение задачи и сохраняет состояние KCOV в per-CPU буфер. Если в этот момент срабатывает другой softirq более высокого приоритета, он также обращается к тому же per-CPU буферу. Поскольку буфер общий для всех потоков на CPU, данные первого softirq перезаписываются.

Когда первый softirq пытается восстановить состояние, он работает с поврежденными данными, что приводит к некорректной записи в память ядра. Это может вызвать сбой ядра (panic) или, при удачном стечении обстоятельств, позволить атакующему контролировать указатели и выполнить код в контексте ядра.

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


Публичный эксплойт в виде готового PoC для эксплуатации в реальных атаках не опубликован. Однако уязвимость была обнаружена и подтверждена фаззинг-инструментом syzbot, который предоставил отчеты о повреждении состояния KCOV.

  • PoC: Существуют отчеты syzbot, демонстрирующие воспроизводимость сбоя (data corruption).
  • Техническое описание: Полное описание механики и патч доступны в официальных коммитах ядра Linux.
  • Эксплуатация: Подтвержденная эксплуатация в реальных атаках (in-the-wild) не зафиксирована. EPSS-оценка (0,18%) указывает на низкую вероятность массового использования.

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


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

  • Сбои ядра: Записи в dmesg или journalctl о kernel panic, BUG: unable to handle page fault или general protection fault в функциях kcov_*.
  • Аномальная активность KCOV: Необычное количество процессов, использующих prctl(PR_SET_KCOV) или ioctl(KCOV_ENABLE), особенно в сочетании с высокой нагрузкой на CPU.
  • Утечки памяти: Рост потребления памяти ядром без видимой причины, что может указывать на утечки, описанные в патче.

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


Для обнаружения потенциальной эксплуатации или наличия уязвимости рекомендуется использовать следующие методы:

  • Проверка версии ядра: Убедитесь, что ядро содержит патч 2eed77fdcb0cc48e8eccb2bcd4b7f2c6d650e84c или его backport в вашу ветку.
  • Мониторинг логов: Настройте сбор и анализ логов ядра на предмет ошибок, связанных с KCOV или softirq.
  • Аудит конфигурации: Проверьте, включена ли опция CONFIG_PREEMPT_RT и CONFIG_KCOV в вашей сборке ядра. Если KCOV не используется, его можно отключить для снижения поверхности атаки.

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


Для проверки версии ядра и наличия патча используйте следующие команды:

Bash:
# Проверка версии ядра
uname -r
uname -a

# Проверка конфигурации ядра (если доступен /boot/config-<версия>)
grep -E "CONFIG_PREEMPT_RT|CONFIG_KCOV" /boot/config-$(uname -r)

# Проверка наличия патча в исходниках (если доступен git-репозиторий)
git log --oneline | grep "2eed77fdcb0cc48e8eccb2bcd4b7f2c6d650e84c"

Если вы используете дистрибутив, проверьте наличие обновлений через пакетный менеджер (например, apt list --upgradable | grep linux или dnf check-update | grep kernel).

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


Единственным надежным способом устранения уязвимости является обновление ядра до версии, содержащей патч 2eed77fdcb0cc48e8eccb2bcd4b7f2c6d650e84c.

  • Обновление ядра: Установите последние доступные обновления ядра от вашего дистрибутива.
  • Пересборка ядра: Если вы используете кастомную сборку, примените патч из официального репозитория Linux kernel и пересоберите ядро.
  • Отключение KCOV: Если функциональность KCOV не требуется, отключите CONFIG_KCOV при сборке ядра. Это полностью устранит поверхность атаки, связанную с этой подсистемой.

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


Пока обновление ядра не установлено, можно применить следующие временные меры:

  • Отключение KCOV: Если возможно, отключите использование KCOV в приложениях или отключите CONFIG_KCOV в ядре (требует пересборки).
  • Ограничение доступа: Ограничьте возможность запуска процессов с правами, необходимыми для инициализации KCOV, до доверенных пользователей.
  • Мониторинг: Усиленный мониторинг логов ядра на предмет аномальных сбоев, связанных с KCOV или softirq.

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


Для проверки успешного применения исправления выполните следующие шаги:

  • Проверка версии: Убедитесь, что версия ядра соответствует версии, содержащей патч.
  • Проверка конфигурации: Если KCOV отключен, убедитесь, что CONFIG_KCOV не включен в конфигурации ядра.
  • Функциональное тестирование: Запустите процессы с активированным KCOV и убедитесь, что они работают без сбоев. Если уязвимость была, при вложенном прерывании softirq могли наблюдаться ошибки, которые теперь должны отсутствовать.
  • Проверка логов: Убедитесь, что в dmesg или journalctl отсутствуют новые записи об ошибках, связанных с KCOV.

Вывод​


CVE-2026-80916 представляет собой серьезную уязвимость в подсистеме KCOV ядра Linux, затрагивающую конфигурации с PREEMPT_RT. Хотя вероятность массовой эксплуатации пока низка, потенциальные последствия (повреждение памяти, повышение привилегий) делают обновление ядра приоритетной задачей. Администраторам рекомендуется проверить наличие патча в своих системах и, при необходимости, отключить KCOV, если он не используется.

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


  1. NVD — CVE-2026-80916
  2. FIRST EPSS — CVE-2026-80916
  3. kcov: fix data corruption and race conditions on PREEMPT_RT - kernel/git/stable/linux.git - Linux kernel stable tree
  4. kcov: fix data corruption and race conditions on PREEMPT_RT - kernel/git/stable/linux.git - Linux kernel stable tree
  5. kcov: fix data corruption and race conditions on PREEMPT_RT - kernel/git/stable/linux.git - Linux kernel stable tree
  6. kcov: fix data corruption and race conditions on PREEMPT_RT - kernel/git/stable/linux.git - Linux kernel stable tree
  7. kcov: fix data corruption and race conditions on PREEMPT_RT - kernel/git/stable/linux.git - Linux kernel stable tree
  8. kcov: fix data corruption and race conditions on PREEMPT_RT - kernel/git/stable/linux.git - Linux kernel stable tree
  9. kcov: fix data corruption and race conditions on PREEMPT_RT - kernel/git/stable/linux.git - Linux kernel stable tree
  10. kcov: fix data corruption and race conditions on PREEMPT_RT - kernel/git/stable/linux.git - Linux kernel stable tree

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


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