
.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 के साथ क्रैश हो गया। प्रक्रिया मर चुकी है।
# (वैकल्पिक — ऊपर पहले से किया गया) पहले निर्भरताएं restore करें
dotnet restore
# भेद्यताओं को ठीक करने के लिए Seal CLI चलाएं
seal fix . --mode remote -v
# सील्ड संस्करण खींचने के लिए फिर से restore करें
dotnet restore
# पैच किए गए ऐप को build और run करें
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 चरण को निर्भरताओं के इंस्टॉल होने के तुरंत बाद लेकिन अंतिम build से पहले जोड़ा जाना चाहिए।
# 1. निर्भरताएं restore करें
dotnet restore
# 2. <--- Seal CLI यहाँ चलाएं
$env:SEAL_TOKEN = "your-seal-token-here"
$env:SEAL_PROJECT = "nuget-demo-net7"
seal fix . --mode remote -v
# 3. फिर से restore करें (सील्ड संस्करण प्राप्त करने के लिए)
dotnet restore
# 4. Build
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 | प्रोजेक्ट ID (जैसे, 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 रिपोर्ट करना चाहिए।
| आइटम | यह क्यों मायने रखता है |
|---|---|
global.json SDK को 7.0.x पर rollForward: latestFeature के साथ पिन करता है | साइड-बाय-साइड net8/net9 वाली मशीनों को डेमो के बीच में SDK बदलने से रोकता है। |
System.Configuration.ConfigurationManager को 7.0.0 पर पिन किया गया | कैनोनिकल net9 डेमो 8.0.0 का उपयोग करता है, जो केवल net8 को लक्षित करता है और net7 पर restore करने में विफल रहता है। 7.0.0 में वही API सतह है जो log4net को चाहिए। |
csproj में NU1701 दबाया गया | log4net 2.0.5 एक विरासती net4x TFM का विज्ञापन करता है जिसे .NET 7 रनटाइम पर स्वीकार करता है लेकिन restore पर चेतावनी देता है। चेतावनी कॉस्मेटिक है; दमन डेमो के दौरान build आउटपुट को साफ रखता है। |
| Windows x64 के लिए Seal CLI v0.3.238 | Windows बाइनरी के साथ अंतिम रिलीज़; NuGet उपचार के लिए पूरी तरह कार्यात्मक। Windows बाइनरी इस संस्करण के बाद बंद कर दी गई थीं, इसलिए नए रिलीज़ का सुझाव न दें। |
12.0.2-sp1 12.0.2 के लिए बाइनरी-संगत ड्रॉप-इन है।इस डेमो द्वारा उपयोग किए गए पैकेज:
| पैकेज | कमजोर संस्करण | सील्ड संस्करण | CVE | CVSS |
|---|---|---|---|---|
| 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 |
Seal फ़ीड से उपलब्ध अन्य सील्ड NuGet पैकेज (इस डेमो में नहीं, संदर्भ के लिए सूचीबद्ध):
| पैकेज | कमजोर संस्करण | सील्ड संस्करण | 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 |
MIT लाइसेंस - विवरण के लिए LICENSE फ़ाइल देखें।