
Это доказательство концепции для CVE-2025-38352, уязвимости в реализации таймеров CPU POSIX в ядре Linux. В бюллетене Android за сентябрь 2025 года упоминается, что эта уязвимость использовалась в ограниченной целенаправленной эксплуатации в реальных условиях.
Этот репозиторий содержит только proof-of-concept, который запускает уязвимость.
С тех пор я написал полный эксплойт для этой уязвимости. Подробности можно найти по ссылке ниже.
https://github.com/farazsth98/chronomaly

PoC сильно зависит от того, сколько времени ЦП потребляет системный вызов getpid.
С этой целью я постарался сделать PoC как можно более системно-независимым, то есть он должен работать на вашей системе, даже если системный вызов getpid тратит значительно больше или меньше времени, чем на моей системе.
Это PoC для CVE-2025-38352, уязвимости состояния гонки в реализации POSIX-таймеров ЦП в ядре Linux. В сентябрьском бюллетене Android за 2025 год упоминается, что эта уязвимость использовалась в ограниченной целенаправленной эксплуатации в реальных условиях.
Он был написан для LTS 6.12.33 и требует отключения CONFIG_POSIX_CPU_TIMERS_TASK_WORK в конфигурации ядра. Кроме того, я также включил полное вытеснение (CONFIG_PREEMPT=y), так как его использует ядро Android.
Как только гонка выиграна, это приводит к use-after-free структуры struct k_itimer.
Более подробную информацию о настройке тестовой среды см. в статье, указанной выше, в частности в разделе 'Testing Environment TL;DR'.
ПРИМЕЧАНИЕ: Для работы этого PoC не требуются патчи (пишу это здесь, потому что мой предыдущий PoC требовал mdelay на 500 мс 😅).
PoC всегда срабатывал у меня в течение 100 попыток (на самом деле никогда не превышал 60 попыток). Надёжность можно улучшить в нескольких местах, на мой взгляд, но я займусь этим позже.
Файл profiler_patch.diff содержит патч для добавления кода профилирования в handle_posix_cpu_timers(). Он полезен для определения того, как расширить окно гонки, так как выводит количество времени выполнения, затраченное на итерацию списка firing здесь.
Скомпилируйте с помощью предоставленного Makefile и просто запустите его с помощью /poc.
Если вы хотите запустить профилировщик, скомпилируйте его так же, как PoC.
Свяжитесь со мной в Twitter или где-либо ещё, если у вас есть вопросы.