前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CVE-2022-25375 - RNDIS USB Gadget利用

CVE-2022-25375 - RNDIS USB Gadget利用

作者头像
Khan安全团队
发布2022-03-01 09:40:19
9700
发布2022-03-01 09:40:19
举报
文章被收录于专栏:Khan安全团队Khan安全团队

RNDIS-CO

概括

RNDIS USB Gadget 可被利用通过数据包过滤器更新机制转储内核内存空间的内容。

描述

RNDIS_MSG_SET usb 控制传输请求处理程序 - rndis_set_response 调用 gen_ndis_set_resp 传递缓冲区指针偏移量为 BufOffset + 8。 BufOffset 变量是从 RNDIS 消息中检索的,并且未验证是否尊重缓冲区边界。因此,通过操纵 rndis_set_msg_type 的四字节 InformationBufferOffset 成员,攻击者可以将实际缓冲区偏移多达 0xffffffff 字节。

rndis.c - rndis_msg_parser

代码语言:javascript
复制
	case RNDIS_MSG_QUERY:
		return rndis_query_response(params,
					(rndis_query_msg_type *)buf);

	case RNDIS_MSG_SET:
		return rndis_set_response(params, (rndis_set_msg_type *)buf);

rndis.c - rndis_set_response

代码语言:javascript
复制
 static int rndis_set_response(struct rndis_params *params,
			      rndis_set_msg_type *buf)
{
	u32 BufLength, BufOffset;
	rndis_set_cmplt_type *resp;
	rndis_resp_t *r;

	r = rndis_add_response(params, sizeof(rndis_set_cmplt_type));
	if (!r)
		return -ENOMEM;
	resp = (rndis_set_cmplt_type *)r->buf;

	BufLength = le32_to_cpu(buf->InformationBufferLength);
	BufOffset = le32_to_cpu(buf->InformationBufferOffset);

#ifdef	VERBOSE_DEBUG
	pr_debug("%s: Length: %d\n", __func__, BufLength);
	pr_debug("%s: Offset: %d\n", __func__, BufOffset);
	pr_debug("%s: InfoBuffer: ", __func__);

	for (i = 0; i < BufLength; i++) {
		pr_debug("%02x ", *(((u8 *) buf) + i + 8 + BufOffset));
	}

	pr_debug("\n");
#endif

	resp->MessageType = cpu_to_le32(RNDIS_MSG_SET_C);
	resp->MessageLength = cpu_to_le32(16);
	resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
	if (gen_ndis_set_resp(params, le32_to_cpu(buf->OID),
			((u8 *)buf) + 8 + BufOffset, BufLength, r))
		resp->Status = cpu_to_le32(RNDIS_STATUS_NOT_SUPPORTED);
	else
		resp->Status = cpu_to_le32(RNDIS_STATUS_SUCCESS);

	params->resp_avail(params->v);
	return 0;
}

接下来负责处理 RNDIS_OID_GEN_CURRENT_PACKET_FILTER OID 的代码将当前数据包过滤器设置为 buf 指针指向的值。应用偏移后,这允许人们在指定地址检索两个字节并将值存储在数据包过滤器中。

rndis.c - gen_ndis_set_resp

代码语言:javascript
复制
	switch (OID) {
	case RNDIS_OID_GEN_CURRENT_PACKET_FILTER:

		/* these NDIS_PACKET_TYPE_* bitflags are shared with
		 * cdc_filter; it's not RNDIS-specific
		 * NDIS_PACKET_TYPE_x == USB_CDC_PACKET_TYPE_x for x in:
		 *	PROMISCUOUS, DIRECTED,
		 *	MULTICAST, ALL_MULTICAST, BROADCAST
		 */
		*params->filter = (u16)get_unaligned_le32(buf);
		pr_debug("%s: RNDIS_OID_GEN_CURRENT_PACKET_FILTER %08x\n",
			__func__, *params->filter);

进一步的步骤是通过将 USB_CDC_SEND_ENCAPSULATED_COMMAND 与 RNDIS_MSG_QUERY 组合用于 RNDIS_OID_GEN_CURRENT_PACKET_FILTER OID 和 USB_CDC_GET_ENCAPSULATED_RESPONSE 控制传输请求来检索数据包过滤器值。

在 RNDIS 请求中使用递增的 InformationBufferOffset 重复设置/获取数据包过滤器允许一次提取多达 0xffffffff 字节的内核空间内存两个字节。对于大量数据,该过程相当缓慢,但仍然有效。

代码语言:javascript
复制
 $ sudo python3 rndisco.py -v 0x1b67 -p 0x400c -l 0x3fffc > /tmp/rpi_rndis.dmp
 strings /tmp/rpi_rndis.dmp -n8 | tail -n 6
 stp_proto_unregister
 <30>Jan 27 14:39:48 dhcpcd[486]: usb0: IAID be:53:70:24
 <30>Jan 27 14:39:46 dhcpcd[486]: usb0: IAID be:53:70:24
 <30>Jan 27 14:39:46 dhcpcd[486]: usb0: adding address fe80::6f70:c737:89e:697a
 <30>Jan 27 14:39:40 dhcpcd[486]: usb0: carrier lost
 <30>Jan 27 14:39:48 dhcpcd[486]: usb0: adding address fe80::6f70:c737:89e:697a

影响

暴露 USB RNDIS 小工具的 Linux 设备可能会被利用来提取敏感信息。

CVE

CVE-2022-25375

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • RNDIS-CO
    • 概括
      • 描述
        • 影响
          • CVE
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档