Linuxカーネルにはバージョン5.0以降のCR0保護機能はありますか?

Linuxカーネルにはバージョン5.0以降のCR0保護機能はありますか?

カーネルバージョン2.Xから4.Xまでは、16番目のバージョンを簡単に無視できます。CR0カーネルモジュールのビット:

write_cr0(read_cr0() & (~ 0x10000));

これにより、システムコールテーブルへの書き込み禁止を削除できます。しかし、今バージョン5.Xでは、これはCR0ビットをオーバーライドしないようです。上記のトリックを使用してシステムコールテーブルをハイジャックしようとすると、

sys_call_table = (void *)kallsyms_lookup_name("sys_call_table");
write_cr0(read_cr0() & (~0x10000));
iamhere("Saving the old call..");
old_open = sys_call_table[__NR_open];
iamhere("Setting the new one..");
sys_call_table[__NR_open] = hijacked_open;
write_cr0(read_cr0() | 0x10000);

0x0003 権限違反エラーが発生します。
間違い

だから私の質問は:新しいカーネルモード保護機能が適用されていますか?それでは、ルートキットの場合、これをバイパスする方法はありますか?

答え1

はい、バージョン5.3以降、CR0とCR4の機密ビットが修正されました。、少なくとも渡す write_cr0そしてwrite_cr4write_cr0呼び出しがWPビットをクリアしないため、コードは失敗します。

管理モードの場合は、常にCR0に直接書き込むことができます。これは固定を防ぎますが、固定ビットは次の呼び出しwrite_cr?で復元されます。 (固定の目的は、これらの関数呼び出しに関連する攻撃を防ぐことです。)

関連情報