Найти в Дзене

Linux и гонка со смертью: когда ядро само себе выстреливает в ногу (и даёт патрон в руки всем желающим)

Привет! Представьте: вы сидите на кухне, пьёте чай, а в это время в соседней комнате ваше ядро Linux тихо сходит с ума и само себе подсовывает уже сожжённый кусок памяти. Звучит как сценарий дешёвого хоррора? Добро пожаловать в реальность CVE-2025-38352 по кличке Chronomaly. Суть бага настолько безумная, что даже опытные kernel-хулиганы сначала просто хихикали в кулак. Чтобы сломать систему, достаточно поймать момент длиной буквально в несколько микросекунд. В этот микроскопический промежуток времени ядро должно: 1. Создать процесс-зомби 2. Родитель его похоронить (wait()) 3. Одновременно с этим POSIX CPU-таймер скажет «о, привет, я ещё живой!» 4. И бах — обращение к уже освобождённой памяти В обычной жизни такое случается примерно с той же вероятностью, с какой ты выигрываешь в лотерею, сидя на унитазе в 3:47 ночи. Но умные дяди (и одна очень умная тётя по имени Faith из Zellic) научились эту вероятность искусственно накачивать до вполне рабочих процентов. Они назвали свой эксплойт C

Привет! Представьте: вы сидите на кухне, пьёте чай, а в это время в соседней комнате ваше ядро Linux тихо сходит с ума и само себе подсовывает уже сожжённый кусок памяти. Звучит как сценарий дешёвого хоррора? Добро пожаловать в реальность CVE-2025-38352 по кличке Chronomaly.

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

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

1. Создать процесс-зомби

2. Родитель его похоронить (wait())

3. Одновременно с этим POSIX CPU-таймер скажет «о, привет, я ещё живой!»

4. И бах — обращение к уже освобождённой памяти

В обычной жизни такое случается примерно с той же вероятностью, с какой ты выигрываешь в лотерею, сидя на унитазе в 3:47 ночи.

Но умные дяди (и одна очень умная тётя по имени Faith из Zellic) научились эту вероятность искусственно накачивать до вполне рабочих процентов.

Они назвали свой эксплойт Chronomaly — и это действительно хрономагия.

Никаких тебе заранее выученных адресов ядра, никаких KASLR-обходов через /proc, никаких «вот этот offset работает на моей сборке от 17 мая».

Просто чистая, красивая, относительно переносимая эксплуатация use-after-free.

Самое смешное (и страшное одновременно): баг проявляется ТОЛЬКО когда выключен CONFIG_POSIX_CPU_TIMERS_TASK_WORK.

А эту галочку выключают… правильно — очень часто именно в 32-битных Android-ядрах!

На десктопных 64-битных системах она обычно включена, и Chronomaly там просто кашляет в кулачок и уходит курить.

Но вот 32-битные старые планшеты, медиаплееры, автомобильные мозги, какие-нибудь промышленные девайсы на древнем ядре — для них это прямо новогодний подарок от Деда Мороза-скрипт-кидди.

Какой же главный лайфхак Chronomaly?

Они научились надёжно растягивать это микросекундное окно гонки.

Используют несколько ядер (минимум 2), играют с приоритетами, создают кучу таймеров, специально засоряют slab-аллокаторы нужными объектами sigqueue…

Короче, превращают лотерейный билетик в почти гарантированный джекпот.

Исправление уже влито в mainline (коммит f90fff1e152d…).

Очень простое, как и все гениальные решения: «А давайте-ка вообще не будем обрабатывать POSIX-таймеры на зомби-задачах».

Всё. Конец истории.

Но вы же понимаете, как быстро такое исправление попадает на реально старые девайсы?

Вот именно. Лет через 7–8, если повезёт.

Так что пока производители чешут репу и решают «а стоит ли вообще обновлять ядро 5.10 на этом китайском регистраторе 2021 года», кто-то уже практикует фразу:

«Дружище, у тебя же kernel 5.10.157, CONFIG_POSIX_CPU_TIMERS_TASK_WORK = n? Оооооо… ну держись».

Обновляйтесь, включайте CONFIG_POSIX_CPU_TIMERS_TASK_WORK где только можно, и по возможности переводите всё на 64-бит, пока Chronomaly не превратился в Metasploit-модуль уровня «next → next → I’m root».

А то будет обидно, когда твой роутер, умный чайник и автомобиль одновременно решат, что пора стать криптомайнером…

и всё это благодаря одной-единственной микросекундной шутке ядра над самим собой 😏