
.NET 7 फोर्क ऑफ seal-security-nuget-demo: वही CVE-2024-21907 एक्सप्लॉइट कहानी, .NET SDK 7 पर लॉक किए गए ग्राहकों के लिए पुनः लक्षित।
यह कैनोनिकल seal-security-nuget-demo (जो net9.0 को लक्षित करता है) का पुनर्लक्षित फोर्क है। एक्सप्लॉइट कहानी, कंट्रोलर, और सील्ड-पैकेज सूची समान हैं — केवल TargetFramework भिन्न है।
यह इसलिए मौजूद है क्योंकि अधिकांश एंटरप्राइज़ ग्राहक मांग पर नवीनतम .NET SDK पर नहीं जा सकते। .NET 7 ने 14 मई, 2024 को समर्थन-समाप्ति प्राप्त की, लेकिन वास्तविक प्रोडक्शन वातावरण अभी भी संगतता, प्रमाणन, या परिचालन कारणों से इस पर चलते हैं। यह ठीक वही मामला है जिसके लिए Seal Security डिज़ाइन किया गया है: जब कोई ग्राहक प्रमुख संस्करण अपग्रेड नहीं ले सकता (या नहीं लेना चाहता), Seal कमजोर निर्भरता को उसी स्थान पर समान संस्करण के अंतर्गत पैच करता है, बिना किसी सार्वजनिक API परिवर्तन और बिना ग्राहक के ऐप में कोई कोड संपादन के। यह डेमो उस चर्चा को ग्राहक के वास्तविक स्टैक पर होने देता है, बजाय उनसे पहले net8/net9 इंस्टॉल करने के लिए कहने के।
फोर्क global.json के माध्यम से SDK को 7.0.x पर पिन करता है ताकि डेमो के दौरान आकस्मिक अपग्रेड न आ सकें।
यह डेमो एप्लिकेशन एक सरल ASP.NET Core स्वागत पृष्ठ है जो उपयोगकर्ता इनपुट को कॉन्फ़िग ऑब्जेक्ट के रूप में पार्स करने के लिए Newtonsoft.Json 12.0.2 का उपयोग करता है। ऐप में एक नाम फ़ील्ड है — अपना नाम टाइप करें, Go पर क्लिक करें, और यह "Welcome, alice!" प्रदर्शित करता है। पर्दे के पीछे यह इनपुट को Newtonsoft.Json के JsonConvert.DeserializeObject<NestedConfig>() के माध्यम से पास करता है। बस इतना ही — एक लोकप्रिय JSON लाइब्रेरी का पूरी तरह से मानक उपयोग।
समस्या यह है कि Newtonsoft.Json 12.0.2 (और 13.0.1 से पहले के संस्करण) में CVE-2024-21907 है — एक उच्च गंभीरता वाली Denial of Service भेद्यता जिसका CVSS स्कोर 7.5 (HIGH) है। यह डेमो दिखाता है कि Seal Security बिना प्रमुख संस्करण अपग्रेड की आवश्यकता के भेद्यता को स्थान पर कैसे पैच करता है।
Newtonsoft.Json की JsonConvert.DeserializeObject<T>() विधि का शोषण गहराई से नेस्टेड JSON पेलोड बनाकर किया जा सकता है। टाइप किए गए ऑब्जेक्ट (POCO) में डिसीरियलाइज़ करते समय, लाइब्रेरी का JsonSerializerInternalReader वास्तव में पुनरावर्ती कॉल करता है (CreateValueInternal → CreateObject → PopulateObject → SetPropertyValue → CreateValueInternal) जो स्टैक ओवरफ्लो का कारण बनता है, जिससे एप्लिकेशन क्रैश हो जाता है (Denial of Service)।
ऐप उपयोगकर्ता इनपुट लेता है और इसे Newtonsoft.Json के माध्यम से पार्स करता है। यदि इनपुट एक URL है, तो ऐप पहले सामग्री प्राप्त करता है — एक यथार्थवादी पैटर्न जो कॉन्फ़िग लोडर, API परीक्षक, और वेबहुक रिसीवर द्वारा उपयोग किया जाता है:
public class NestedConfig
{
[JsonProperty("n")]
public NestedConfig? N { get; set; }
}
var config = JsonConvert.DeserializeObject<NestedConfig>(name);
सामान्य इनपुट: alice टाइप करें → "Welcome, alice!" प्रदर्शित होता है
एक्सप्लॉइट: इस URL को नाम फ़ील्ड में पेस्ट करें और Go पर क्लिक करें:
https://raw.githubusercontent.com/seal-sec-demo-2/json-payload/main/payload.json
ऐप पता लगाता है कि यह एक URL है, json-payload प्राप्त करता है (गहराई से नेस्टेड JSON {"n":{"n":{...}}}), और इसे Newtonsoft.Json के माध्यम से पुनरावर्ती NestedConfig वर्ग में डिसीरियलाइज़ करता है — जिससे स्टैक ओवरफ्लो ट्रिगर होता है।
JsonSerializerInternalReader प्रत्येक नेस्टिंग स्तर के लिए CreateValueInternal → CreateObject → PopulateObject → SetPropertyValue के माध्यम से पुनरावृत्ति करता है। लगभग 5,000 स्तरों की गहराई पर, यह थ्रेड स्टैक को समाप्त कर देता है और एप्लिकेशन StackOverflowException के साथ क्रैश हो जाता है — प्रक्रिया तुरंत मर जाती है (कोई सुंदर त्रुटि हैंडलिंग संभव नहीं है)।
इस भेद्यता के साथ, हमलावर यह कर सकते हैं:
सार्वजनिक रूप से उपलब्ध फिक्स के लिए संस्करण 13.0.1 में अपग्रेड करना आवश्यक है। हालाँकि, प्रमुख संस्करणों में अपग्रेड करने से अक्सर निम्नलिखित समस्याएं आती हैं:
यह "बस अपग्रेड करें" फिक्स को एक परियोजना बनाता है जो आसानी से डेवलपर समय के सप्ताह ले सकती है — इस बीच भेद्यता खुली रहती है।
Seal का पैच किया गया संस्करण (12.0.2-sp1) बिना किसी सार्वजनिक API को बदले पुनरावृत्ति गहराई सुरक्षा जोड़ता है। पैच:
MaxDepth सीमाएं जोड़ता हैयह वही शमन रणनीति है जो Newtonsoft.Json 13.0.1 में लागू की गई है, जिसे 12.0.2 में ड्रॉप-इन प्रतिस्थापन के रूप में बैकपोर्ट किया गया है।
यह डेमो अन्य कमजोर NuGet पैकेज भी शामिल करता है जिन्हें Seal Security पैच कर सकता है:
log4net के XML कॉन्फ़िगरेशन पार्सिंग में XML External Entity (XXE) भेद्यता। एक हमलावर जो log4net कॉन्फ़िगरेशन फ़ाइल को नियंत्रित कर सकता है, वह यह कर सकता है:
System.Net.Httpपर नोट: कैनोनिकल net9 डेमो CVE-2017-0249 के लिए एक कमजोरSystem.Net.Http 4.3.0संदर्भ भी भेजता है। हमने इसे इस net7 फोर्क से हटा दिया है क्योंकि .NET 7 परSystem.Net.HttpBCL का हिस्सा है और स्टैंडअलोन पैकेज संदर्भ एक अवशिष्ट मेटा-पैकेज है — इसके साथdotnet add package --source <local-nupkg>के ज्ञात एज केस हैं, जो ठीक वैसे ही है जैसे Seal CLI सील्ड संस्करण लागू करता है। इसे हटाने सेseal fixचरण डेमो की कहानी बदले बिना विश्वसनीय हो जाता है (HttpClientअभी भी ठीक काम करता है; रनटाइम इसे प्रदान करता है)।
Windows CLI बाइनरी v0.3.238 के बाद बंद कर दी गई थीं। v0.3.238 Windows पर NuGet उपचार के लिए पूरी तरह कार्यात्मक है।
विस्तृत Windows Server इंस्टॉल + रन गाइड README-WINDOWS-SERVER.md में है। नीचे दिया गया Quick Start समान चरणों को संक्षिप्त रूप में कवर करता है।
PowerShell:
$env:SEAL_TOKEN = "your-seal-token-here"
$env:SEAL_PROJECT = "nuget-demo-net7"
cd seal-security-nuget-demo-net7
# Restore (nuget.org और Seal फ़ीड से खींचता है — nuget.config देखें)
dotnet restore
# Build और run
dotnet build
dotnet run
http://localhost:5000 खोलें — ऐप कमजोर निर्भरताओं के साथ चल रहा है।
नाम फ़ील्ड में alice टाइप करें, Go पर क्लिक करें। आपको देखना चाहिए: "Welcome, alice!"
निम्न URL को नाम फ़ील्ड में पेस्ट करें और Go पर क्लिक करें:
https://raw.githubusercontent.com/seal-sec-demo-2/json-payload/main/payload.json
अनपैच किया गया परिणाम: ब्राउज़र एक त्रुटि / कनेक्शन रीसेट दिखाता है — ऐप JsonSerializerInternalReader.CreateValueInternal में StackOverflowException के साथ क्रैश हो गया। प्रक्रिया मर चुकी है।