1. 개요
- 보안 기업 TeamT5, 중국 연계 해킹 조직이 Ivanti VPN 취약점을 악용해 한국 포함 12개국 이상의 기업을 겨냥했다고 발표 [1]
> SK텔레콤 해킹 사고와 Ivanti 취약점 공격 간 밀접한 관련성이 제기
2. 취약점
2.1 CVE-2025-0282
- 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
- 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
'취약점 > BoF' 카테고리의 다른 글
Redis 스택 버퍼 오버플로우 취약점 (CVE-2024-31449) (1) | 2024.11.23 |
---|---|
DrayTek BoF 취약점 (CVE-2024-41592, CVE-2024-41585) (0) | 2024.11.11 |
Citrix Bleed (CVE-2023-4966) (1) | 2023.11.28 |
GNU C 라이브러리 Dynamic Loader BoF_Looney Tunables (CVE-2023-4911) (1) | 2023.10.10 |
드림시큐리티 MagicLine4NX BoF 취약점 (0) | 2023.03.31 |