访问套接字缓冲区结构时内核崩溃

时间:2015-12-06 09:55:33

标签: linux-kernel kernel-module

我一直试图拦截连接系统调用,试图重写tcp请求的目标IP地址。我想我已成功从符号表中检索了连接系统调用的地址并拦截它。我的结论是基于我的函数被内核调用的事实。但是,我不确定我的代码是否实际上拦截了连接系统调用。为了验证我是否尝试打印出源或目标的IP地址。但每当我尝试访问套接字缓冲区结构时,内核崩溃。您可以在hijackConnect函数中看到该部分代码并将其注释掉。我想知道我做错了什么,我怎样才能确保我真的拦截了tcp请求。如果可能的话,我想知道如何重写目标IP地址,以便我可以将http请求重定向到特定的网站。即使你不知道如何去做,我仍然很欣赏良好的指针和学习资源。

免责声明:我不想做任何险恶的事情。这是针对内核黑客学校项目的,它必须在内核空间中完成。我的内核是版本3.16,以下代码是根据我自己的需要调整在线教程。

hapus.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        String text = output.getText();
        output.setText(text.substring(0,text.length()-1));
    }
});

2 个答案:

答案 0 :(得分:1)

代码显然是错误的,方法也是如此。 这里的真正目标是什么?

你有:

asmlinkage int hijackConnect(struct sock *sk, struct sockaddr *uaddr,int     addr_len)

并使用它来替换connect()的syscall条目。显然这可能是不正确的 - 用户空间应该如何将指针传递给套接字?更不用说连接系统调用接受不同的参数:

SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
                int, addrlen)

第一个参数是文件描述符,而不是指向套接字的指针,因此不出所料导致崩溃。

然而,这种方法本身存在根本缺陷。由于您稍后尝试调用实际的connect(),内核会从用户空间重新获取数据,攻击者可以简单地修改它以修复您的代码所做的任何操作。有关详细信息,请参阅http://www.watson.org/~robert/2007woot/

答案 1 :(得分:0)

  

如果可能的话,我想知道如何重写目标IP地址,以便我可以将http请求重定向到特定的网站。

这是一个最适合Linux netfilter( ie, iptables)数据包过滤框架的任务。

劫持系统调用不是受支持的技术,会导致系统不稳定。在这种特定情况下,它将在32位x86内核上严重失败,因为connect()没有自己的系统调用号;相反,socketcall()系统调用与SYS_CONNECT一起用作第一个参数。您在系统调用表中覆盖的条目完全不相关。 (我相信它实际上是exit()的条目!)