Поддержка x86_64
KernelSU полностью поддерживает архитектуру x86_64. Однако из-за недавних изменений безопасности в upstream kernel для интеграции KernelSU в современные ядра x86_64 требуется дополнительная обработка, чтобы наш единый dispatcher системных вызовов работал корректно.
Почему это перестало работать?
В более новых версиях ядра был добавлен коммит, усиливающий защиту syscall table. Это изменение преобразовало косвенные переходы в пути системных вызовов в серию прямых условных переходов.
Механизм syscall_hook в KernelSU опирается на изменение записей в syscall table, чтобы перенаправлять перехваченные системные вызовы в единый dispatcher. Поскольку новое hardening-изменение меняет путь системных вызовов, ядро игнорирует такие изменения syscall table. Если KernelSU попытается загрузиться и установить hook на syscall table без корректной обработки этого ограничения, он не сможет маршрутизировать вызовы и безопасно прервет инициализацию, чтобы избежать kernel panic.
Как исправить?
Есть два поддерживаемых способа решить проблему syscall hook на x86_64:
- Включить опцию сборки ядра
KSU_X86_PATCH_SYSCALL_DISPATCHER. - Продолжить использовать исходный способ с патчами исходного кода ядра.
Нужно выбрать только один из них. Не применяйте оба варианта одновременно.
Вариант 1: включить KSU_X86_PATCH_SYSCALL_DISPATCHER
В KernelSU 3.2.6 был добавлен новый официальный механизм для x86_64: опция сборки KSU_X86_PATCH_SYSCALL_DISPATCHER.
Когда эта опция включена, KernelSU динамически патчит hardened dispatcher системных вызовов во время выполнения, чтобы syscall hook работал без прежнего набора патчей исходного кода ядра. Это рекомендуемый вариант, если вы собираете ядро с KernelSU 3.2.6 или новее.
Вариант 2: применить исходные патчи к исходному коду ядра
Если вы не хотите включать KSU_X86_PATCH_SYSCALL_DISPATCHER, можно продолжить использовать прежний подход с патчами ядра.
Чтобы KernelSU работал на этих более новых ядрах, примените патчи, которые позволяют обойти именно это syscall hardening.
ПРЕДУПРЕЖДЕНИЕ О БЕЗОПАСНОСТИ
Используя любой из этих двух способов, вы намеренно обходите или ослабляете механизм защиты, предназначенный для снижения риска уязвимостей speculative execution.
Это снова открывает поверхность атаки через косвенные переходы для системных вызовов. Не используйте ни один из этих способов, если вы используете production-сервер или систему, где критична строгая защита от side-channel атак. Эти варианты предназначены для тестовых окружений, где root-доступ через KernelSU важнее данной конкретной аппаратной mitigation.
Выберите и примените патчи, соответствующие вашей версии ядра. Эти патчи создают возможность X86_FEATURE_INDIRECT_SAFE, которую можно активировать через параметр командной строки ядра syscall_hardening=off.
For kernel 6.6:
https://github.com/android-generic/kernel_common/commit/fe9a9b4c320577c30e1f22d04039e414c6a3cdec
https://github.com/android-generic/kernel_common/commit/df772e99e392f24b395ceaf7b26974e3e4828ee9
For kernel 6.12:
https://github.com/android-generic/kernel-zenith/commit/dd2c602268fdc81f4d3b662f6a15142ac0ec7bcd
https://github.com/android-generic/kernel-zenith/commit/7d99237ae5da61c19447138da3282ae37d43857b
For kernel 6.18:
https://github.com/android-generic/kernel-zenith/commit/40b1c323d1ad29c86e041d665c7f089b9a3ccfb5
https://github.com/android-generic/kernel-zenith/commit/f5813e10b7630e1ccd86fc2c4cf30eef60b64a82Какой вариант выбрать?
- Если вы используете KernelSU 3.2.6 или новее и можете изменить конфигурацию сборки KernelSU, включите
KSU_X86_PATCH_SYSCALL_DISPATCHER. - Если вы хотите сохранить текущий workflow с патчами ядра, продолжайте использовать исходные патчи выше.