kaiyun官方注册
您所在的位置: 首页> 通信与网络> 业界动态> Linux TIPC模块任意代码执行漏洞

Linux TIPC模块任意代码执行漏洞

2021-11-08
来源:嘶吼专业版
关键词: 代码 漏洞

  SentinelLab研究人员发现Linux Kernel TIPC(Transparent Inter Process Communication,透明进程间通信)模块中的一个安全漏洞,攻击者利用该漏洞可以在本地或远程区块下在kernel内执行任意代码,并完全控制有漏洞的机器。

  Linux TIPC协议

  TIPC协议是允许集群中节点在存在大量节点容错的情况下进行通信的协议。该协议在Linux kernel模块中实现,并包含在大多数Linux发行版中。当用户加载时,TIPC可以用作socket并可以使用netlink在接口上进行配置。TIPC可以配置为在Ethernet或UDP协议之上运行。但是低权限的用户是无法创建Ethernet帧,因此使用UDP更容易实现本地漏洞利用。

  虽然TIPC是在这些协议之上运行的,但有独立的地址方案,节点可以选择自己的地址。TIPC协议以对用户透明的方式工作。所有的消息构造和分析都是在kernel中进行的。每个TIPC消息都有相同的通用header格式和消息特定的header。

  对该漏洞来说,通用header最重要的部分是Header Size和message size。TIPC消息header如下所示:

微信图片_20211108172109.jpg

  TIPC消息header

  这两个size大小是由tipc_msg_validate函数来进行验证的:

微信图片_20211108172112.jpg

  TIPC漏洞

  2020年9月引入了一个新的用户消息类型——MSG_CRYPTO,该消息类型允许节点发送加密的秘钥。该消息结构如下所示:

  struct tipc_aead_key {

  char alg_name[TIPC_AEAD_ALG_NAME];

  unsigned int keylen; /* in bytes */

  char key[];

  };

  其中 TIPC_AEAD_ALG_NAME是32位的宏。消息接收后,TIPC kernel模块需要复制该信息到该节点来存储:

  /* Allocate memory for the key */

  skey = kmalloc(size, GFP_ATOMIC);

  /* … */

  /* Copy key from msg data */

  skey->keylen = ntohl(*((__be32 *)(data + TIPC_AEAD_ALG_NAME)));

  memcpy(skey->alg_name, data, TIPC_AEAD_ALG_NAME);

  memcpy(skey->key, data + TIPC_AEAD_ALG_NAME + sizeof(__be32),

  skey->keylen);

  用来分配的size大小与message payload的size大小是相同的。密钥算法和密钥本身也都会被复制。

  从上面的代码可以看出,Header Size和message size大小都会与真实的包大小来对比验证有效性。如果这两个值都在真实包大小的范围内,MSG_CRYPTO 消息的keylen或密钥算法本身都不会再去检查message大小。也就是说,攻击者可以创建一个size大小比较小的包来分配堆内存,然后用keylen属性中的任意大小来在该位置的边界外进行写操作:

微信图片_20211108172116.jpg

  可以触发该漏洞的MSG_CRYPTO消息示例

微信图片_20211108172119.jpg

  漏洞利用

  该漏洞可以在本地或远程利用。由于对kernel堆中分配的对象的控制更多,因此本地利用更加容易一些。如下所示,攻击者可以创建一个20字节的包,并设置message size为10字节,并绕过检查:

  目前补丁也已经发布,完整技术细节参见:

https://www.sentinelone.com/labs/tipc-remote-linux-kernel-heap-overflow-allows-arbitrary-code-execution/




电子技术图片.png


本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306116;邮箱:aet@chinaaet.com。
Baidu
map