Критическая уязвимость в операционной системе CentOS 9 позволяет локальному пользователю повысить свои привилегии до уровня суперпользователя root. Ошибка типа Use-After-Free (UAF, использование после освобождения) существует в подсистеме сетевого планировщика ядра Linux. Исследователи уже опубликовали рабочее доказательство концепции, демонстрирующее эксплуатацию уязвимости. Несмотря на уведомление вендора более 90 дней назад, официальный патч до сих пор не выпущен.
Детали уязвимости
Проблема, удостоенная первого места в категории Linux на соревновании по взлому TyphoonPWN 2025, кроется в пакетном планировщике "sch_cake" (Common Applications Kept Enhanced). Ошибка в логике приводит к состоянию использования после освобождения памяти. Конкретно функция "cake_enqueue" некорректно возвращает статус успешной постановки в очередь ("NET_XMIT_SUCCESS") даже в случае отбрасывания пакета из-за переполнения буфера.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | cstatic s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free) { // ... if (q->buffer_used > q->buffer_limit) { // [1] Check buffer limit u32 dropped = 0; while (q->buffer_used > q->buffer_limit) { dropped++; cake_drop(sch, to_free); // [2] Packet is DROPPED here } b->drop_overlimit += dropped; } return NET_XMIT_SUCCESS; // [!] Returns SUCCESS anyway } |
Когда поверх CAKE используется иерархический планировщик, например HFSC (Hierarchical Fair Service Curve), он полагается на этот возвращаемый статус. CAKE сообщает об успехе, и HFSC сохраняет ссылку на соответствующий класс. Однако поскольку пакет был фактически отброшен, этот класс может быть освобожден, в то время как HFSC считает его активным. Это создает "висячий указатель" (dangling pointer), ссылающийся на недействительную область памяти. Последующее обращение к этому указателю через HFSC приводит к использованию после освобождения и позволяет повредить память ядра.
Опубликованный эксплойт демонстрирует полную цепочку атак для получения прав root. Во-первых, злоумышленнику необходимо обойти рандомизацию расположения пространства ядра (KASLR). Для этого в PoC используется атака по сторонним каналам на основе инструкции предварительной выборки. Данный метод позволяет определить смещение ядра в памяти.
Следующий этап предполагает подготовку кучи ядра. Атакующий заполняет ее подконтрольными данными с помощью множественных вызовов функции "sendmsg". Этот процесс, известный как "распыление кучи" (heap spraying), повышает вероятность того, что освобожденная память, на которую указывает висячий указатель, будет перезаписана фальшивой структурой планировщика, подготовленной злоумышленником.
Используя примитив использования после освобождения, атакующий может перенаправить поток выполнения ядра. В эксплойте это достигается путем построения ROP-цепочки (Return-Oriented Programming). Эта цепочка гаджетов из кода ядра выполняет ряд инструкций для перехвата управления. Ключевым шагом является перезапись глобальной переменной ядра "modprobe_path". По умолчанию она содержит путь к утилите "modprobe", которая загружает модули ядра.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | cvoid rop_chain(uint64_t* data){ int i = 0; data[i++] = kbase + POP_RDI_RET; // Prepare stack for payload data[i++] = kbase + PUSH_RDI_POP_RSP_RET; // Stack pivot data[i++] = kbase + POP_RDI_RET; data[i++] = 0x782f706d742f; // String: "/tmp/x" data[i++] = kbase + POP_RSI_RET; data[i++] = kbase + MODPROBE_PATH; // Overwrite modprobe_path data[i++] = kbase + MOV_RSI_RDI_RET; // Execute write data[i++] = kbase + SWAPGS; // Restore user state data[i++] = kbase + IRETQ; // Return to user space // ... (Restore registers) } |
Эксплойт изменяет этот путь на расположение подконтрольного злоумышленнику скрипта. Затем, создавая файл с "магической" сигнатурой и пытаясь его выполнить, атакующий вызывает системную утилиту "modprobe". Поскольку путь к ней был подменен, ядро исполняет вредоносный скрипт от имени root. Этот скрипт, в свою очередь, может установить постоянный доступ или выполнить произвольную полезную нагрузку, например, предоставив оболочку с максимальными привилегиями.
На данный момент для CentOS 9 отсутствует официальное исправление. Разработчики подтвердили наличие уязвимости, но единственным статусом является отметка "в работе". Без точных сроков выхода патча система остается уязвимой для локальных атак. Администраторам рекомендуется внимательно следить за обновлениями ядра. В качестве временных мер можно рассмотреть ограничение доступа к утилите управления трафиком "tc" или запрет на загрузку модуля "sch_cake", если его функционал не является критически важным.
Ситуация подчеркивает классическую проблему безопасности: наличие подробного публичного PoC (Proof-of-Concept) при отсутствии исправления со стороны вендора значительно повышает риски. Злоумышленники могут адаптировать опубликованную технику для создания полноценных вредоносных программ. Уязвимость затрагивает именно локальных пользователей, что подчеркивает важность принципа минимальных привилегий и контроля за учетными записями с обычными правами внутри системы.