在内核中创建一个指向我们自己的函数指针

Make a function pointer in the kernel pointing to our own

假设我在内核中创建了一个函数指针,指向用户 space 代码中我自己的函数。比方说在内核2.4.37的<mm/filemap.c>line 626上,由于writepage函数指针指向用户space中我自己设计的writepage,我可以现在获取 root shell 还是做任何坏事? 我现在已经验证内核中的writepage指向我自己设计的writepage,这里是我自己的writepage:

int evil_writepage(struct page *page)
{
    printf("You've done bad things!!\n");
    /* To do, can I get root shell in here? Or anything bad*/
    exit(1);
}

在内核漏洞利用中获取root权限的最直接、经典的方法是调用函数序列

commit_creds(prepare_kernel_cred(0));

在内核模式下获得代码执行后。为此,您需要查找 commit_credsprepare_kernel_cred 的地址。这样做超出了这个答案的范围,但通常可以通过解析 /proc/kallsyms(如果 运行ning 没有 kptr_restrict)或通过解析内核符号 table 来完成你被劫持的回调。

在 运行 执行此代码后,您的进程将拥有 root 权限,但您仍然需要 return 安全地进入用户空间(即在返回途中不会触发任何崩溃)。从 writepage,你可以从你被劫持的函数中 return 安全地返回,因为你没有破坏任何关键的内核结构。

回到用户模式后,您可以 运行 例如execve("/bin/sh", ["sh", NULL], [NULL]) 得到根 shell.