Раскрыт механизм эксплуатации критической уязвимости в таймерах Linux для Android

vulnerability

Исследователи кибербезопасности опубликовали рабочий proof-of-concept (доказательство концепции), демонстрирующий эксплуатацию критической уязвимости типа use-after-free (использование после освобождения) в реализации POSIX CPU таймеров ядра Linux. Эксперты называют этот эксплойт одним из наиболее сложных для ядра, нацеленных на устройства Android. Уязвимость, зарегистрированная как CVE-2025-38352, ранее уже фиксировалась в рамках ограниченных целевых атак в реальной среде Android.

Детали уязвимости

Ошибка существует в функции ядра "handle_posix_cpu_timers()", которая обрабатывает сработавшие таймеры во время тактов планировщика задач процессора. Критический сценарий возникает, когда задача переходит в состояние зомби - это состояние процесса после завершения потока, но до того, как родительский процесс соберёт его статус завершения. Атака использует состояние гонки между двумя ключевыми операциями ядра.

Технически, когда "handle_posix_cpu_timers()" снимает свою блокировку после сбора сработавших таймеров, злоумышленник может одновременно "пожинать" зомби-задачу и удалять таймер. Это заставляет ядро освободить структуру таймера через механизм RCU (Read-Copy-Update, чтение-копирование-обновление), в то время как доступ к ней всё ещё осуществляется. В результате возникает классический сценарий use-after-free.

Эксплуатация требует точной координации по времени. Дочерний процесс создаёт неосновной поток с POSIX CPU таймером, настроенным на срабатывание сразу после перехода потока в состояние зомби. Родительский процесс, работающий через "ptrace", завершает зомби-поток, в то время как дочерний процесс одновременно вызывает "timer_delete()". При выигрыше состояния гонки освобождённый таймер обрабатывается в "handle_posix_cpu_timers()", что приводит к повреждению памяти ядра.

Важно отметить, что эта уязвимость затрагивает исключительно 32-разрядные устройства Android. Современные 64-разрядные ядра Linux и архитектуры x86 включают опцию конфигурации "CONFIG_POSIX_CPU_TIMERS_TASK_WORK", которая блокирует эксплуатацию. Только 32-разрядные ARM-устройства лишены этой защиты, что объясняет, почему эксплойты остаются ограниченными конкретными реализациями Android.

Тестирование уязвимости требует тщательной настройки окружения. Необходима версия ядра 6.12.33 (последняя уязвимая LTS), многоядерная конфигурация и отключенный детектор KASAN (Kernel Address Sanitizer). Исследователи продемонстрировали успешную эксплуатацию как с KASAN, так и без него, получив различные сигнатуры сбоев.

Рабочий proof-of-concept сочетает координацию родительского и дочернего процессов через присоединение "ptrace", многопоточную синхронизацию с использованием барьеров и закрепление за конкретными ядрами процессора. Эксплойт достигает успеха примерно в 50% случаев на правильно настроенных системах, что подтверждает методологию активации состояния гонки.

Воздействие на безопасность проявляется через обнаруженные KASAN записи slab-use-after-free и предупреждения ядра в "send_sigqueue()". Оба случая демонстрируют успешное повреждение структур памяти в ядре. Хотя текущие proof-of-concept остаются в основном демонстрационными, исследователи отмечают потенциал для повышения привилегий через техники эксплуатации хипа cross-cache.

Однако расширение ограниченного окна состояния гонки в контексте прерывания представляет серьёзные инженерные сложности. Сообщество разработчиков ядра Linux уже выпустило патчи. Владельцам затронутых систем следует в приоритетном порядке обновить ядро до исправленных версий для снижения рисков.

Ссылки

Комментарии: 0