Search

Windows Remote Desktop Licensing Service Pre-auth RCE 취약점 (CVE-2024-38077) 분석

태그
PurpleHound
Windows Server
RDL
Property
123.png
작성날짜
2025/11/21

1. 개요

본 보고서는 Microsoft Windows Server 운영체제의 Windows Remote Desktop Licensing Service(이하 RDL)에서 발생하는 CVE-2024-38077 원격 코드 실행(Remote Code Execution, RCE) 취약점에 대해 다룬다. 인증되지 않은 공격자가 네트워크를 통해 RDL 서비스에 연결하여 원격 코드 실행을 허용할 수 있는 악성 메세지를 전송할 수 있다. 이 취약점은 피해 시스템에 대한 인증이나 상호작용이 필요 없는 0-Click 형태이고, 외부 네트워크에서 접근할 수 있는 RDL 서비스 하나만 존재하면 공격이 가능하다. 따라서, 시스템에 미칠 수 있는 영향이 중대해 CVSS 점수가 9.8로 지정되었다.
본 보고서는 CVE-2024-38077 취약점의 근본 원인을 심층 분석하고, 이에 대한 방어 및 완화 전략을 제시한다.

2. 취약점 근본 원인 분석

항목
내용
취약점 번호
CVE-2024-38077
취약점 이름
Windows Remote Desktop Licensing Service Remote Code Execution Vulnerability
취약점 종류
Remote Code Execution
CWE
Heap-based Buffer Overflow
CVSS
9.8(/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C)
CVE-2024-38077은 Heap-based Buffer Overflow 취약점이다. 이 취약점을 활용해 힙 메모리 베이스 주소, 함수의 주소 등을 유출해 보안 기능인 ASLR을 무력화 할 수 있고, CFG를 우회해 최종적으로 원격 코드 실행 공격까지 수행할 수 있다.

2.1. lserver!CDataCoding::DecodeData() 함수의 취약성

[그림 1] RPCView로 조회한 RPC 함수 번호 및 함수 주소
lserver!TLSRpcTelephoneRegisterLKP() 함수는 opnum 39를 갖는 RPC 함수다.
[그림 2] lserver!CDataCoding::DecodeData() 호출 스택
lserver!TLSRpcTelephoneRegisterLKP 호출 시 내부적으로 lserver!CDataCoding::DecodeData() 함수를 호출하게 되고, 이 함수는 RPC 함수의 파라미터로 입력한 Base24로 인코딩된 유니코드 문자열을 원본 바이너리 데이터로 디코딩 한다.
long long __fastcall CDataCoding::DecodeData(wchar_t* pSrcEncodedBuffer, unsigned char** pDstDecodedBuffer, unsigned int* pOutputSize) { HANDLE hHeap; wchar_t* pCurrentEncodedChar; unsigned char* pDecodedBuffer; unsigned char* pCurrentDecodeBuffer; __int64 decodedChar; int currentIdx; long long decodeDelta; unsigned int tmp; wchar_t Base24Chars[] = L"BCDFGHJKMPQRTVWXY2346789"; currentIdx = 0; if (pDstDecodedBuffer != NULL) { *pOutputSize = 0; *pDstDecodedBuffer = 0; hHeap = GetProcessHeap(); pDecodedBuffer = (unsigned char*)HeapAlloc(hHeap, 8, 21); if (pDecodedBuffer != NULL) { memset(pDecodedBuffer, 0x00, 21); // 인코딩된 문자열을 순회하여 디코딩 후 힙 메모리에 복사하는 코드 // pSrcEncodedBuffer에서 NULL 바이트를 만날 때 까지 반복하지만 // pSrcEncodedBuffer의 길이를 검사하지 않는다 while (*pSrcEncodedBuffer != NULL) { pCurrentEncodedChar = wcschr(Base24Chars, *pSrcEncodedBuffer); if (pCurrentEncodedChar == NULL) { hHeap = GetProcessHeap(); HeapFree(hHeap, 0, pDecodedBuffer); return ERROR_INVALID_DATA; // 0xD } decodedChar = pCurrentEncodedChar - Base24Chars; pCurrentDecodeBuffer = pDecodedBuffer; decodeDelta = currentIdx + 1; do { tmp = 18 * *pCurrentDecodeBuffer + decodedChar; *pCurrentDecodeBuffer++ = tmp; LODWORD(decodedChar) = tmp >> 8; --decodeDelta; } while (decodeDelta); // 실질적으로 문자열을 힙 메모리에 복사하는 코드 // 21 바이트의 힙 메모리 범위를 넘어서 복사하게 된다 if (decodedChar != NULL) pDecodedBuffer[++currentIdx] = decodedChar; ++pSrcEncodedBuffer; } *pOutputSize = 21; *pDstDecodedBuffer = pDecodedBuffer; } else { return ERROR_NOT_ENOUGH_MEMORY; // 0x8 } } else { return ERROR_INVALID_PARAMETER; // 0x57 } return ERROR_SUCCESS; // 0x0 }
C++
복사
[코드 1] lserver!CDataCoding::DecodeData() 함수 코드
이 때, [코드 1]을 살펴보면, lserver!CDataCoding::DecodeData() 함수 내부에는 파라미터의 인코딩된 문자열의 길이를 검사하지 않는다는 사실을 확인할 수 있다. 이 함수는 21 바이트의 힙 메모리를 생성하는데, 길이를 검사하지 않는다. 또한, pSrcEncodedBuffer는 공격자가 제어할 수 있는 RPC 스텁에 포함된다. 따라서, 21 바이트의 힙 메모리 할당 범위를 넘어서 Heap-based Buffer Overflow 공격이 가능하다.

2.2. 원격 코드 실행 과정

[그림 3] CVE-2024-38077 원격 코드 실행 공격 과정

3. 검증 결과 및 시연

[동영상 1] CVE-2024-38077 원격 코드 실행 시연 영상
CVE-2024-38077은 LFH Delay Free라는 새로운 취약점 공격 완화 기법이 적용된 Windows Server 2025에서도 트리거가 가능하다. 이 취약점을 최초로 보고한 보안 연구원은 힙 스프레이 과정에서 일부 메모리를 해제 후 약 5초의 딜레이를 부여하는 아이디어를 제시했다.
LoadLibraryA(), CreateProcess() 와 같은 함수의 인자가 공격자의 원격 SMB 서버에 존재하는 악성코드 경로를 가르키도록 하는 방식으로 원격 코드 실행을 구현할 수 있다.
단, 취약점이 일어나는 NT AUTHORITY\NETWORK SERVICE 세션은 윈도우 운영체제 구조 상 낮은 권한이 부여되어 있어 추가 공격을 수행하기 위해서 공격 목표에 따라 권한 상승 취약점이 추가로 필요할 수도 있다.

4. 공격 영향

본 취약점은 원작자가 PoC의 중요한 부분을 가려 사용 가능한 PoC가 공개되지 않았지만, RPC에 대해 높은 이해도를 가진 공격자는 공개된 부분 만으로도 취약점을 악용하는 코드를 개발할 수 있다. 이 취약점을 성공적으로 악용할 경우 공격자는 NT AUTHORIY\NETWORK SERVICE 권한으로 원격 코드 실행할 수 있으며, 이는 다음과 같은 심각한 위협으로 이어질 수 있다.
시스템 장악: 공격자는 서버의 데이터에 접근하고 시스템 설정을 임의로 변경하는 등 제어 권한을 획득할 수 있다.
추가 악성코드 감염: 랜섬웨어를 통해 데이터를 암호화하거나, 암호화폐 채굴 악성코드를 설치하여 시스템 자원을 무단으로 사용, 트로이 목마 악성코드를 설치해 민감한 데이터를 유출하는 등 추가적인 악성 행위가 가능하다.
네트워크 수평 이동: 공격자는 감염된 서버를 교두보로 삼아, 동일 네트워크에 연결된 다른 내부 시스템을 공격하는 수평 이동(Lateral Movement)을 시도할 수 있다.

5. 완화 및 권고사항

Product
취약점 영향 버전
Microsoft Windows Server 2008
6.0.6003.22769 이전 버전
Microsoft Windows Server 2008 R2
6.1.7600.27219 이전 버전
Microsoft Windows Server 2012
6.2.9200.24975 이전 버전
Microsoft Windows Server 2012 R2
6.3.9600.22074 이전 버전
Microsoft Windows Server 2016
10.0.14393.7159 이전 버전
Microsoft Windows Server 2019
10.0.17763.6054 이전 버전
Microsoft Windows Server 2022
10.0.20348.2582 이전 버전
Microsoft Windows Server 2022 23H2
10.0.25398.1009 이전 버전
Microsoft Windows Server
나열되지 않은 모든 지원 종료된 버전
1.
즉각적인 보안 패치 적용: 보안 업데이트가 적용되지 않았고, RDL 서비스를 사용 중인 모든 윈도우 서버는 CVE-2024-38077에 취약하다. RDL 서비스를 사용 중인 시스템은 즉시 Microsoft의 지침에 따라 보안 패치를 적용해야 한다.
2.
필요하지 않은 서비스 비활성화: RDL은 한 시스템에서 2개를 초과하는 RDP 세션을 사용 가능하도록 하는 Microsoft의 라이센스 관리에 필요하다. RDL이 필요하지 않은 경우 이를 사용하지 않는 것이 좋다. 사용하지 않으며 불필요한 서비스를 비활성화 하면 공격 표면을 감소 시켜 보안 취약성에 노출될 위험을 줄이는 데 도움이 된다. 단, RDL 서비스를 사용하지 않더라도 보안 패치를 적용하는 것이 좋다.
3.
방화벽을 통한 네트워크 접근 제어 강화: RDL 서비스는 DCERPC 포트인 TCP 135 포트를 사용하기 때문에 원격 DCERPC가 필요하지 않은 경우 외부 네트워크에서 해당 포트에 접근할 수 없도록 방화벽 정책을 강화해야 한다. DCERPC 포트를 외부 네트워크에 개방하는 것은 본 취약점 외에도 예측하지 못한 다른 보안 위협에 시스템이 잠재적으로 노출될 가능성이 존재한다.

6. 결론

CVE-2024-38077은 클라이언트가 제어할 수 있는 버퍼 길이를 검사하지 않아 Heap-based Buffer Overflow 취약점이 발생했고, 이 취약점이 인증 과정 이전에 발생하기 때문에 인증이 필요 없는 0-Click RCE가 가능했다.
당사의 솔루션인 PurpleHound는 실전 기반 시나리오를 재구성하여 기업이 보유한 보안 장비와 시스템이 실제 공격에 얼마나 효과적으로 대응 가능한지 검증할 수 있도록 지원한다.
본 보고서에서 분석한 취약점 뿐만 아니라 다른 유형의 취약점, 악성코드 활동, 파일 시스템 조작 등 다양한 위협 시나리오를 직접 실행해보며 보안 인프라의 실효성을 객관적으로 확인할 수 있다.

7. 참고자료