CVE-2026-56158용 .NET 역직렬화 페이로드 형식 5가지를 생성하여 HTTP/SOAP/JSON 엔드포인트를 통해 전달하며, 모의 서버, 스캐너 및 JSON 보고서 출력을 포함합니다.
치명적(CVSS 9.8) — Microsoft .NET Framework 및 .NET Runtime의 신뢰할 수 없는 데이터 역직렬화(CWE-502) 패치: 2026년 7월 14일 | 발견자: Positive Technologies (PT-2026-60174)
CVE-2026-56158은 Microsoft .NET Framework 및 .NET 런타임의 치명적인 원격 코드 실행 취약점입니다. 이 결함은 신뢰할 수 없는 데이터(CWE-502)의 안전하지 않은 역직렬화에 존재합니다. .NET 애플리케이션이 레거시 직렬 변환기(BinaryFormatter, NetDataContractSerializer, SoapFormatter, ObjectStateFormatter) 또는 TypeNameHandling.All/Auto가 활성화된 Json.NET을 사용할 때, 인증되지 않은 원격 공격자는 제작된 직렬화 페이로드를 전달하여 역직렬화 시 임의 코드 실행을 트리거할 수 있습니다.
이 취약점의 CVSS 3.1 기본 점수는 9.8(치명적) 이며, 벡터는 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H로 다음을 의미합니다:
Microsoft는 월간 Patch Tuesday 주기의 일부로 2026년 7월 14일에 보안 업데이트를 출시했습니다.
| 필드 | 값 |
|---|---|
| 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 (신뢰할 수 없는 데이터 역직렬화) |
| 게시일 | 2026년 7월 14일 |
| 패치일 | 2026년 7월 14일 |
| 발견자 | Positive Technologies (PT-2026-60174) |
| EPSS | 아직 산정되지 않음 |
| CISA KEV | 등재되지 않음 |
.NET 런타임의 레거시 직렬 변환기는 유형이나 콘텐츠를 검증하지 않고 직렬화된 스트림에서 임의의 객체 유형을 재구성합니다. 공격자가 직렬화된 입력을 제어할 수 있으면 역직렬 변환기가 예상치 못한 유형을 인스턴스화하도록 유도할 수 있으며, 해당 유형의 생성자, 콜백 또는 속성 setter가 임의 코드를 실행합니다 — 전형적인 역직렬화 가젯 체인 공격입니다.
이 취약점은 여러 직렬화 메커니즘에 영향을 줍니다:
TypeConfuseDelegate 가젯 체인이 Process.Start에 위임ProcessStartInfoProcess.StartTypeNameHandling.All/Auto가 활성화된 경우 $type 메타데이터가 포함된 JSON; ObjectDataProvider 가젯이 Process.Start 호출| 제품 | 취약 범위 | 수정 버전 | 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 | — |
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 필드JSON with $type → JsonConvert.DeserializeObject<T>(json, TypeNameHandling.All)
→ ObjectDataProvider.MethodName = "Start" → Process.Start → RCE
$type 메타데이터가 포함된 JSONapplication/jsonTypeNameHandling.All 또는 Auto를 사용하는 REST API 엔드포인트┌─────────────────────────────────────────────────────────────────────┐
│ 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]