
.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 इंस्टॉल करने को कहा जाए।
फ़ोर्क SDK को global.json के माध्यम से 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 पैच कर सकता है:
XML एक्सटर्नल एंटिटी (XXE) भेद्यता log4net के XML कॉन्फ़िगरेशन पार्सिंग में। एक हमलावर जो 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 सर्वर इंस्टॉल + रन गाइड README-WINDOWS-SERVER.md में है। नीचे दिया गया त्वरित प्रारंभ संक्षिप्त रूप में समान चरणों को कवर करता है।
PowerShell:
$env:SEAL_TOKEN = "your-seal-token-here"
$env:SEAL_PROJECT = "nuget-demo-net7"
cd seal-security-nuget-demo-net7
# पुनर्स्थापित करें (nuget.org और Seal फीड से खींचता है — nuget.config देखें)
dotnet restore
# बनाएँ और चलाएँ
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 के साथ ऐप क्रैश हो गया। प्रक्रिया मृत है।
# (वैकल्पिक — ऊपर पहले से किया गया) पहले निर्भरताएँ पुनर्स्थापित करें
dotnet restore
# भेद्यताओं को ठीक करने के लिए Seal CLI चलाएँ
seal fix . --mode remote -v
# सील किए गए संस्करणों को प्राप्त करने के लिए फिर से पुनर्स्थापित करें
dotnet restore
# पैच किए गए ऐप को बनाएँ और चलाएँ
dotnet build
dotnet run
ऐप अब पैच किए गए संस्करणों (Newtonsoft.Json 12.0.2-sp1, log4net 2.0.5-sp1) का उपयोग करता है।
पेच्ड परिणाम: वही एक्सप्लॉइट URL पेस्ट करें → पृष्ठ "Blocked by Seal patch: MaxDepth of 64 has been exceeded." दिखाता है — Newtonsoft.Json के पेच्ड रिकर्सन लिमिट ने गहरे पेलोड को अस्वीकार कर दिया। सर्वर सामान्य रूप से चलता रहता है।
dotnet list package
आपको Seal Security पैच को इंगित करने वाले -sp1 प्रत्यय वाले पैकेज देखने चाहिए।
CLI चरण को निर्भरताओं के इंस्टॉल होने के तुरंत बाद लेकिन अंतिम बिल्ड से पहले जोड़ा जाना चाहिए।
# 1. निर्भरताएँ पुनर्स्थापित करें
dotnet restore
# 2. <--- यहाँ Seal CLI चलाएँ
$env:SEAL_TOKEN = "your-seal-token-here"
$env:SEAL_PROJECT = "nuget-demo-net7"
seal fix . --mode remote -v
# 3. फिर से पुनर्स्थापित करें (सील किए गए संस्करण प्राप्त करने के लिए)
dotnet restore
# 4. बिल्ड करें
dotnet build
| मोड | विवरण |
|---|---|
all | सभी उपलब्ध फिक्स स्वचालित रूप से लागू करें |
remote | केवल Seal UI में अनुमोदित फिक्स लागू करें |
local | केवल .seal-actions.yml में परिभाषित फिक्स लागू करें |
इस रिपो में .seal-actions.yml पहले से ही local मोड के लिए तीन सील किए गए ओवरराइड सूचीबद्ध करता है, इसलिए seal fix . --mode local -v ऑफ़लाइन काम करता है (फिर भी आर्टिफैक्ट सर्वर के लिए टोकन की आवश्यकता है)।
nuget.config पर्यावरण चर के साथ Seal Security का उपयोग करने के लिए पूर्व-कॉन्फ़िगर किया गया है:
<configuration>
<packageSources>
<add key="Seal" value="https://nuget.sealsecurity.io/v3/index.json" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<packageSourceCredentials>
<Seal>
<add key="Username" value="%SEAL_PROJECT%" />
<add key="ClearTextPassword" value="%SEAL_TOKEN%" />
</Seal>
</packageSourceCredentials>
</configuration>
| चर | विवरण |
|---|---|
SEAL_TOKEN | आपका Seal Security एक्सेस टोकन |
SEAL_PROJECT | प्रोजेक्ट आईडी (जैसे, nuget-demo-net7) |
Seal CLI को आउटबाउंड HTTPS (TCP 443) की आवश्यकता है:
cli.sealsecurity.io — स्कैन / फिक्स कॉन्फ़िगरेशनauthorization.sealsecurity.io — टोकन सत्यापनnuget.sealsecurity.io — सील किए गए .nupkg डाउनलोडd2zko6i8myndc4.cloudfront.net — CDN जो वास्तविक सील किए गए आर्टिफैक्ट प्रदान करता है (.sealsecurity.io होस्टनाम यहाँ रीडायरेक्ट होते हैं)api.nuget.org / मानक nuget.org एंडपॉइंट — गैर-सील निर्भरताओं के लिएफ़ायरवॉल खोलने के बाद PowerShell से सत्यापित करें:
Test-NetConnection cli.sealsecurity.io -Port 443
Test-NetConnection authorization.sealsecurity.io -Port 443
Test-NetConnection nuget.sealsecurity.io -Port 443
Test-NetConnection d2zko6i8myndc4.cloudfront.net -Port 443
सभी को TcpTestSucceeded: True रिपोर्ट करना चाहिए।
12.0.2-sp1 12.0.2 के लिए एक बाइनरी-संगत ड्रॉप-इन है।इस डेमो द्वारा उपयोग किए गए पैकेज:
| पैकेज | असुरक्षित संस्करण | सील किया गया संस्करण | CVE | CVSS |
|---|
Seal फीड से उपलब्ध अन्य सील किए गए NuGet पैकेज (इस डेमो में नहीं, संदर्भ के लिए सूचीबद्ध):
MIT लाइसेंस — विवरण के लिए LICENSE फ़ाइल देखें।
| आइटम | यह क्यों मायने रखता है |
|---|
global.json SDK को 7.0.x पर rollForward: latestFeature के साथ पिन करता है | साइड-बाय-साइड net8/net9 वाली मशीनों को डेमो के बीच में SDK को चुपचाप स्विच करने से रोकता है। |
System.Configuration.ConfigurationManager को 7.0.0 पर पिन किया गया | मुख्य net9 डेमो 8.0.0 का उपयोग करता है, जो केवल net8 को लक्षित करता है और net7 पर पुनर्स्थापित करने में विफल रहता है। 7.0.0 में वही API सतह है जो log4net को चाहिए। |
csproj में NU1701 दबाया गया | log4net 2.0.5 एक विरासत net4x TFM का विज्ञापन करता है जिसे .NET 7 रनटाइम पर स्वीकार करता है लेकिन पुनर्स्थापना पर चेतावनी देता है। चेतावनी कॉस्मेटिक है; दमन डेमो के दौरान बिल्ड आउटपुट को साफ रखता है। |
| Seal CLI v0.3.238 Windows x64 के लिए | Windows बाइनरी के साथ अंतिम रिलीज़; NuGet निवारण के लिए पूरी तरह कार्यात्मक। Windows बाइनरी इस संस्करण के बाद बंद कर दी गई थी, इसलिए नए रिलीज़ का सुझाव न दें। |
| Newtonsoft.Json | 12.0.2 | 12.0.2-sp1 | CVE-2024-21907 | 7.5 HIGH |
| log4net | 2.0.5 | 2.0.5-sp1 | CVE-2018-1285 | 9.8 CRITICAL |
| पैकेज | असुरक्षित संस्करण | सील किया गया संस्करण | CVE | CVSS |
|---|
| log4net | 2.0.0 | 2.0.0-sp1 | CVE-2018-1285 | 9.8 CRITICAL |
| System.Net.Http | 4.3.0 | 4.3.0-sp1 | CVE-2017-0249 | 7.3 HIGH |
| Snappier | 1.1.0 | 1.1.0-sp1 | CVE-2023-28638 | 7.0 HIGH |
| jQuery.Validation | 1.17.0 | 1.17.0-sp1 | CVE-2021-21252 | 7.5 HIGH |