[하루한줄] 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 응답을 반환합니다.