Linux 内核从 5.0 版本开始有 CR0 保护吗?

Vil*_*ika 3 kernel-modules linux-kernel

在内核版本 2.X 到 4.X 中,您可以使用以下命令轻松覆盖内核模块中的第 16 个CR0位:

write_cr0(read_cr0() & (~ 0x10000));
Run Code Online (Sandbox Code Playgroud)

这样它就可以删除系统调用表上的写保护。然而现在,在 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);
Run Code Online (Sandbox Code Playgroud)

您会收到 0x0003 权限违规错误。
错误

所以,我的问题是:新的内核模式保护措施是否已到位?如果是这样,对于 rootkit 的情况,是否还有任何可能的方法可以绕过它?

Ste*_*itt 5

是的,自版本 5.3 起,CR0 和 CR4 中的敏感位被固定,至少通过 write_cr0write_cr4。您的代码失败,因为write_cr0调用没有\xe2\x80\x99t 清除 WP 位。

\n\n

如果你\xe2\x80\x99处于管理模式,你总是可以直接写入CR0,这应该避免固定;但固定位将在下次write_cr?调用时恢复。(固定的目的是防止涉及调用这些函数的攻击。)

\n