Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
rndis-co — CVE-2022-25375 - RNDIS USB Gadget 데모 익스플로잇 | Kitploit
도구/GitHubGitHub/szymonh/rndis-co
Memory ForensicsVulnerability AnalysisExploitationHardware SecurityBinary Exploitation
GitHubszymonh/rndis-co

rndis-co

CVE-2022-25375 - RNDIS USB Gadget 데모 익스플로잇

저장소 보기
824년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

RNDIS-CO

요약

RNDIS USB Gadget은 패킷 필터 업데이트 메커니즘을 통해 커널 메모리 공간의 내용을 덤프하는 데 악용될 수 있습니다.

설명

RNDIS_MSG_SET USB 제어 전송 요청 핸들러인 rndis_set_response는 gen_ndis_set_resp를 호출하면서 BufOffset + 8만큼 오프셋된 버퍼 포인터를 전달합니다. BufOffset 변수는 RNDIS 메시지에서 가져오며 버퍼 경계를 준수하는지 검증되지 않습니다. 결과적으로 rndis_set_msg_type의 4바이트 InformationBufferOffset 멤버를 조작하여 공격자는 실제 버퍼를 최대 0xffffffff 바이트만큼 오프셋할 수 있습니다.

rndis.c - rndis_msg_parser

root@kitploit:~
	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

root@kitploit:~
 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 포인터가 가리키는 값으로 설정합니다. 오프셋이 적용되면 이를 통해 지정된 주소에서 2바이트를 검색하여 패킷 필터에 저장할 수 있습니다.

rndis.c - gen_ndis_set_resp

root@kitploit:~
	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);

추가 단계는 RNDIS_OID_GEN_CURRENT_PACKET_FILTER OID에 대해 USB_CDC_SEND_ENCAPSULATED_COMMAND와 RNDIS_MSG_QUERY, 그리고 USB_CDC_GET_ENCAPSULATED_RESPONSE 제어 전송 요청을 조합하여 패킷 필터 값을 검색하는 것입니다.

RNDIS 요청에서 InformationBufferOffset을 증가시키며 패킷 필터 설정/가져오기를 반복하면 한 번에 2바이트씩 최대 0xffffffff 바이트의 커널 공간 메모리를 추출할 수 있습니다. 대량의 데이터의 경우 프로세스가 다소 느리지만 여전히 효과적입니다.

root@kitploit:~
 $ 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 gadget을 노출하는 Linux 장치는 중요한 정보를 추출하는 데 악용될 수 있습니다.

CVE

CVE-2022-25375

패치

  • usb: gadget: rndis: check size of RNDIS_MSG_SET command
  • ChangeLog-5.16.10
도구 다운로드