当前位置: 首页 > 科技观察

CVE-2021-43267:LinuxTIPC模块任意代码执行漏洞

时间:2023-03-13 03:41:20 科技观察

SentinelLab研究人员在Linux内核TIPC(透明进程间通信)模块中发现了一个安全漏洞。在远程块下的内核中执行任意代码并完全控制易受攻击的机器。LinuxTIPC协议TIPC协议是允许集群中的节点在存在大量节点容错的情况下进行通信的协议。该协议在Linux内核模块中实现,并包含在大多数Linux发行版中。当用户加载时,TIPC可以作为套接字使用,并且可以使用netlink在接口上进行配置。TIPC可以配置为在以太网或UDP协议上运行。但低权限用户无法创建以太网帧,因此使用UDP更容易实现本地攻击。虽然TIPC在这些协议之上运行,但存在一个独立的寻址方案,节点可以在其中选择自己的地址。TIPC协议以对用户透明的方式工作。所有消息构造和分析都在内核中执行。每条TIPC消息都具有相同的通用报头格式和消息特定报头。对于此漏洞,通用标头中最重要的部分是标头大小和消息大小。TIPC消息头如下:TIPC消息头的两种大小通过tipc_msg_validate函数验证:TIPC漏洞2020年9月,引入了一种新的用户消息类型——MSG_CRYPTO,允许节点发送加密的Secretkey。消息结构如下:structtipc_aead_key{charalg_name[TIPC_AEAD_ALG_NAME];unsignedintkeylen;/*inbytes*/charkey[];};其中TIPC_AEAD_ALG_NAME是32位宏。TIPC内核模块收到消息后需要将信息复制到节点存储:/*Allocatememoryforthekey*/skey=kmalloc(size,GFP_ATOMIC);/*...*//*Copykeyfrommsgdata*/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);used分配的大小与消息有效负载的大小相同。密钥算法和密钥本身也被复制。从上面的代码可以看出,headersize和messagesize会和真实的packetsize进行比较来验证有效性。如果这两个值在真实数据包大小的范围内,则无论是MSG_CRYPTO消息的keylen还是密钥算法本身都不会检查消息大小。也就是说,攻击者可以创建一个大小相对较小的包来分配堆内存,然后使用keylen属性中的任意大小向location边界外写入:可以触发此漏洞的MSG_CRYPTO消息示例。可以在本地或远程利用漏洞。由于对内核堆中分配的对象有更多控制,本地开发更容易一些。如下所示,攻击者可以创建一个20字节的数据包,将消息大小设置为10字节,并绕过检查:补丁也已经发布,完整的技术细节可以在:https://www.sentinelone.com/labs/tipc-remote-linux-kernel-heap-overflow-allows-arbitrary-code-execution/本文翻译自:https://thehackernews.com/2021/11/critical-rce-vulnerability-reported-in.html若若转载请注明原文地址。