
.NET 7-Fork von seal-security-nuget-demo: dieselbe CVE-2024-21907-Exploit-Geschichte, neu ausgerichtet für Kunden, die an das .NET SDK 7 gebunden sind.
Dies ist ein neu ausgerichteter Fork des kanonischen seal-security-nuget-demo (der auf net9.0 abzielt). Die Exploit-Geschichte, die Controller und die Liste der versiegelten Pakete sind identisch — nur die TargetFramework unterscheidet sich.
Er existiert, weil die meisten Unternehmenskunden nicht auf das neueste .NET SDK umsteigen können, wenn sie es wollen. .NET 7 hat am 14. Mai 2024 das Ende des Supports erreicht, aber echte Produktionsumgebungen laufen aus Kompatibilitäts-, Zertifizierungs- oder Betriebsgründen weiterhin darauf. Genau für diesen Fall ist Seal Security konzipiert: Wenn ein Kunde keinen Major-Versionssprung machen kann (oder will), patcht Seal die verwundbare Abhängigkeit an Ort und Stelle unter derselben Version, ohne Änderung der öffentlichen API und ohne Code-Änderungen an der App des Kunden. Diese Demo ermöglicht dieses Gespräch auf dem tatsächlichen Stack des Kunden, anstatt ihn zu bitten, zuerst net8/net9 zu installieren.
Der Fork fixiert das SDK über global.json auf 7.0.x, damit während der Demo keine versehentlichen Upgrades einschleichen.
Diese Demo-Anwendung ist eine einfache ASP.NET-Core-Willkommensseite, die Newtonsoft.Json 12.0.2 verwendet, um Benutzereingaben als Konfigurationsobjekt zu parsen. Die App hat ein Namensfeld — geben Sie Ihren Namen ein, klicken Sie auf Go, und sie zeigt "Welcome, alice!" an. Unter der Haube leitet sie die Eingabe durch JsonConvert.DeserializeObject<NestedConfig>() von Newtonsoft.Json. Das war's — völlig standardmäßige Verwendung einer beliebten JSON-Bibliothek.
Das Problem ist, dass Newtonsoft.Json 12.0.2 (und Versionen vor 13.0.1) CVE-2024-21907 aufweist — eine Denial-of-Service-Schwachstelle mit hohem Schweregrad und einem CVSS-Score von 7.5 (HOCH). Diese Demo zeigt, wie Seal Security die Schwachstelle an Ort und Stelle patcht, ohne dass ein Major-Versions-Upgrade erforderlich ist.
Die Methode JsonConvert.DeserializeObject<T>() von Newtonsoft.Json kann durch das Erstellen tief verschachtelter JSON-Payloads ausgenutzt werden. Beim Deserialisieren in ein typisiertes Objekt (POCO) führt der JsonSerializerInternalReader der Bibliothek echte rekursive Aufrufe aus (CreateValueInternal → CreateObject → PopulateObject → SetPropertyValue → CreateValueInternal), die einen Stack-Überlauf verursachen und zum Absturz der Anwendung führen (Denial of Service).
Die App nimmt Benutzereingaben entgegen und parst sie mit Newtonsoft.Json. Wenn die Eingabe eine URL ist, ruft die App zuerst den Inhalt ab — ein realistisches Muster, das von Konfigurationsladern, API-Testern und Webhook-Empfängern verwendet wird:
public class NestedConfig
{
[JsonProperty("n")]
public NestedConfig? N { get; set; }
}
var config = JsonConvert.DeserializeObject<NestedConfig>(name);
Normale Eingabe: alice eingeben → zeigt "Welcome, alice!" an
Exploit: Fügen Sie diese URL in das Namensfeld ein und klicken Sie auf Go:
https://raw.githubusercontent.com/seal-sec-demo-2/json-payload/main/payload.json
Die App erkennt, dass es sich um eine URL handelt, ruft das json-payload ab (tief verschachteltes JSON {"n":{"n":{...}}}) und deserialisiert es über Newtonsoft.Json in die rekursive Klasse NestedConfig — was den Stack-Überlauf auslöst.
Der JsonSerializerInternalReader durchläuft für jede Verschachtelungsebene rekursiv CreateValueInternal → CreateObject → PopulateObject → SetPropertyValue. Bei etwa 5.000 Ebenen Tiefe ist der Thread-Stack erschöpft und die Anwendung stürzt mit einer StackOverflowException ab — der Prozess stirbt sofort (keine saubere Fehlerbehandlung möglich).
Mit dieser Schwachstelle können Angreifer:
Der öffentlich verfügbare Fix erfordert ein Upgrade auf Version 13.0.1. Allerdings bringt ein Major-Versions-Upgrade oft Folgendes mit sich:
Das macht die "einfach upgraden"-Lösung zu einem Projekt, das leicht Wochen an Entwicklerzeit verschlingen kann — währenddessen bleibt die Schwachstelle offen.
Die gepatchte Version von Seal (12.0.2-sp1) fügt Rekursionstiefenschutz hinzu, ohne die öffentliche API zu ändern. Der Patch:
MaxDepth-Grenzwerte hinzu, um unbegrenzte Rekursion zu verhindernDies ist dieselbe Abschwächungsstrategie wie in Newtonsoft.Json 13.0.1, zurückportiert auf 12.0.2 als Drop-in-Ersatz.
Diese Demo enthält auch weitere verwundbare NuGet-Pakete, die Seal Security patchen kann:
XML-External-Entity-Schwachstelle (XXE) beim Parsen der XML-Konfiguration von log4net. Ein Angreifer, der die log4net-Konfigurationsdatei kontrollieren kann, kann:
Hinweis zu
System.Net.Http: Die kanonische net9-Demo enthält ebenfalls einen verwundbarenSystem.Net.Http 4.3.0-Verweis für CVE-2017-0249. Wir haben ihn aus diesem net7-Fork entfernt, weilSystem.Net.Httpin .NET 7 Teil der BCL ist und der eigenständige Paketverweis ein Relikt-Meta-Paket ist — er hat bekannte Randfälle mitdotnet add package --source <local-nupkg>, und genau so wendet die Seal-CLI versiegelte Versionen an. Das Entfernen macht den Schrittseal fixzuverlässig, ohne die Geschichte der Demo zu ändern (HttpClientfunktioniert weiterhin einwandfrei; die Laufzeit stellt es bereit).
Windows-CLI-Binärdateien wurden nach v0.3.238 eingestellt. v0.3.238 ist für die NuGet-Sanierung unter Windows voll funktionsfähig.
Eine ausführliche Anleitung zur Installation und Ausführung auf Windows Server finden Sie in README-WINDOWS-SERVER.md. Der Schnellstart unten deckt dieselben Schritte in verkürzter Form ab.
PowerShell:
$env:SEAL_TOKEN = "your-seal-token-here"
$env:SEAL_PROJECT = "nuget-demo-net7"
cd seal-security-nuget-demo-net7
# Restore (pulls from nuget.org and the Seal feed — see nuget.config)
dotnet restore
# Build and run
dotnet build
dotnet run
Öffnen Sie http://localhost:5000 — die App läuft mit verwundbaren Abhängigkeiten.
Geben Sie alice in das Namensfeld ein und klicken Sie auf Go. Sie sollten sehen: "Welcome, alice!"
Fügen Sie die folgende URL in das Namensfeld ein und klicken Sie auf Go:
https://raw.githubusercontent.com/seal-sec-demo-2/json-payload/main/payload.json
Ergebnis ohne Patch: Der Browser zeigt einen Fehler / Verbindungsabbruch — die App ist mit einer StackOverflowException in JsonSerializerInternalReader.CreateValueInternal abgestürzt. Der Prozess ist tot.
# (Optional — already done above) Restore dependencies first
dotnet restore
# Run Seal CLI to fix vulnerabilities
seal fix . --mode remote -v
# Restore again to pull sealed versions
dotnet restore
# Build and run the patched app
dotnet build
dotnet run
Die App verwendet nun gepatchte Versionen (Newtonsoft.Json 12.0.2-sp1, log4net 2.0.5-sp1).
Ergebnis mit Patch: Fügen Sie dieselbe Exploit-URL ein → die Seite zeigt "Blocked by Seal patch: MaxDepth of 64 has been exceeded." — das gepatchte Rekursionslimit von Newtonsoft.Json hat die tiefe Payload abgewiesen. Der Server läuft normal weiter.
dotnet list package
Sie sollten Pakete mit dem Suffix -sp1 sehen, das auf Seal-Security-Patches hinweist.
Der CLI-Schritt muss unmittelbar nach der Installation der Abhängigkeiten, aber vor dem endgültigen Build eingefügt werden.
# 1. Restore dependencies
dotnet restore
# 2. <--- Run Seal CLI Here
$env:SEAL_TOKEN = "your-seal-token-here"
$env:SEAL_PROJECT = "nuget-demo-net7"
seal fix . --mode remote -v
# 3. Restore again (to get sealed versions)
dotnet restore
# 4. Build
dotnet build
| Modus | Beschreibung |
|---|---|
all | Wendet automatisch alle verfügbaren Fixes an |
remote | Wendet nur die in der Seal-UI genehmigten Fixes an |
local | Wendet nur die in .seal-actions.yml definierten Fixes an |
Die .seal-actions.yml in diesem Repository listet bereits die drei versiegelten Overrides für den local-Modus auf, sodass seal fix . --mode local -v offline funktioniert (benötigt trotzdem ein Token für den Artefakt-Server).
nuget.config ist vorkonfiguriert, um Seal Security mit Umgebungsvariablen zu verwenden:
<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>
| Variable | Beschreibung |
|---|---|
SEAL_TOKEN | Ihr Seal-Security-Zugriffstoken |
SEAL_PROJECT | Projekt-ID (z. B. nuget-demo-net7) |
Die Seal-CLI benötigt ausgehendes HTTPS (TCP 443) zu:
cli.sealsecurity.io — Scan-/Fix-Konfigurationauthorization.sealsecurity.io — Token-Validierungnuget.sealsecurity.io — Downloads versiegelter .nupkg-Dateiend2zko6i8myndc4.cloudfront.net — CDN, das die tatsächlichen versiegelten Artefakte ausliefert (die .sealsecurity.io-Hostnamen leiten hierher weiter)api.nuget.org / Standard-Endpunkte von nuget.org — für nicht versiegelte AbhängigkeitenÜberprüfen Sie nach dem Öffnen der Firewall von PowerShell aus:
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
Alle sollten TcpTestSucceeded: True melden.
12.0.2-sp1 ist ein binärkompatibler Drop-in-Ersatz für 12.0.2.Pakete, die von dieser Demo verwendet werden:
| Paket | Verwundbare Version | Versiegelte Version | CVE | CVSS |
|---|
Weitere versiegelte NuGet-Pakete, die über den Seal-Feed verfügbar sind (nicht in dieser Demo, zur Referenz aufgelistet):
MIT-Lizenz - Einzelheiten finden Sie in der LICENSE-Datei.
| Element | Warum es wichtig ist |
|---|
global.json fixiert das SDK auf 7.0.x mit rollForward: latestFeature | Verhindert, dass Maschinen mit nebeneinander installiertem net8/net9 mitten in der Demo stillschweigend das SDK wechseln. |
System.Configuration.ConfigurationManager auf 7.0.0 festgelegt | Die kanonische net9-Demo verwendet 8.0.0, das nur auf net8 abzielt und unter net7 beim Restore fehlschlägt. 7.0.0 bietet dieselbe API-Oberfläche, die log4net benötigt. |
NU1701 in der csproj unterdrückt | log4net 2.0.5 weist ein veraltetes net4x-TFM aus, das .NET 7 zur Laufzeit akzeptiert, beim Restore aber eine Warnung erzeugt. Die Warnung ist rein kosmetisch; die Unterdrückung hält die Build-Ausgabe während der Demo sauber. |
| Seal-CLI v0.3.238 für Windows x64 | Letzte Version mit einer Windows-Binärdatei; für die NuGet-Sanierung voll funktionsfähig. Windows-Binärdateien wurden nach dieser Version eingestellt — schlagen Sie also keine neuere Version vor. |
| Newtonsoft.Json | 12.0.2 | 12.0.2-sp1 | CVE-2024-21907 | 7.5 HOCH |
| log4net | 2.0.5 | 2.0.5-sp1 | CVE-2018-1285 | 9.8 KRITISCH |
| Paket | Verwundbare Version | Versiegelte Version | CVE | CVSS |
|---|
| log4net | 2.0.0 | 2.0.0-sp1 | CVE-2018-1285 | 9.8 KRITISCH |
| System.Net.Http | 4.3.0 | 4.3.0-sp1 | CVE-2017-0249 | 7.3 HOCH |
| Snappier | 1.1.0 | 1.1.0-sp1 | CVE-2023-28638 | 7.0 HOCH |
| jQuery.Validation | 1.17.0 | 1.17.0-sp1 | CVE-2021-21252 | 7.5 HOCH |