Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-64560-Analysis — Анализ UAF в ядре Linux для CVE-2026-64560 с PoC, срабатывающим по гонке, разбором патча, матрицей затронутых версий LTS/Android и самопроверкой пропатченных устройств. | Kitploit
Инструменты/GitHubGitHub/villager1314/cve-2026-64560-analysis
Безопасность AndroidАнализ уязвимостейЭксплуатацияМобильная безопасностьОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubvillager1314/cve-2026-64560-analysis

CVE-2026-64560-Analysis

Анализ UAF в ядре Linux для CVE-2026-64560 с PoC, срабатывающим по гонке, разбором патча, матрицей затронутых версий LTS/Android и самопроверкой пропатченных устройств.

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Репозиторий
11451 месяц назадПроверено Kitploit

CVE-2026-64560 — Гонка в Linux Kernel posix-cpu-timers: UAF при exec() не-лидера

Reproducer / PoC (проверка срабатывания): Linux и Android (NDK) Данный репозиторий предназначен исключительно для проверки статуса исправления на собственном тестовом оборудовании и исследовательских целей, не содержит никаких примитивов повышения привилегий/эксплуатации.

CVSS 3.1 CVSS 4.0 (SUSE) CWE-416 Fix


1. Обзор уязвимости

ПолеЗначение
CVE IDCVE-2026-64560
Названиеposix-cpu-timers: Prevent UAF caused by non-leader exec() race
ТипUse-After-Free (CWE-416), состояние гонки
CNAkernel.org (Linux CNA)
CVSS v3.17.8 High — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0 (SUSE)8.5 High — CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
EPSS~0.12% (2nd percentile, по состоянию на 2026-08)
CISA KEVне включена
Дата публикации2026-07-29
Исправляющий коммит (mainline)920f893f735e92ba3a1cd9256899a186b161928d
Коммит, внёсший проблему (Fixes:)55e8c8eb2c7b (v5.7, 2020) — "posix-cpu-timers: Store a reference to a pid not a task"
Автор исправленияThomas Gleixner <[email protected]>
Автор отчётаWongi Lee <[email protected]>, Jungwoo Lee <[email protected]>
Затрагиваемые файлыkernel/exit.c, kernel/signal.c, kernel/time/posix-cpu-timers.c

Затронутые версии

Уязвимость внесена в v5.7 (2020-05), исправление перенесено во все stable-ветки:

ВеткаЗатронутаВерсия исправления (≥)Stable-коммит исправления
5.10 LTS5.7 ~ 5.10.2615.10.26267aa823e3e8c
5.15 LTS~ 5.15.2125.15.213d8bcb28abad8
6.1 LTS~ 6.1.1796.1.180cc35ddbc4973
6.6 LTS~ 6.6.1466.6.14712a891c773ae
6.12 LTS~ 6.12.996.12.100e74443f5db00
6.18~ 6.18.406.18.416a7ecc25abe6
7.1~ 7.1.47.1.5ad1cafa1bdaa
mainline< 7.2-rc37.2-rc3920f893f735e

Связь с Android

Ядра Android GKI основаны на LTS-ветках 5.10 / 5.15 / 6.1 / 6.6 / 6.12, все они в зоне поражения. Поскольку исправление в mainline было опубликовано 2026-07-29, устройства Android с SPL (Security Patch Level) 2026-08-01 и ранее в основном не содержат этого исправления. Проверить версию ядра и SPL на устройстве можно командами adb shell cat /proc/version и getprop ro.build.version.security_patch.


2. Технические детали

2.1 Предыстория: таймеры posix CPU и sighand

POSIX CPU-таймеры (timer_create(CLOCK_PROCESS_CPUTIME_ID, ...) / timer_create(CLOCK_THREAD_CPUTIME_ID, ...)) обслуживаются в ядре файлом kernel/time/posix-cpu-timers.c. Каждый k_itimer запоминает целевой task через it.cpu.pid; при операциях с таймером требуется получить sighand->siglock этого task через lock_task_sighand(p, &flags) для защиты timerqueue.

Коммит 2020 года 55e8c8eb2c7b заменил указатель на task, кэшируемый в таймере, на ссылку на pid (для исправления проблемы, внесённой workaround 2010 года e0a70217107e), добавив перед каждой операцией поиск через pid_task(pid, type). Это изменение и оставило окно гонки, ставшее причиной данного CVE.

2.2 Сценарий гонки (exec не-лидером потока)

Когда execve() выполняется потоком, не являющимся лидером, de_thread() → switch_leader() переносит TGID со старого лидера на нового, а старый лидер проходит release_task() → __exit_signal(), где old_leader->sighand = NULL и выполняется unhash_task(old_leader).

В то же самое время sys_timer_delete() → posix_cpu_timer_del() на другом CPU:

 sys_timer_delete()                        exec()
   posix_cpu_timer_del()
   // наблюдает старого лидера
   p = pid_task(pid, pid_type);            de_thread()
                                             switch_leader();
                                             release_task(old_leader)
                                               __exit_signal(old_leader)
                                                 sighand = lock(old_leader, sighand);
                                                 posix_cpu_timers*_exit();
   sighand = lock_task_sighand(p)            unhash_task(old_leader);
     sh = lock(p, sighand)                   old_leader->sighand = NULL;
                                               unlock(sighand);
     (p->sighand == NULL)
       unlock(sh)
       return NULL;

   // сразу возврат, без удаления из цепочки!
   if (!sighand)
      return 0;
   free_posix_timer();   // ← k_itimer освобождается

Найденный posix_cpu_timer_del() p — это старый лидер, у которого p->sighand == NULL; функция считает, что "task завершается, путь exit сам снимет таймер с цепочки", поэтому ничего не делает и возвращает успех. Затем free_posix_timer() освобождает k_itimer.

Ключевой момент: exec() отличается от exit() — при exec() TGID не меняется, и armed-таймеры, висящие на уровне процесса (p->signal->cpu_timers), наследуются и остаются в очереди. Тогда:

  • run_posix_cpu_timers() (обходит timerqueue в тике) обращается к timerqueue_node уже освобождённого объекта → UAF чтение/запись;
  • операции add/delete других таймеров также обходят это rbtree с висячим узлом → UAF.

Аналогичная проблема существует и в:

  • posix_cpu_timer_set(): обычный таймер просто временно возвращает -ESRCH; однако внутренний do_cpu_nanosleep() использует k_itimer, выделенный на стеке, — тот же UAF.
  • posix_cpu_timer_rearm(): тихий сбой rearm, таймер больше не срабатывает (функциональный баг).

2.3 Вторичная проблема на слабоупорядоченных архитектурах

Frederic Weisbecker указал: запись tsk->sighand = NULL в __exit_signal() — обычное сохранение, и на слабоупорядоченных архитектурах вроде ARM64, когда posix_cpu_timer_del() наблюдает sighand == NULL, не гарантируется, что он также увидит запись снятия с цепочки, выполненную до posix_cpu_timers*_exit(), из-за чего WARN_ON_ONCE(timer_queued(tmr)) может ложно срабатывать.

2.4 Схема исправления

  1. В __exit_signal() заменено на smp_store_release(&tsk->sighand, NULL);
  2. В ветке !sighand в lock_task_sighand() добавлен smp_acquire__after_ctrl_dep();
  3. Добавлен новый helper timer_lock_sighand(): поиск task + захват sighand; если sighand == NULL — не возвращаться, а повторить поиск — в сценарии exec будет найден новый лидер, в сценарии exit поиск завершается неудачей;
  4. Три затронутые функции (_del / _set / _rearm) переведены на этот helper.

Полный diff — в patches/920f893f735e.patch.


3. Описание PoC (проверка срабатывания, не эксплуатация)

В poc/ находится триггер гонки: два потока в интенсивном цикле выполняют

  • Поток A (поток таймера): многократно timer_create(CLOCK_PROCESS_CPUTIME_ID) → arm (очень короткое начальное время срабатывания) → busy-wait до срабатывания → timer_delete();
  • Поток B (поток exec): многократно fork() → в дочернем процессе создаётся не-лидер поток, который вызывает execve() (exec не-лидером — обязательное условие этой уязвимости), родитель немедленно делает waitpid() для утилизации.
Скачать инструмент