[하루한줄] CVE-2025-22457: Ivanti Connect Secure의 X-Forwarded-For Stack Buffer Overflow 취약점
URL
Target
- Ivanti Connect Secure <= 22.7R2.5
- Pulse Connect Secure (EOS) <= 9.1R18.9
- Ivanti Policy Secure <= 22.7R1.3
- ZTA Gateways <= 22.8R2
Explain
Ivanti Connect Secure는 기업 네트워크 경계에서 VPN 접속 및 보안 정책을 관리하는 SSL VPN 장비입니다. 이 장비에서 인증되지 않은 원격 공격자가 원격 코드 실행(RCE)을 할 수 있는 스택 기반 버퍼 오버플로우 취약점(CVE-2025-22457)이 발견되었습니다.
취약점은 web
서버 프로세스 내의 HTTP 요청 처리 로직, 특히 WebRequest::dispatchRequest
함수로 추정되는 부분에 존재합니다. [Source 37, 42] 이 로직은 사용자가 설정 가능한 CUSTOM_IP_FIELD
구성 값에 지정된 HTTP 헤더 (기본값: X-Forwarded-For
)를 처리합니다.
취약한 코드는 해당 헤더 값을 받아 strspn
함수를 사용하여 값 시작 부분에 숫자(0-9
)와 마침표(.
)로만 구성된 문자열의 길이(ipLen
)를 계산합니다. 그 후, alloca
함수를 사용하여 ipLen + 2
크기의 버퍼를 스택에 할당하고, strlcpy
함수를 사용하여 헤더 값의 일부(ipLen + 1
바이트)를 이 스택 버퍼로 복사합니다.
headerValue = httpHeader->Value;
ipLen = strspn(headerValue, "0123456789.");
v58 = alloca(ipLen + 2);
strlcpy(&v178, *(_DWORD *)&v176[4], ipLen + 1);
strlcpy(s, headerValue, ipLen + 1);
공격자는 X-Forwarded-For
헤더에 숫자와 마침표로만 구성된 매우 긴 값을 포함시켜 HTTP 요청을 전송할 수 있습니다. 이 경우 ipLen
값이 매우 커지게 되고, alloca
함수가 스택에 과도하게 큰 버퍼를 할당하려고 시도하거나 strlcpy
함수가 할당된 버퍼의 경계를 넘어 데이터를 복사하게 되어 스택 버퍼 오버플로우가 발생합니다. 이로 인해 web
프로세스가 비정상적으로 종료될 수 있습니다.
Ivanti는 처음에 이 취약점이 숫자와 마침표로만 오버플로우가 가능하여 실제 RCE나 DoS로 이어지기 어렵다고 판단했으나, 이후 “정교한 방법(sophisticated means)”을 통해 실제 RCE 공격에 악용되고 있다는 사실을 확인했습니다. Mandiant에 따르면 2025년 3월 중순부터 이 취약점이 실제 공격에 사용되어 백도어를 설치하는 데 이용되었습니다.
해당 취약점을 테스트하려면 취약한 버전을 대상으로 아래와 같이 긴 X-Forwarded-For
헤더를 포함한 요청을 보내면 됩니다.
curl -k https://<TARGET_IP>/ --header "X-Forwarded-For: 1111111111111111111111111111111111111111111111111111111111111111.1111..."
서버 측에서 web
프로세스 crash 로그가 발생하며, 패치된 시스템은 HTTP 400 응답을 반환합니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.