x86_64 サポート
KernelSU は x86_64 アーキテクチャを完全にサポートしています。ただし、upstream kernel の最近のセキュリティ変更により、最新の x86_64 カーネルへ KernelSU を統合するには、統一された syscall dispatcher を正しく動作させるための追加対応が必要です。
なぜ動かなくなったのですか?
新しいカーネルバージョンでは、syscall table を強化するための コミット が導入されました。この変更により、システムコール経路内の間接分岐が一連の直接条件分岐へ変換されました。
KernelSU の syscall_hook は、フックしたシステムコールを統一 dispatcher にルーティングするために syscall table のエントリ変更へ依存しています。新しい hardening はシステムコール経路を変更するため、カーネルはそれらの syscall table 変更を無視します。KernelSU がこの制限を正しく処理しないまま syscall table を hook しようとすると、呼び出しを正しくルーティングできず、kernel panic を防ぐために初期化を中断します。
どうすればよいですか?
x86_64 の syscall hook 問題には 2 つの公式サポートされた方法があります。
- カーネルのビルドオプション
KSU_X86_PATCH_SYSCALL_DISPATCHERを有効にする。 - 従来どおりカーネルソースパッチ方式を使う。
必要なのはどちらか一方だけです。両方を同時に適用しないでください。
方法 1: KSU_X86_PATCH_SYSCALL_DISPATCHER を有効にする
KernelSU 3.2.6 では、x86_64 向けの新しい公式メカニズムとして KSU_X86_PATCH_SYSCALL_DISPATCHER ビルドオプションが追加されました。
このオプションを有効にすると、KernelSU は hardened syscall dispatcher を実行時に動的パッチし、従来のカーネルソースパッチを要求せずに syscall hook を動作させます。KernelSU 3.2.6 以降でカーネルをビルドする場合は、この方法を推奨します。
方法 2: 従来のカーネルソースパッチを適用する
KSU_X86_PATCH_SYSCALL_DISPATCHER を有効にしたくない場合は、これまでのカーネルパッチ方式を継続して使えます。
これらの新しいカーネルで KernelSU を動作させるには、この syscall hardening を回避できるパッチを適用してください。
セキュリティ警告
この 2 つの方法のいずれかを使うことは、speculative execution 脆弱性への対策を意図的に回避または弱めることを意味します。
これにより、system call に対する間接分岐の攻撃面が再び開かれます。本番サーバーや、厳格な side-channel セキュリティが重要なシステムでは、これら 2 つの方法のいずれも使わないでください。 これらの方法は、特定のハードウェア脆弱性対策よりも KernelSU による root アクセスを優先するテスト環境向けです。
以下からカーネルバージョンに一致するパッチを選んで適用してください。これらのパッチは 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を有効にしてください。 - 現在のカーネルパッチ運用を維持したいなら、上記の従来のソースパッチを使い続けてください。