- DCCP协议是面向消息的传输层协议,可最小化数据包报头带来的开销和终端处理的工程量。该协议可建立、维护和拆卸不可靠连接的数据流以及对不可靠数据流进行拥塞控制。
- 该DCCP双重释放漏洞可允许本地低权限用户修改Linux内核内存,导致拒绝服务(系统崩溃),或者提升权限,获得系统的管理访问权限。
- 内核编译选项:CONFIG_IP_DCCP=y
- 在当前DCCP实现中,如果dccp_rcv_state_process中的dccp_v6_conn_request返回“成功” ,dccp_type 为DCCP_PKT_REQUEST的packet的skb会被__kfree_skb强制释放。但是,如果在socket上设置IPV6_RECVPKTINFO,则skb地址会被保存在ireq-> pktopts,然后dccp_v6_conn_request中会增加skb的引用计数,所以skb仍在使用中。然而,它仍然会在dccp_rcv_state_process中被释放。
- 具体过程
kfree(dccp_skb) //在与dccp_skb相同的位置分配的另一个对象: some_object = kmalloc() //第二次释放,实际释放的是some_object对象 kfree(dccp_skb) 此时some_object持有一个悬空指针,如此就构造出了一个UAF。攻击者可以控制对象,同时可以通过使用内核堆喷射技术写入任意数据到被覆盖对象。 如果被覆盖的对象有任何可触发的函数指针,攻击者可以在内核中执行任意代码。
- 目前通过poc无法重现该攻击,因为poc中的一些offset需要修改,但没有说具体应该如何修改,而且作者也提到了该poc不稳定,原话:
The exploit was tested on Ubuntu 16.04 with 4.4.0-62-generic kernel. It will most likely crash on anything else, unless you at least update the offsets. As I mentioned, the exploit is not very reliable, but I don't want to spend any more time on it. The kernel can crash due to a memory corruption if we fail to reallocate some objects in time or in the correct order.