В Intel выяснили, что принятый без проверки в код ядра Linux 6.13 патч от сотрудника Microsoft оказался проблемным
Разработчик из Intel в рамках тестов выяснил, что принятый без особой проверки в код ядра Linux 6.13 патч от сотрудника Microsoft оказался проблемным. Примечательно, что это изменение, ставшее в итоге причинами сбоя в некоторых тестовых ситуациях, было подано нестандартно, но изначально принято, хотя не получило ни одного подтверждения от мэйнтайнеров архитектуры x86, что является нарушением общепринятых практик в разработке проектов, включая ядро Linux.
Патч добавлял возможность использования больших страниц памяти в режиме ROX (Read Only Execute) при выделении памяти, предназначенной для размещения исполняемого кода. Опция ROX позволяет использовать память с исполняемым кодом в режиме только для чтения, что усложняет эксплуатацию некоторых уязвимостей.
В новой и ещё разрабатываемой версии ядра Linux 6.13 для исполняемого кода модулей на системах x86_64 по умолчанию было включено использование кэша больших исполняемых страниц памяти, отражённых как ROX. Изменение решало проблему с маппингом в режиме ROX страниц для ещё полностью не сформированного исполняемого кода и позволяло обойтись без временного репаминга ROX‑страниц в режим записи до завершения подготовки модулей ядра к работе.
На финальном этапе тестирования ядра Linux 6.13 инженер из компании Intel выявил сбой, не позволяющий ядру корректно выйти из спящего режима на некоторых ноутбуках с процессорами Intel (например, с CPU на базе микроархитектуры Alderlake). Сбой проявлялся при сборке ядра компилятором Clang с включённым режимом защиты CFI (Control Flow Integrity), блокирующим нарушения нормального порядка выполнения (control flow) в результате применения эксплоитов, изменяющих хранимые в памяти указатели на функции.
В качестве временного решения мэйнтейнеры из компаний Intel и AMD, отвечающие за архитектуру x86, предложили отключить использование EXECMEM_ROX в ядре Linux 6.13, до того как будет подготовлен и протестирован полноценный патч, решающий проблему (первый вариант исправления не решил проблему).
Написать комментарий