[하루한줄] CVE-2025-40596 : (Pre-auth) SonicWall SMA100의 스택 버퍼 오버플로우로 인한 DoS
URL
Target
- SonicWall SMA100 펌웨어 버전 10.2.1.15
Explain
Background
WatchTowr Labs가 SonicWall SMA100 시리즈에서 발견한 세 가지 취약점 중 하나인 CVE-2025-40596은 사전 인증(pre-auth) 상태에서 발생하는 스택 기반 버퍼 오버플로우 취약점입니다.
httpd
바이너리에는 들어오는 요청을 특정 기능에 연결하기 위한 일련의 조건부 검사가 포함되어 있습니다. 만약 요청 URI가 /__api__/
로 시작하면, 다음 로직이 트리거됩니다.
먼저, 바이너리는 들어오는 URI와 /__api__/
문자열 간에 strncasecmp
비교를 수행합니다.
요청된 URI의 첫 9바이트가 /__api__/
로 시작하면, 실행은 loc_444F0
블록으로 이동합니다.
root cause
loc_444F0
블록 내부에서는 사용자 입력을 파싱하기 위해 sscanf 함수가 사용됩니다.
int sscanf(const char *str, const char *format, ...);
이 함수는 str로부터 데이터를 format에 따라 읽어와 지정된 변수에 저장하는 역할을 합니다.
문제는 sscanf
함수가 사용자 제공 URI, https://x.x.x.x/__api__/v1/login
과 같은 형식에서 마지막 슬래시(/
) 뒤의 모든 문자를 0x800 바이트 크기의 스택 버퍼로 복사할 때 입력 길이 제한에 대한 경계 검사 없이 복사가 이루어진다는 것입니다. 구체적으로, URI의 마지막 슬래시 뒤의 문자들이 rcx
레지스터에 저장된 메모리 주소(이는 [rsp+898h+var_878]
에 위치한 스택 변수에서 파생됨)로 복사되는데, 이때 입력 길이 제한이 없어 스택 버퍼 오버플로우가 발생합니다.
PoC 설명
이 취약점을 재현하는 것은 매우 간단합니다. 긴 URI 문자열을 포함하는 HTTP GET 요청을 전송하여 트리거할 수 있습니다. 예를 들어, 다음 파이썬 코드를 사용하면 취약한 서버에서 연결이 끊기는 것을 확인할 수 있습니다:
import requests; requests.get("https://x.x.x.x/__api__/v1/"+'A'*3000,verify=False)
이 코드는 /__api__/v1/
뒤에 ‘A’ 문자 3000개를 추가하여 전송하며, 이는 0x800 바이트 스택 버퍼를 오버플로우시켜 서비스 거부(DoS)를 유발합니다. 더 짧은 페이로드(e.g., 2000바이트)를 전송하면 서버가 ‘400 Bad Request’로 응답하는 것을 볼 수 있습니다.
gdb 환경에서 이를 관찰하면 스택 카나리와 반환 주소가 오버플로우로 인해 덮어쓰여지는 것을 확인할 수 있습니다.
/usr/src/EasyAccess/bin/httpd
바이너리에 스택 보호가 활성화되어 있어 직접적인 원격 코드 실행은 다소 어렵지만, 사전 인증 경로에서 스택 기반 버퍼 오버플로우가 발생한다는 사실 자체가 문제입니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.