CVE-2026-64560 в Linux Kernel: гонка в posix-cpu-timers и UAF при exec()

CVE: CVE-2026-64560
Продукт: Linux Kernel
Дата публикации: 29.07.2026
Критичность: HIGH
CVSS: 7.8 (3.1)
EPSS: 0,40%; процентиль 32,91%
CISA KEV: нет подтверждения в каталоге CISA KEV

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


В подсистеме posix-cpu-timers ядра Linux обнаружена гонка, возникающая при вызове exec() нелидерным потоком. Конфликт между удалением таймера и сменой лидера группы потоков приводит к использованию освобождённой памяти (Use-After-Free). Статья описывает механику нарушения, условия срабатывания и способы проверки наличия исправления в системе.

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


Риск связан с повреждением памяти в ядре при специфическом сценарии многопоточной работы и смены исполняемого файла. Эксплуатация требует локального доступа и может привести к отказу в обслуживании или повышению привилегий.

  • Тип ошибки: Use-After-Free (UAF) в подсистеме таймеров.
  • CVSS: 7.8 (HIGH). Вектор: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H. Оценивается как локальная атака с низким порогом сложности.
  • Условия атаки: Локальный доступ, отсутствие необходимости в пользовательском взаимодействии.
  • Эксплуатация: Публичные данные о подтверждённой эксплуатации в реальных атаках отсутствуют.
  • EPSS: 0,40%. Вероятность эксплуатации в ближайшие 30 дней оценивается как низкая.

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


Уязвимость затрагивает подсистему posix-cpu-timers в ядре Linux. Конкретные версии пакетов для дистрибутивов в предоставленных данных не указаны, однако исправление распространяется на стабильные ветки ядра.

  • Компонент: kernel/time/posix-cpu-timers.c, kernel/exit.c, kernel/signal.c.
  • Исторический контекст: Проблема связана с логикой, введённой в 2010 году (commit e0a70217107e) и последующими изменениями (commit 55e8c8eb2c7b).
  • Статус: Исправление включено в стабильные релизы ядра Linux.

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


Причина кроется в гонке между удалением таймера (sys_timer_delete) и сменой исполняемого файла нелидерным потоком (exec).

При вызове exec() нелидерным потоком происходит смена лидера группы потоков. В этот момент другой поток может пытаться удалить CPU-таймер, привязанный к старому лидеру. Функция posix_cpu_timer_del находит задачу по PID, но к моменту получения блокировки sighand структура задачи уже освобождена или её поле sighand обнулено.

Код некорректно обрабатывает ситуацию, когда sighand равен NULL. Вместо безопасного завершения он может освободить объект таймера, который всё ещё находится в очереди. Последующий доступ к этому объекту со стороны планировщика таймеров приводит к UAF.

Дополнительную сложность создают архитектурные особенности: на системах с слабой упорядоченностью памяти (weakly ordered) не гарантируется видимость записей в posix_cpu_timers*_exit при чтении sighand == NULL.

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


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

  • Подготовка: В процессе создаётся CPU-таймер, привязанный к группе потоков (TGID).
  • Гонка: Нелидерный поток вызывает exec(). Одновременно другой поток инициирует удаление таймера через timer_delete.
  • Нарушение: Во время exec() старый лидер освобождается, а sighand обнуляется. Функция удаления таймера находит задачу, но не может безопасно заблокировать sighand.
  • UAF: Таймер освобождается, но его узел остаётся в очереди. Планировщик run_posix_cpu_timers обращается к освобождённой памяти, что приводит к повреждению данных ядра.

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


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

  • Локальный доступ: Атакующий должен иметь возможность создавать процессы и потоки на целевой системе.
  • Многопоточность: Процесс должен содержать несколько потоков, чтобы была возможна смена лидера через exec() нелидерным потоком.
  • Использование CPU-таймеров: Приложения должны использовать API timer_create с часами CLOCK_THREAD_CPUTIME_ID или CLOCK_PROCESS_CPUTIME_ID.
  • Точная синхронизация: Требуется попасть в узкое временное окно между сменой лидера и освобождением структуры задачи.

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


Сценарий предполагает компрометацию локальной системы через многопоточное приложение.

Атакующий запускает процесс, который создаёт несколько потоков. Один из потоков устанавливает CPU-таймер. Затем нелидерный поток вызывает exec() для загрузки нового исполняемого файла. В этот момент другой поток вызывает timer_delete.

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

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


В предоставленных источниках отсутствуют сведения о публичных эксплойтах, используемых в реальных атаках.

  • PoC: Информация о наличии публичного Proof-of-Concept кода в переданных данных не раскрыта.
  • Эксплуатация: Нет подтверждений того, что уязвимость активно эксплуатируется в дикой природе.
  • Статус: Уязвимость исправлена в ядре, что снижает риск её использования.

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


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

  • Сбои ядра: Записи в dmesg или kern.log о kernel panic, BUG или WARNING в функциях posix-cpu-timers.
  • Аномальные ошибки: Повторяющиеся ошибки -ESRCH при работе с таймерами в многопоточных приложениях.
  • Неожиданные завершения: Сбои процессов, использующих CPU-таймеры, в момент вызова exec().

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


Обнаружение атаки затруднено из-за локального характера и отсутствия специфичных сетевых признаков. Рекомендуется мониторинг журналов ядра.

  • Мониторинг dmesg: Поиск записей, содержащих posix-cpu-timers, timer_delete или exec в контексте ошибок.
  • Аудит системных вызовов: Использование auditd для отслеживания вызовов timer_create, timer_delete и execve в многопоточных процессах.
  • Анализ сбоев: Анализ core dump файлов при падении ядра на наличие ссылок на run_posix_cpu_timers.

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


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

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

Сравните полученную версию с релизными заметками вашего дистрибутива Linux. Исправление включено в стабильные ветки ядра. Если вы используете дистрибутив, следите за обновлениями пакетов linux или linux-image.

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


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

  • Обновление ядра: Установите последнюю доступную версию ядра через пакетный менеджер вашего дистрибутива.
  • Перезагрузка: После обновления ядра требуется перезагрузка системы для применения изменений.
  • Проверка: Убедитесь, что новая версия ядра содержит коммит 920f893f735e92ba3a1cd9256899a186b161928d или более поздний.

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


До обновления ядра можно снизить риск, ограничив использование многопоточных CPU-таймеров.

  • Избегание exec() в нелидерных потоках: Модифицируйте приложения так, чтобы вызов exec() выполнялся только лидером группы потоков.
  • Ограничение таймеров: Если возможно, используйте другие механизмы таймеров, не привязанные к CPU-времени процесса, или отключите использование CLOCK_PROCESS_CPUTIME_ID.
  • Изоляция: Запускайте критичные многопоточные приложения в контейнерах или виртуальных машинах с ограниченным доступом к ядру.

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


После обновления ядра проверьте, что уязвимость устранена.

Bash:
uname -r

Убедитесь, что версия соответствует исправленной. Также можно проверить наличие патча в исходном коде ядра, если вы компилируете его самостоятельно. В дистрибутивах проверьте логи установки пакетов ядра.

Вывод​


CVE-2026-64560 представляет собой серьёзную уязвимость в подсистеме таймеров ядра Linux, связанную с гонкой при смене исполняемого файла. Несмотря на высокую оценку CVSS, вероятность активной эксплуатации на данный момент низкая. Администраторам рекомендуется обновить ядро до последней стабильной версии, чтобы исключить риск использования освобождённой памяти и потенциального повышения привилегий.

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


  1. NVD — CVE-2026-64560
  2. FIRST EPSS — CVE-2026-64560
  3. posix-cpu-timers: Prevent UAF caused by non-leader exec() race - kernel/git/stable/linux.git - Linux kernel stable tree
  4. posix-cpu-timers: Prevent UAF caused by non-leader exec() race - kernel/git/stable/linux.git - Linux kernel stable tree
  5. posix-cpu-timers: Prevent UAF caused by non-leader exec() race - kernel/git/stable/linux.git - Linux kernel stable tree
  6. posix-cpu-timers: Prevent UAF caused by non-leader exec() race - kernel/git/stable/linux.git - Linux kernel stable tree
  7. posix-cpu-timers: Prevent UAF caused by non-leader exec() race - kernel/git/stable/linux.git - Linux kernel stable tree
  8. posix-cpu-timers: Prevent UAF caused by non-leader exec() race - kernel/git/stable/linux.git - Linux kernel stable tree
  9. posix-cpu-timers: Prevent UAF caused by non-leader exec() race - kernel/git/stable/linux.git - Linux kernel stable tree
  10. posix-cpu-timers: Prevent UAF caused by non-leader exec() race - kernel/git/stable/linux.git - Linux kernel stable tree

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


  • 07.08.2026 — Опубликована первая версия материала.
  • 31.08.2026 — Уточнены сведения об уязвимых версиях, оценке риска или исправлении.
 
Последнее редактирование:
Назад
Верх Низ