首页
社区
课程
招聘
[原创]SSD安全公告-Linux内核XFRM权限提升漏洞
发表于: 2017-12-11 16:55 2012

[原创]SSD安全公告-Linux内核XFRM权限提升漏洞

2017-12-11 16:55
2012

Full report: https://blogs.securiteam.com/index.php/archives/3563#more-3563

漏洞概要

以下安全公告描述了在Linux内核中发现的一个UAF漏洞,成功利用此漏洞的攻击者可以提升权限。漏洞存在于Netlink 套接字子系统 – XFRM.

Netlink用于在内核和用户空间进程之间传输信息。 它由用户空间进程的标准基于套接字的接口和内核模块的内部内核API组成。


漏洞提交者

一位独立的安全研究员Mohamed Ghannam向Beyond Security的SSD报告了该漏洞


厂商响应

该漏洞已在补丁1137b5e中被修复(“ipsec:修复中止xfrm策略转储崩溃”)

CVE: CVE-2017-16939


漏洞详细信息

非特权用户可以更改Netlink 套接字子系统 XFRM sk-> sk_rcvbuf的值(sk ==sock结构体对象)。


可以通过setsockopt(SO_RCVBUF)更改sk-> sk_rcvbuf的值为特定的范围。通过recvmsg/recv/read接收数据时,sk_rcvbuf表示接收缓冲区的大小。


sk_rcvbuf值是内核为skb(sk_buff结构体对象)分配的大小。


skb-> trusize是一个变量,它保持对已使用内存的追踪,为了避免内存浪费,方便管理,内核可以在运行时改变skb的大小。


例如,如果我们分配一个大的套接字缓冲区(skb),而我们只接收到1字节大小的数据包,内核将通过调用skb_set_owner_r来调整skb-> trusize的大小。


通过调用skb_set_owner_r修改sk-> sk_rmem_alloc(引用自原子变量sk-> sk_backlog.rmem_alloc)。



当创建XFRM netlink 套接字时,会调用xfrm_dump_policy函数,当我们关闭套接字时,xfrm_dump_policy_done会被调用。


当netlink_sock对象的cb_running值为true时调用xfrm_dump_policy_done。


xfrm_dump_policy_done会尝试清理由netlink_callback对象管理的xfrm walk条目。



当调用netlink_skb_set_owner_r(如skb_set_owner_r)时,它会更新sk_rmem_alloc。


netlink_dump():


在上面的代码中,我们可以看到当sk-> sk_rcvbuf小于sk_rmem_alloc(注意我们可以通过stockpot控制sk-> sk_rcvbuf)时,netlink_dump()验证失败。


当满足sk-> sk_rcvbuf小于sk_rmem_alloc时,会跳转到函数的结尾,然而cb_running的值还没有被更改为false,netlink_dump()函数就返回了。


此时nlk-> cb_running为true,因此会调用xfrm_dump_policy_done()。



nlk-> cb.done指向xfrm_dump_policy_done,值得注意的是这个函数处理一个双向链表,所以如果利用这个漏洞引用一个可控的缓冲区,我们就可以实现任意内存读写。



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//