Команда специалистов по информационной безопасности выявила и успешно эксплуатировала критическую уязвимость типа Use-After-Free (CVE-2025-38001) в подсистеме HFSC (Hierarchical Fair Service Curve) планировщика пакетов ядра Linux. Атака позволила скомпрометировать защищенные экземпляры Google kernelCTF, включая версии LTS, COS-105, COS-109 и mitigation-среду, а также полностью обновленные системы Debian 12. Успешная эксплуатация принесла исследователям около 82 000 долларов вознаграждения, продемонстрировав беспрецедентную эффективность атаки.
Механика уязвимости
Уязвимость кроется в механизме обработки пакетов при активации функции дублирования NETEM под управлением HFSC в режиме реального времени. При дублировании пакета возникает реентерабельный вызов, приводящий к двойной вставке класса пакета в "eligible tree" - красно-черное дерево (RBTree), отвечающее за планирование. Эта операция формирует цикл в структуре дерева, вызывая бесконечный цикл при извлечении пакетов. Ключевым элементом атаки стало искусственное замедление обработки через корневую очередь Token Bucket Filter (TBF) с низкой пропускной способностью. Задержка удаления пакета создает окно для освобождения памяти дублированного класса, оставляя в дереве "висящий" узел. Последующая попытка добавления нового класса провоцирует состояние Use-After-Free, открывая путь для повреждения ядерной кучи.
Исследователи отказались от традиционных ROP-цепей, разработав инновационный примитив копирования указателей на основе page-vector. Заменив освобожденный объект класса HFSC контролируемым вектором страниц, они манипулировали операциями с указателями RBTree. Это привело к копированию ядерного указателя между векторами, вызывая несоответствие счетчиков ссылок и создавая Use-After-Free на уровне страниц памяти. Данная уязвимость позволила перезаписать учетные данные процесса, эскалировав привилегии до root. Эксплойт продемонстрировал почти абсолютную надежность против Debian 12 (ядро 6.6 и новее) и всех целевых сред Google kernelCTF.
Особенно впечатляет скорость атаки: с помощью оптимизированных скриптов и GPU-ускоренного решения Proof-of-Work исследователи похитили флаг LTS за 3,6 секунды - рекорд в истории Google kernelCTF. Вслед за этим были захвачены флаги COS, а затем обойдена защита mitigation-задачи, подтвердив эффективность эксплойта даже против экспериментальных систем защиты. Инженеры Google оперативно устранили первопричину уязвимости в коммите ac9fe7dd8e73, который предотвращает дублирование записей в RBTree через валидацию операций вставки. Патч интегрирован в основную ветку разработки ядра Linux и войдет в релиз 6.6.8, а также в ближайшие обновления Debian 12.
Данный инцидент подчеркивает фундаментальные риски, возникающие при взаимодействии сложных подсистем ядра. Уязвимость оставалась незамеченной из-за неочевидности сценария: безобидный бесконечный цикл, усиленный искусственной задержкой TBF, трансформировался в надежный вектор для компрометации. Исследование наглядно демонстрирует, что даже продвинутые техники фаззинга могут пропускать подобные multi-component уязвимости, где эксплуатация зависит от комбинации состояний нескольких компонентов. Это подтверждает необходимость глубокого ручного аудита критического кода, особенно в подсистемах сетевого планирования, где неявные зависимости между модулями создают скрытые поверхности атаки.
Эксперты отмечают, что CVE-2025-38001 представляет особую опасность из-за возможности эксплуатации без предварительного условия (zero-click) в сетевом стеке и высокой стабильности работы эксплойта. Хотя патч уже доступен, администраторам рекомендуется ускорить обновление ядер, особенно для систем, использующих конфигурации traffic control с одновременным задействованием HFSC и NETEM. Успешный взлом защищенных сред Google kernelCTF, специально разработанных для тестирования уязвимостей, служит тревожным сигналом о сложности защиты современных ядерных подсистем от целевых атак, использующих цепочки неочевидных состояний.
Ссылки
- https://nvd.nist.gov/vuln/detail/CVE-2025-38001
- https://www.cve.org/CVERecord?id=CVE-2025-38001
- https://git.kernel.org/stable/c/e5bee633cc276410337d54b99f77fbc1ad8801e5
- https://git.kernel.org/stable/c/6672e6c00810056acaac019fe26cdc26fee8a66c
- https://git.kernel.org/stable/c/2c928b3a0b04a431ffcd6c8b7d88a267124a3a28
- https://git.kernel.org/stable/c/a0ec22fa20b252edbe070a9de8501eef63c17ef5
- https://git.kernel.org/stable/c/295f7c579b07b5b7cf2dffe485f71cc2f27647cb
- https://git.kernel.org/stable/c/2f2190ce4ca972051cac6a8d7937448f8cb9673c
- https://git.kernel.org/stable/c/4e38eaaabfb7fffbb371a51150203e19eee5d70e
- https://git.kernel.org/stable/c/39ed887b1dd2d6b720f87e86692ac3006cc111c8