1. 개요

- 보안 기업 TeamT5, 중국 연계 해킹 조직이 Ivanti VPN 취약점을 악용해 한국 포함 12개국 이상의 기업을 겨냥했다고 발표 [1]

> SK텔레콤 해킹 사고와 Ivanti 취약점 공격 간 밀접한 관련성이 제기

2. 취약점

2.1 CVE-2025-0282

[사진 1] CVE-2025-0282 [2]

- Ivanti 제품군에서 발생하는 버퍼 오버플로우 취약점 (CVSS: 9.0)

> Ivanti Connect Secure가 TNC 메시지 전달에 사용되는 transport layer 프로토콜인 IF-T 패킷을 처리하는 과정에서 발생

 

- 취약점은 /home/bin/web에 존재 [3][4]

> [1] 먼저 요청에서 clientCapabilities의 값을 가져옴

> [2] strncpy()를 사용해 clientCapabilities 값을 dest에 복사

> 이때, 복사될 버퍼인 dest의 크기(256)가 아닌, clientCapabilitiesLength의 크기로 사용하여 clientCapabilities의 길이가 256보다 크다면 Stack Buffer Overflow가 발생

int __cdecl ift_handle_1(int a1, IftTlsHeader *a2, char *a3)
{

    int v18;
    int v19;
    char dest[256]; // [esp+120h] [ebp-8ECh] BYREF
    char object_to_be_freed[4]; // [esp+220h] [ebp-7ECh] BYREF
    void *ptr; // [esp+224h] [ebp-7E8h]
    int v20; // [esp+228h] [ebp-7E4h]
    int v21; // [esp+22Ch] [ebp-7E0h]
    int v22; // [esp+230h] [ebp-7DCh]
    char v23; // [esp+234h] [ebp-7D8h]
    char v24; // [esp+235h] [ebp-7D7h]
    void *v25; // [esp+23Ch] [ebp-7D0h]
    _DWORD v26[499]; // [esp+240h] [ebp-7CCh] BYREF


    [..SNIP..]


    clientCapabilities = getKey(req, "clientCapabilities");// -------------------- [1]
    if ( clientCapabilities != NULL )
    {
      clientCapabilitiesLength = strlen(clientCapabilities);
      if ( clientCapabilitiesLength != 0 )
	      connInfo->clientCapabilities = clientCapabilities;
      }
    }
    memset(dest, 0, sizeof(dest));
    strncpy(dest, connInfo->clientCapabilities, clientCapabilitiesLength);// ----- [2]

    v24 = 46;
    v25 = &v57;
    if ( ((unsigned __int8)&v57 & 2) != 0 )
    {
      LOBYTE(v24) = 44;
      v57 = 0;
      v25 = (__int16 *)&v58;
    }
    memset(v25, 0, 4 * (v24 >> 2));
    v26 = &v25[2 * (v24 >> 2)];
    if ( (v24 & 2) != 0 )
      *v26 = 0;
    na = 46;


    (*(void (__cdecl **)(int, __int16 *))(*(_DWORD *)a1 + 0x48))(a1, &v22);// ---- [3]  


    isValid = 1;
    EPMessage::~EPMessage((EPMessage *)v18);
    DSUtilMemPool::~DSUtilMemPool((DSUtilMemPool *)object_to_be_freed);// -------- [4]
    return isValid;


}

 

- 이때의 스택 구조는 아래와 같음

> [4]에서 dest 바로 이후에 위치한 object_to_be_freed가 위 함수의 에필로그 직전에 메모리에서 해제됨(free)

> 해당 부분을 유효한 값으로 전달하지 못하면 변조된 return address로 ret 하기 전에 크래시가 발생

> 따라서 스택에 존재하는 a1을 덮어쓰고 [3]에서 변조된 a1의 vftable을 통해 발생하는 간접호출을 이용

+---------------------+
| v18 (int)           |
+---------------------+
| v19 (int)           |
+---------------------+
| dest[256]           | <- 256 bytes
+---------------------+
| object_to_be_freed  | <- 4 bytes
+---------------------+
| ptr (void *)        |
+---------------------+
| v20 (int)           |
+---------------------+
| v21 (int)           |
+---------------------+
| v22 (int)           |
+---------------------+
| v23 (char)          |
+---------------------+
| v24 (char)          |
+---------------------+
| v25 (void *)        |
+---------------------+
| v26[499]            | <- 499 DWORDs (4 bytes each)
+---------------------+
| Return Address      |
+---------------------+
| int a1              |
+---------------------+
| IftTlsHeader *a2    |
+---------------------+

 

2.2 CVE-2025-22457

[사진 2] CVE-2025-22457 [5]

- Ivanti 제품군에서 발생하는 버퍼 오버플로우 취약점 (CVSS: 9.8)

> web 서버 프로세스 내의 HTTP 요청 처리 로직, 특히 WebRequest::dispatchRequest 함수로 추정되는 부분에 존재

 

- 해당 로직은 사용자가 설정 가능한 CUSTOM_IP_FIELD 구성 값에 지정된 HTTP 헤더(기본값: X-Forwarded-For)를 처리 [6][7]

> X-Forwarded-For 헤더 값을 strspn()로 값 시작 부분에 숫자(0-9)와 마침표(.)로만 구성된 문자열의 길이(ipLen)를 계산

> 그 후, alloca()를 사용하여 ipLen + 2 크기의 버퍼를 스택에 할당

> strlcpy()를 사용하여 헤더 값의 일부(ipLen + 1 바이트)를 이 스택 버퍼로 복사

headerValue = httpHeader->Value;
ipLen = strspn(headerValue, "01234567890.");
v58 = alloca(ipLen + 2);
*(_DWORD *)&v176[4] = headerValue;
strlcpy(&v178, *(_DWORD *)&v176[4], ipLen + 1);
strlcpy(s, headerValue, ipLen + 1);

 

- 공격자는 X-Forwarded-For 헤더숫자와 마침표로만 구성매우 긴 값을 포함시켜 HTTP 요청을 전송

> 이 경우 ipLen 값이 매우 커지게 되고, alloca 함수가 스택에 과도하게 큰 버퍼를 할당하려고 시도하거나

> strlcpy 함수가 할당된 버퍼의 경계를 넘어 데이터를 복사하게 되어 StackBuffer Overflow가 발생

curl -k https://<TARGET_IP>/ --header "X-Forwarded-For: 1111111111111111111111111111111111111111111111111111111111111111.1111..."

3. 대응방안

- 벤더사 제공 업데이트 적용 [8][9][10][11]

취약점 제품명 영향받는 버전 해결 버전
CVE-2025-0282 Ivanti Connect Secure 22.7R2 이상 ~ 22.7R2.4 이하 22.7R2.5
Ivanti Policy Secure 22.7R1 이상 ~ 22.7R1.2 이하 22.7R1.3
Ivanti Neurons
(ZTA 게이트웨이)
22.7R2 이상 ~ 22.7R2.3 이하 22.8R2
CVE-2025-22457 Ivanti Connect Secure 22.7R2.5 이하 22.7R2.6
Pulse Connect Secure(EoS) 9.1R18.9 이하 고정 릴리스로 마이그레이션
(22.7R2.6)
Ivanti Policy Secure 22.7R1.3 이하 22.7R1.4
Ivanti ZTA Gateways 22.8R2 이하 22.8R2.2

4. 참고

[1] https://teamt5.org/tw/posts/china-nexus-apt-exploits-ivanti-connect-secure-vpn-vulnerability-to-infiltrate-multiple-entities
[2] https://nvd.nist.gov/vuln/detail/CVE-2025-0282
[3] https://labs.watchtowr.com/exploitation-walkthrough-and-techniques-ivanti-connect-secure-rce-cve-2025-0282
[4] https://hackyboiz.github.io/2025/01/25/pwndorei/2025-01-25
[5] https://nvd.nist.gov/vuln/detail/CVE-2025-22457
[6] https://labs.watchtowr.com/is-the-sofistication-in-the-room-with-us-x-forwarded-for-and-ivanti-connect-secure-cve-2025-22457
[7] https://hackyboiz.github.io/2025/04/10/j0ker/2025-04-10
[8] https://forums.ivanti.com/s/article/Security-Advisory-Ivanti-Connect-Secure-Policy-Secure-ZTA-Gateways-CVE-2025-0282-CVE-2025-0283?language=en_US
[9] https://www.boho.or.kr/kr/bbs/view.do?searchCnd=&bbsId=B0000133&searchWrd=&menuNo=205020&pageIndex=1&categoryCode=&nttId=71623
[10] https://forums.ivanti.com/s/article/April-Security-Advisory-Ivanti-Connect-Secure-Policy-Secure-ZTA-Gateways-CVE-2025-22457
[11] https://www.boho.or.kr/kr/bbs/view.do?searchCnd=4&bbsId=B0000133&searchWrd=CVE-2025-22457&menuNo=205020&pageIndex=1&categoryCode=&nttId=71708

[12] https://www.dailysecu.com/news/articleView.html?idxno=166079

+ Recent posts