[하루한줄] CVE-2025-59287: WSUS(Windows Server Update Services)의 인증되지 않은 RCE 취약점
URL
Target
WSUS가 설치 및 활성화된 서버에만 영향
- Windows Server 2012
- Windows Server 2012 R2
- Windows Server 2016
- Windows Server 2019
- Windows Server 2022
- Windows Server 2025
Explain
Windows Server Update Services(WSUS)는 기업 환경에서 Windows 업데이트의 승인, 배포, 모니터링을 중앙에서 담당하는 인프라 서비스입니다. CVE-2025-59287은 WSUS의 웹 보고&관리 엔드포인트가 외부에서 전송된 직렬화(serialized) 데이터를 적절히 검증하지 않고 .NET 런타임에서 역직렬화(deserialization)를 수행할 때 발생한 원격 코드 실행(RCE) 취약점입니다.
해당 취약점은 GetCookie() 엔드포인트로 전송된 AuthorizationCookie 객체의 역직렬화 과정에서 발생합니다. WSUS의 Microsoft.UpdateServices.Internal.Authorization.EncryptionHelper.DecryptData() 메서드는 복호화된 바이트를 충분히 검증하지 않고 BinaryFormatter.Deserialize()로 역직렬화하여 SYSTEM 권한으로 원격 코드 실행을 가능하게 합니다.
else
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
MemoryStream memoryStream = new MemoryStream(array);
try
{
obj = binaryFormatter.Deserialize(memoryStream); // [1]
}
catch (Exception ex2)
// ...
if (obj.GetType() != this.classType) // [2]
{
throw new LoggedArgumentException("Decrypted cookie has the wrong data type. Expected type = " + this.classType.ToString() + ", actual type = " + obj.GetType().ToString(), "cookieData");
}
}
return obj;
[1] 위 과정은 복호화된 쿠키 바이트(array)를 MemoryStream에 담아 BinaryFormatter.Deserialize()로 역직렬화하는 과정입니다. 하지만 [2] 이에 대한 타입 검사가 역직렬화 후에 일어납니다. 이에 공격자는 soserial.net과 같은 도구로 가젯 체인 페이로드를 만들어 BinaryFormatter로 역직렬화될 때 애플리케이션이 임의의 코드를 실행하도록 유도할 수 있습니다. 이러한 악용은 RCE로 이어질 수 있습니다.
Flow
취약점 흐름은 아래와 같습니다.
1) 조작된 SOAP 요청 전송
인증되지 않은 공격자가 WSUS의 SOAP의 엔드포인트 /ClientWebService/Client.asmx 로 조작된 요청을 전송합니다. 이 때 요청 헤더에는 SOAPAction: “…/GetCookie" 등이 포함됩니다.
POST /ClientWebService/Client.asmx HTTP/1.1
Host: WSUS-SERVER:8530
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService/GetCookie"
Content-Length: 3632
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetCookie xmlns="http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService">
<authCookies>
<AuthorizationCookie>
<PlugInId>SimpleTargeting</PlugInId>
<CookieData>[GENERATED PAYLOAD]</CookieData>
</AuthorizationCookie>
</authCookies>
<oldCookie xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<protocolVersion>1.20</protocolVersion>
</GetCookie>
</soap:Body>
</soap:Envelope>
2) AuthorizationCookie 안에 악성 페이로드 삽입
요청의 본문에 AuthorizationCookie의 CookieData 필드에 악성 페이로드가 들어갑니다. 해당 페이로드는 Base64로 인코딩된 후 AES-128-CBC로 암호화된 형태로 전송됩니다.
3) 서버의 요청 수신 → 처리
해당 요청은 AuthorizationManager.GetCookie로 전달되고, 내부적으로 CrackAuthorizationCookies → CrackAuthorizationCookie 호출 경로를 따라 EncryptionHelper.DecryptData()에 도달합니다.
4) 복호화 단계
DecryptData()는 하드코딩된 AES키를 사용해 페이로드를 복호화합니다.
5) 역직렬화
복호화된 바이트는 MemoryStream으로 감싸져 바로 BinaryFormatter.Deserialize()에 전달됩니다. 이 지점에서 BinaryFormatter는 바이트 스트림의 타입 정보를 이용해 객체를 복원하고 생성자, ISerializable 후크·OnDeserialized 같은 콜백을 자동으로 실행할 수 있습니다. 이 때 역직렬화 후에 obj.GetType()으로 타입을 검사하므로, 이미 일어난 악성 동작을 차단하지 못합니다.
6) 가젯 체인 실행 → RCE
공격자의 페이로드는 서버의 가젯체인을 악용한다면,
WSUS 프로세스(wsusservice.exe 또는 w3wp.exe)가 SYSTEM 권한으로 동작하는 환경에서 RCE가 발생할 수 있습니다.
현재 PoC는 찾아볼 수 있지만, 이 게시글에서 다루지 않습니다.
Fetch
Microsoft는 CVE-2025-59287과 관련한 보안 업데이트를 발표했으나, 초기 패치가 완전하지 않아 추가 긴급 패치가 배포되었고 실제 공격 시도/악용이 보고되어 즉시 패치 적용 및 포트 완화 조치가 필요합니다.
Reference
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.