CVE-2019-11815:Linux kernel漏洞

ang010ela 漏洞 2019年5月27日发布
Favorite收藏

导语:研究人员发现Linux kernel漏洞——CVE-2019-11815。

Linux kernel中存在漏洞是非常常见的,因为有Linux kernel有大约2600万行代码,单2018年就新添加了338万行,删除了251万行代码。代码的量和复杂性说明了其中必然存在漏洞。

2019年5月8日,漏洞数据库NVD(National Vulnerability Database)发布了CVE-2019-11815——Linux kernel漏洞的详情,其CVSS 3.0评分为8.1。漏洞的详情包含网络攻击向量,不需要权限和管理级的代码执行,CIA影响的评分都是high。除了攻击向量、所需权限外,CIA等都影响着CVSS的评分。

CVSS 3基准评分的一个部分就是攻击复杂性,CVE-2019-11815漏洞的攻击复杂性也是high。也就是说成功攻击需要特定的场景,而这种场景往往很难得到。根据CVSS 3.0标准,评级意味着成功的攻击需要依靠攻击者的控制以外的条件,而且成功的攻击需要投入大量精力和准备过程以达到攻击所需的条件。

下面分析该漏洞以解释为什么该评分标准从技术上是准确的,尤其是将攻击复杂度评级纳入考虑以后,并不能真正代表对企业和用户的风险。

漏洞分析

NVD对该漏洞的描述为Linux kernel 5.0.8之前版本的net/rds/tcp.c中的rds_tcp_kill_sock存在的问题,其中存在竞争条件导致的与net namespace cleanup相关的UAF。这是从代码角度对该漏洞进行的准确描述,但是缺乏一些关键信息可能会导致我们对TCP产生警示。

该漏洞的第一个主要组件是Reliable Datagram Sockets (RDS,可靠数据报套接字)这是一个Oracle开发的socket接口和协议,允许单个传输socket向不同终端发送和接收大量数据。该漏洞其实是TCP被用作底层传输协议时RDS的漏洞:RDS头部的应用数据会通过TCP封装和发送,端口是16385,然后解封装并传递给RDS socket。除了Oracle的文档和维基百科的介绍,没有关于RDS的更多信息。协议的模糊性加上原有的本地权限提升漏洞,导致许多Linux发布版都将与RDS相关的kernel模块加入了黑名单。这就减少了该漏洞带来的潜在危害。

如果rds和rds_tcp kernel模块启用?

如果rds和rds_tcp kernel模块启用会怎么样呢?在TCP上使用RDS时,底层的TCP传输完全是由kernel来管理的。也就是说,当客户端建立了新的RDS socket时,kernel会在tcp_connect.c的中打开TCP socket,rds_tcp_conn_path_connect()是由threads.c中的worker线程函数 rds_connect_worker()调用的。

Figure. 1

图1. threads.c中的rds_connect_worker()调用rds_tcp_conn_path_connect()

当TCP客户端socket持续连接失败该漏洞的RDS部分就会出现。如果TCP connect()连接失败,就会调用函数rds_tcp_restore_callbacks(),并设置rds_tcp_connection 结构中的t_sock 指针为NULL,这是一个完全合理的行为。

Figure. 2

图2. rds_tcp_conn_path_connect()调用rds_tcp_restore_callbacks()

 Figure. 3

图3. t_sock设置rds_tcp_restore_callbacks()为NULL

该漏洞的第二个主要组件是网络命名空间(network namespaces)。Network namespaces考虑为给定的命名空间使用单独的接口和路由表,一般来说整个操作系统都回共享相同的接口和路由表。Docker这样的平台也使用这个命名空间功能来为容器提供网络隔离。

RDS-TCP socket在 rds_tcp_init()中初始化后,就会调用network namespaces 函数register_pernet_device() ,传递一个指针给pernet_operations结构rds_tcp_net_ops,其中含有初始化后和退出函数在网络命名空间初始化、移除或socket活动时执行。

Figure. 4

图4. 调用register_pernet_device()来注册网络命名空间设备

Figure. 5

图5. rds_tcp_exit_net()作为网络命名空间设备的退出函数

退出函数 rds_tcp_exit_net()会调用rds_tcp_kill_sock(),用来执行RDS-TCP socket不同部分的清除。该过程的一部分就是清除连接列表的创建tmp_list。

每次连接都会做的其中一个检查是查看TCP socket使用的t_sock指针是否为null,如果为空,t_tcp_node就不会加入到cleanup list中。因此,对这些节点也不会调用rds_conn_destroy() ,其中一些cleanup也不执行。

Figure.6

图6. 如果t_sock为NULL就跳过rds_tcp_kill_sock()

更重要的是rds_connect_worker()线程并不是停止,会继续尝试重新连接。最后,底层的网络结构会就释放,这也是命名空间清理的一部分,也可能会继续被运行的rds_connect_worker()使用,触发UAF漏洞。从技术上来讲,该漏洞可以描述为不需要特权,如果成功利用可能导致管理级代码执行。

修复方法也很简单:系统管理员只需要确保有漏洞的模块禁用就可以了,或安装更新的kernel。

CVE-2019-11815的真正风险

CVE-2019-11815怎么样才能被攻击者利用呢?潜在的受害者首先要加载拉黑的rds和rds_tcp模块,如果不加载,那么之后的步骤也就不可能了。因为TCP connect()只有RDS-TCP客户端执行而不是服务器,因此如果攻击者发现了目标,就会使目标连接攻击者控制的同一网络命名空间中的RDS-TCP socket。

攻击者的下一个工作就是使用底层的TCP连接产生失败,同时清理目标用户的网络命名空间,这是一个远程攻击者没有机会执行的任务。因为竞争条件是很难利用的,并且需要大量的尝试。

将这些条件都考虑进去的话,该漏洞在不经过认证被远程利用的可能性几乎为0。当然也有非常小的机会可能被用作本地权限提升,但这要求拉黑的rds和rds_tcp模块是加载的。

虽然该漏洞的CVSS评分从技术上将是准确的,但是用户仍然需要意识到攻击发生的可能性是根据根据的复杂性和攻击所需的条件确定的。大多数Linux服务器在远程环境下是不受该漏洞影响的。

本文翻译自:https://blog.trendmicro.com/trendlabs-security-intelligence/cve-2019-11815-a-cautionary-tale-about-cvss-scores/如若转载,请注明原文地址: https://www.4hou.com/vulnerable/18224.html
点赞 2
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论