1. 개요
- Ivanti Connect Secure, Policy Secure에서 새로운 제로데이 취약점 발견
> 권한 상승 취약점 (CVE-2024-21888) 및 SSRF 취약점(CVE-2024-21893)
> 해당 취약점을 악용해 다수의 국내 기업들 포함 전세계 650여개 이상 기업 공격 시도
> 원격 명령 실행을 위해 백도어 DSLog를 설치하기 위해 CVE-2024-21893 악용
2. 취약점
2.1 CVE-2024-21888
- 취약한 버전의 Ivanti Connect Secure, Ivanti Policy Secure에서 발생하는 권한 상승 취약점
> 웹 구성요소 권한 상승 취약점으로 인해 관리자 권한으로 권한 상승 가능 [2]
> 악용에 성공한 공격자는 SAML 구성 요소에 있는 SSRF 취약점으로 인해 공격자가 인증 없이 제한된 특정 리소스에 접근 가능 (CVE-2024-21893) [2]
영향받는 버전: Ivanti Connect Secure 및 Ivanti Policy Secure 9.x, 22.x
- 서버에 요청이 전달되기 전 URI를 테스트하여 인증 필요 여부를 확인하는 doAuthCheck() 존재
> 해당 함수에서 /dana-ws/saml20.ws 등 특정 경로의 경우 인증이 강제되지 않음
※ CVE-2023-46805: doAuthCheck()에서 /api/v1/totp/user-backup-code 경로의 경우 인증이 강제되지 않음
if ( !memcmp(uri_path_1, "/dana-na/", 9u)
|| !memcmp(a1->uri_path, "/dana-cached/setup/", 0x13u)
|| !memcmp(a1->uri_path, "/dana-cached/sc/", 0x10u)
|| !strncmp(uri_path1, "/dana-cached/hc/", 0x10u)
|| !strncmp(uri_path1, "/dana-cached/cc/", 0x10u)
|| !strncmp(uri_path1, "/dana-cached/ep/", 0x10u)
|| !strncmp(uri_path1, "/dana-cached/psal/", 0x12u)
|| !strncmp(uri_path1, "/dana-cached/remediation/", 0x19u)
|| !strncmp(uri_path1, "/dana-ws/saml20.ws", 0x12u) // <--- No auth for this SAML endpoint, CVE-2024-21888
|| !strncmp(uri_path1, "/dana-ws/samlecp.ws", 0x13u)
|| !strncmp(uri_path1, "/adfs/ls", 8u)
|| !strncmp(uri_path1, "/api/v1/profiler/", 0x11u)
|| !strncmp(uri_path1, "/api/v1/cav/client/", 0x13u) && strncmp(uri_path1, "/api/v1/cav/client/auth_token", 0x1Du) )
{
return 1;
}
v18 = (const void *)getDevice(a1->dwordC);
if ( (unsigned __int8)sub_873D0(a1->uri_path, v18) )
return 1;
uri_path = a1->uri_path;
if ( !strncmp((const char *)uri_path, "/api/v1/ueba/", 0xDu)
|| !strncmp((const char *)uri_path, "/api/v1/integration/", 0x14u)
|| !strncmp((const char *)uri_path, "/api/v1/dsintegration", 0x15u)
|| !strncmp((const char *)uri_path, "/api/v1/pps/action/", 0x13u)
|| !strncmp((const char *)uri_path, "/api/my-session", 0xFu)
|| !strncmp((const char *)uri_path, "/api/v1/totp/user-backup-code", 0x1Du) // CVE-2023-46805
|| !strncmp((const char *)uri_path, "/api/v1/esapdata", 0x10u)
|| !strncmp((const char *)uri_path, "/api/v1/sessions", 0x10u)
|| !strncmp((const char *)uri_path, "/api/v1/tasks", 0xDu)
|| !strncmp((const char *)uri_path, "/api/v1/gateways", 0x10u)
|| !strncmp((const char *)uri_path, "/_/api/aaa", 0xAu)
|| !strncmp((const char *)uri_path, "/api/v1/oidc", 0xCu) )
{
return 1;
}
- 웹 서버의 함수 doDispatchRequest()는 특정 URL에 대해 인증되지 않은 POST 요청을 백엔드 서비스 saml-server로 전달
> /dana-ws/saml.ws, /dana-ws/saml20.ws, /dana-ws/samlcp.ws 경로의 경우 인증이 수행되지 않음
> 인증되지 않은 POST 요청을 웹 서버의 DSWSMLHandler 클래스를 통해 saml-server로 디스패치
※ saml-server: /home/bin/saml-server
if ( !strncmp(v33, "/dana-ws/saml.ws", 0x10u)
|| !strncmp(v33, "/dana-ws/saml20.ws", 0x12u) // <--- our unauthenticated path
|| !strncmp(v33, "/dana-ws/samlecp.ws", 0x13u) )
{
if ( !byte_13EBE0 && __cxa_guard_acquire((__guard *)&byte_13EBE0) )
{
v37 = "Watchdog";
if ( !*((_BYTE *)a1 + 240) )
v37 = "WebRequest";
dword_13EC54 = DSGetStatementCounter("request.cc", 5283, "doDispatchRequest", v37, 10, "Dispatching to SAML");
__cxa_guard_release((__guard *)&byte_13EBE0);
}
++*(_QWORD *)dword_13EC54;
if ( DSLog::Debug::isOn(v76) )
{
v34 = "Watchdog";
if ( !*((_BYTE *)a1 + 240) )
v34 = "WebRequest";
DSLog::Debug::Write(
(DSLog::Debug *)v34,
&byte_9[1],
(int)"request.cc",
(const char *)&elf_gnu_hash_chain[440] + 3,
(int)"Dispatching to SAML",
v92);
}
DSCockpitCounter::updateCounter(0, 1);
if ( !byte_13EBE8 && __cxa_guard_acquire((__guard *)&byte_13EBE8) )
{
dword_13EC50 = DSGetStatementCounter(
"request.cc",
5285,
"doDispatchRequest",
"WebRequest",
60,
"DSCockpitCounter Webhits Incremented");
__cxa_guard_release((__guard *)&byte_13EBE8);
}
++*(_QWORD *)dword_13EC50;
if ( DSLog::Debug::isOn(v77) )
DSLog::Debug::Write(
(DSLog::Debug *)"WebRequest",
off_3C,
(int)"request.cc",
(const char *)&elf_gnu_hash_chain[441] + 1,
(int)"DSCockpitCounter Webhits Incremented",
v92);
DSCockpitCounter::updateCounter(4, 1);
return sub_86980((int)a1) != 0; // <--- dispatch to saml-server via DSWSSAMLHandler
}
2.2 CVE-2024-21893
- SAML 구성 요소에 있는 SSRF 취약점으로 인해 공격자가 제한된 특정 리소스에 인증 없이 엑세스할 수 있는 취약점
> 영향받는 버전은 CVE-2024-21888과 동일
- saml-server는 SOAP 요청을 포함한 모든 SAML 작업을 담당
> SoapHandler()는 모든 XML 처리를 위해 xmltooling 라이브러리를 호출
※ SoapHandler()는 createXMLObjectFromSoapMessage()를 통해 들어오는 POST 요청의 콘텐츠 데이터를 XML 개체로 변환하는 함수
- XML 처리에 사용되는 xmltooling 라이브러리의 버전은 3.0.2
> 해당 xmltooling의 경우 최신 버전이 아니며, SSRF 취약점인 CVE-2023-36661에 영향을 받는 버전 [4][5]
> SSRF 취약점 트리거를 위해 KeyInfo의 RetrievalMethod 속성을 이용
> 해당 속성 사용시 XMLToolingFIPS.XMLObject.Signature()가 GET 요청을 통해 원격 리소스를 요청하는데 사용할 URI 지정 가능
> PoC [6]
※ CVE-2023-36661: xmltooling 3.2.4 이전 버전에서 조작된 KeyInfo 요소로 인해 발생하는 SSRF 취약점
3. 대응방안
- 벤더사 제공 최신 업데이트 적용 [8][9]
제품명 | 영향받는 버전 | 해결버전 |
Ivanti Connect Secure | 9.x 22.x |
9.1R14.4 9.1R17.2 9.1R18.3 22.4R2.2 22.5R1.1 22.5R2.2 22.6R1.3 |
Ivanti Policy Secure | 22.5R1.1 22.6R1.3(ZTA version) |
- "/dana-ws/saml20.ws" 탐지룰 적용
4. 참고
[1] https://nvd.nist.gov/vuln/detail/CVE-2024-21888
[2] https://attackerkb.com/topics/FGlK1TVnB2/cve-2024-21893/rapid7-analysis?referrer=notificationEmail
[3] https://nvd.nist.gov/vuln/detail/CVE-2024-21893
[4] https://nvd.nist.gov/vuln/detail/CVE-2023-36661
[5] https://shibboleth.net/community/advisories/secadv_20230612.txt
[6] https://github.com/h4x0r-dz/CVE-2024-21893.py
[7] https://blog.sonicwall.com/en-us/2024/02/ivanti-server-side-request-forgery-to-auth-bypass/
[8] https://forums.ivanti.com/s/article/CVE-2024-21888-Privilege-Escalation-for-Ivanti-Connect-Secure-and-Ivanti-Policy-Secure?language=en_US
[9] https://www.boho.or.kr/kr/bbs/view.do?searchCnd=&bbsId=B0000133&searchWrd=&menuNo=205020&pageIndex=1&categoryCode=&nttId=71320
[10] https://www.assetnote.io/resources/research/ivantis-pulse-connect-secure-auth-bypass-round-two
[11] https://blog.sonicwall.com/en-us/2024/02/ivanti-server-side-request-forgery-to-auth-bypass/
[12] https://www.dailysecu.com/news/articleView.html?idxno=153513
[13] https://www.boannews.com/media/view.asp?idx=126369&page=15&kind=1
[14] https://www.boannews.com/media/view.asp?idx=126665&page=1&kind=1
'취약점 > Elevation of Privilege' 카테고리의 다른 글
Kubernetes Image Builder 기본 자격 증명 비활성화 취약점 (CVE-2024-9486, CVE-2024-9594) (1) | 2024.10.18 |
---|---|
Cisco IOS XE Software Web UI 권한 상승 취약점 (CVE-2023-20198) (1) | 2023.10.17 |
WordPress WooCommerce Payments 플러그인 권한 상승 취약점 (CVE-2023-28121) (0) | 2023.07.18 |
Microsoft Outlook 권한 상승 취약점 (CVE-2023-23397) (0) | 2023.03.21 |