CVE-2025-55182 ist eine kritische Sicherheitslücke in React Server , die eine Remote-Code-Ausführung vor der Authentifizierung ermöglicht und einen CVSS-Score von 10,0 aufweist – die höchstmögliche Schweregradbewertung. Im Rahmen des OPSWAT Fellowship Program haben unsere Stipendiaten eine umfassende technische Analyse dieser Schwachstelle durchgeführt und dabei die Ursache im Deserialisierungs-Protokoll von React Flight, die gesamte Ausnutzungskette sowie die weitreichenden Auswirkungen auf das moderne Web-Ökosystem untersucht. In diesem Blogbeitrag stellen wir unsere Ergebnisse vor und geben praktische Empfehlungen für Sicherheitsverantwortliche.

React hat sich zu einer der weltweit am häufigsten eingesetzten Frontend-Bibliotheken entwickelt und bildet die Grundlage für einen erheblichen Teil moderner Web- und mobile . In Entwicklerumfragen von Stack Overflow rangiert React durchweg unter den führenden Web-Frameworks, wobei die Akzeptanz bei professionellen Entwicklern weltweit bei über 40 % liegt. Parallel zu diesem Wachstum führte das React-Team React Server (RSC) als Kernfunktion von React 19 ein – ein Paradigmenwechsel, der die Rendering-Logik vom Client auf den Server verlagert und so eine optimierte Leistung sowie eine engere Integration zwischen serverseitigem und clientseitigem Code ermöglicht.
Diese architektonische Weiterentwicklung führte jedoch zu einer kritischen neuen Angriffsfläche. Am 29. November 2025 meldete der Sicherheitsforscher Lachlan Davidson im Rahmen des Bug-Bounty-Programms von Meta eine Schwachstelle in der serverseitigen Deserialisierungslogik von React. Die Schwachstelle, die am 3. Dezember 2025 unter der Kennung CVE-2025-55182 öffentlich bekannt gegeben wurde, ermöglicht die nicht authentifizierte Remote-Codeausführung durch eine einzige manipulierte HTTP-Anfrage. Die als CWE-502 (Deserialisierung nicht vertrauenswürdiger Daten) klassifizierte Schwachstelle erfordert keine Authentifizierung, keine Benutzerinteraktion und keine spezielle Anwendungskonfiguration – eine standardmäßige „create-next-app“-Bereitstellung für die Produktion ist sofort ausnutzbar.

Die Auswirkungen waren unmittelbar und gravierend. Innerhalb von 48 Stunden nach der Veröffentlichung wurden in der Praxis bereits mehrere Ausnutzungskampagnen beobachtet. Nach Angaben der Shadowserver Foundation wurden über 77.000 öffentliche IP-Adressen als potenziell anfällig identifiziert. Die Telemetriedaten von Cloudflare verzeichneten in der Woche nach der Bekanntgabe mehr als 582 Millionen Ausnutzungsversuche, wobei die Angriffsintensität im Durchschnitt bei über 3.500 eindeutigen Quell-IPs pro Stunde lag und Spitzenwerte von 16.585 gleichzeitig angreifenden IPs erreichte. Wiz Research berichtete, dass 39 % der Cloud-Umgebungen anfällige Instanzen enthielten. Die CISA nahm die Schwachstelle am 5. Dezember 2025 in ihren Katalog „Known Exploited Vulnerabilities“ (KEV) auf.
Die Angreifer agierten mit bemerkenswerter Geschwindigkeit und Vielfältigkeit. Trend Micro dokumentierte mehrere Kampagnen – darunter die Botnet-Kampagnen „Emerald“ und „Nuts“ –, bei denen Cobalt-Strike-Beacons, Sliver-Implantate, der Nezha-Überwachungsagent, Fast-Reverse-Proxy-Tunnel (FRP) sowie eine neuartige „Secret-Hunter“-Nutzlast zum Einsatz kamen, die Open-Source-Tools zum Sammeln von Anmeldedaten wie TruffleHog und Gitleaks missbrauchte. Threat Intelligence Google Threat Intelligence identifizierte verschiedene mit China in Verbindung stehende Bedrohungscluster (UNC6600, UNC6586, UNC6588, UNC6603), die spezialisierte Tools einsetzten – darunter den MINOCAT-Tunneler, den SNOWLIGHT-Downloader, die COMPOOD-Backdoor und die HISONIC-Backdoor –, sowie Akteure mit Verbindungen zum Iran und finanziell motivierte Gruppen, die Kampagnen zum Schürfen von Kryptowährungen durchführten. AWS dokumentierte bereits am 4. Dezember, dass Gruppen mit Verbindungen zu China mit Exploit-Code experimentierten, noch bevor ein vollständiger Proof-of-Concept-Code öffentlich verfügbar war.
Über React Server
React ist eine JavaScript-Bibliothek zur Erstellung von Benutzeroberflächen, die von Meta und einer breiten Open-Source-Community gepflegt wird. React Server (RSC), die mit React 19 eingeführt wurden, stellen eine grundlegende Veränderung in der Art und Weise dar, wie React-Anwendungen das Rendering handhaben. Im Gegensatz zu herkömmlichen Client-Komponenten, die vollständig im Browser ausgeführt werden, werden Server-Komponenten auf dem Server ausgeführt und erzeugen eine serialisierte Darstellung der Benutzeroberfläche, die an den Client gestreamt wird. Dieses Design reduziert die Menge an JavaScript, die an den Browser gesendet wird, verbessert die Metriken zur Interaktionszeit und ermöglicht den direkten Zugriff auf serverseitige Ressourcen wie Datenbanken und Dateisysteme.

RSC nutzt ein benutzerdefiniertes Serialisierungs-Protokoll namens „Flight“, um Daten zwischen Client und Server zu kodieren und zu übertragen. Wenn ein Client eine Server (früher als Server bezeichnet) aufruft, verpackt der Browser die Funktionsargumente mithilfe des Flight-Formats in eine strukturierte HTTP-Anfrage. Der Server deserialisiert diese Nutzlast, führt die angeforderte Funktion aus und überträgt das Ergebnis zurück an den Client. Diese enge Kopplung zwischen Client und Server (die architektonisch zwar elegant ist) bedeutet, dass jeder Fehler in der Deserialisierungslogik unmittelbare und katastrophale Folgen haben kann, wie CVE-2025-55182 zeigt.
Die Sicherheitslücke betrifft nicht nur React selbst, sondern das gesamte Ökosystem der darauf aufbauenden Frameworks. Next.js (für das eine separate Sicherheitsempfehlung, CVE-2025-66478, herausgegeben wurde, die später als Duplikat zurückgewiesen wurde), React Router, Waku, das RSC-Plugin von Parcel, das RSC-Plugin von Vite und RedwoodSDK sind alle betroffen. Selbst Anwendungen, die Server nicht explizit definieren, können anfällig sein, wenn die RSC-Unterstützung im Framework aktiviert ist.
Technischer Hintergrund
Bevor wir uns mit der Sicherheitslücke befassen, sei auf drei grundlegende Konzepte hingewiesen, die der Exploit-Kette zugrunde liegen: das „await“-Verhalten von JavaScript bei „thenable“-Objekten, das Durchlaufen der Prototyp-Kette und das chunk-basierte Datenmodell des React Flight-Protokolls.
„await“ und „Thenable“-Objekte in JavaScript
Der `await`-Operator unterbricht die Ausführung einer asynchronen Funktion, bis der erwartete Ausdruck aufgelöst ist. Wenn `await` auf ein natives Promise trifft, wartet es auf dessen Auflösung und gibt den erfüllten Wert zurück. `await` benötigt jedoch kein natives Promise – jedes Objekt mit einer `.then()` -Methode, das als „thenable“ bezeichnet wird, wird als Promise-ähnliches Konstrukt behandelt.
Wenn „await“ auf ein „thenable“ trifft, ruft es die Methode .then() des Objekts auf und übergibt dabei die vom System bereitgestellten Callbacks „resolve“ und „reject“. Der an „resolve“ übergebene Wert wird zum Ergebnis des „await“-Ausdrucks. Entscheidend ist, dass, wenn der aufgelöste Wert selbst ein Thenable ist, die .then()-Methode dieses verschachtelten Objekts rekursiv aufgerufen wird, bis ein primitiver Wert oder ein abgewickeltes Promise erreicht wird. Dieses rekursive Auflösungsverhalten ist zentral für die Ausnutzung von CVE-2025-55182.
Prototyp der Kettendurchquerung
Jedes JavaScript-Objekt unterhält eine interne Verknüpfung zu seinem Prototyp, auf die über die Eigenschaft __proto__ zugegriffen werden kann. Wenn auf eine Eigenschaft eines Objekts zugegriffen wird, überprüft die JavaScript-Engine zunächst die eigenen Eigenschaften des Objekts. Wird die Eigenschaft nicht gefunden, durchläuft die Engine die Prototypkette – wobei sie jede __proto__-Verknüpfung nach oben abarbeitet –, bis die Eigenschaft gefunden wird oder die Kette bei „undefined“ endet.
Ein Angreifer kann diesen Vererbungsmechanismus ausnutzen, um auf Eigenschaften zuzugreifen, die über den beabsichtigten Geltungsbereich eines Objekts hinausgehen. Indem er __proto__ in den Zugriffspfaden auf Eigenschaften einbindet, kann ein Angreifer interne Methoden und Konstruktoren erreichen, die die Anwendung niemals offenlegen wollte. In JavaScript liefert der Ausdruck `obj.__proto__.constructor.constructor` den globalen Konstruktor `Function`, der beliebige Funktionen aus einer Zeichenkette erstellen und ausführen kann.
Das React Flight-Protokoll und das chunkbasierte Datenmodell
When a client invokes a Server Function, the browser sends an HTTP POST request with a multipart/form-data body. Each form field contains a numbered “chunk” of serialized data. The Flight protocol uses special string prefixes to encode data types: $<id> references the resolved value of another chunk, $@<id> references the raw chunk object itself, $W<id> represents a Set, $K<id> represents FormData, and $B<id> triggers the blob handler.
Betrachten wir eine Server , die wie folgt definiert ist:

Die entsprechende HTTP-Anfrage enthält mehrere Formularfelder, die jeweils aus einem Schlüssel und einem Wert bestehen: Feld 0 enthält das Argument-Array mit Referenzen wie „$W1“ und „$K2“, während die Felder 1 und 2_* die Daten enthalten, auf die diese Referenzen verweisen. Der Server verarbeitet jedes Feld bei seinem Eintreffen und speichert Zwischenergebnisse in Objekten, die als „Chunks“ bezeichnet werden.

Ein Chunk ist ein Thenable-Objekt mit vier Schlüssel-Eigenschaften: status (der Auflösungsstatus), value (die gespeicherten Daten), reason (Fehlerinformationen) und _response (ein Rückverweis auf das übergeordnete Antwortobjekt). Wenn der Server auf „await chunk“ stößt, wird die .then() -Methode des Chunks aufgerufen. Wenn der Status des Chunks INITIALIZED ist, erhält der Resolve-Callback chunk.value. Wenn der Status PENDING, BLOCKED oder CYCLIC ist, werden die Callbacks zur späteren Ausführung in die Warteschlange gestellt.

Chunk 0 stellt in der Regel das Argument-Array für die aufgerufene Server dar. Nachdem alle Formularfelder empfangen und alle internen Verweise aufgelöst wurden, enthält `chunk_0.value` das vollständig zusammengestellte Argument-Array, das anschließend an die Zielfunktion übergeben wird.
End-to-End-Anforderungsbearbeitung (Next.js → Deserialisierung von React Flight)
Im Folgenden wird beschrieben, wie Next.js unter normalen Bedingungen eine eingehende Server verarbeitet – von der HTTP-Ebene bis hin zur React-Flight-Deserialisierungs-Engine.

Funktion handleAction() – Next.js
Wenn eine Server aufgerufen wird, gelangt die Anfrage in die Funktion `handleAction`. Diese Funktion validiert Metadaten, überprüft Header und CSRF-Token und stellt sicher, dass es sich bei der Anfrage um eine gültige Abrufaktion handelt. Anschließend wird ein Stream namens „busboyStream“ erstellt, um den Multipart-Formulartext zu parsen. Die Funktion „decodeReplyFromBusboy“ bindet Event-Emitter an diesen Stream und löst die Deserialisierungs-Handler-Funktionen Serveraus, sobald Rohdaten empfangen werden. Der Rückgabewert von „decodeReplyFromBusboy“ ist „chunk_0“; der „await“-Operator löst diesen auf und übergibt den zusammengesetzten Wert an die aufgerufene Server .

Die Funktion `getChunk` gibt den Chunk zurück, der einer bestimmten ID entspricht. Falls dieser Chunk noch nicht existiert, wird entweder ein `ResolvedModelChunk` erstellt (sofern bereits Daten in `response._formData` vorhanden sind) oder ein `PendingChunk` (sofern für diese ID noch keine Daten eingegangen sind).

Wenn `decodeReplyFromBusboy` `chunk_0` zurückgibt, befindet sich der Chunk noch im Status „PENDING“. Der `await`-Operator ruft `chunk_0.then()` auf und speichert die Callbacks für „resolve“ und „reject“ vorübergehend in `chunk_0.value` und `chunk_0.reason`. Diese Callbacks werden von der Funktion `wakeChunk` reaktiviert, sobald die Referenzauflösung abgeschlossen ist.

Deserialisierungsvorgang – React Server
Wenn busboyStream ein vollständiges Rohdatenfeld empfängt, löst es den Ereignis-Emitter „field“ aus, ruft die Funktion „resolveField“ auf und leitet die Deserialisierung ein – dabei werden die Rohdaten in vollständig aufgebaute JavaScript-Objekte umgewandelt. Die folgenden Funktionen steuern diesen Prozess.
resolveField(Antwort, Schlüssel, Wert)

Der Schlüssel und der Wert werden an `response._formData` angehängt. Die Funktion ruft dann den Chunk ab, der der ID entspricht, die mit dem Schlüssel übereinstimmt. Falls dieser Chunk bereits vorhanden ist, wird `resolveModelChunk` aufgerufen, um ihn neu zu erstellen. Diese verzögerte Auflösung ist notwendig, da ein Wert Verweise auf Felder enthalten kann, deren Rohdaten noch nicht eingetroffen sind; in diesem Fall Server der React Server einen `PendingChunk` mit benutzerdefinierten Callbacks für `resolve` und `reject`, um diese Verweise später zu verarbeiten.
resolveModelChunk(Chunk, Wert, ID)

resolveModelChunk erstellt einen ResolvedModelChunk mit dem Status RESOLVED_MODEL und fügt die Rohdaten ein. Anschließend rekonstruiert es den Chunk über initializeModelChunk und ruft wakeChunk auf, um alle in der Warteschlange befindlichen Resolve- und Reject-Callbacks auszulösen, wodurch die Auflösung des Objekts oder der Referenz abgeschlossen wird.
initializeModelChunk(chunk)

initializeModelChunk versetzt den Zustand des Chunks in den Modus CYCLIC – was darauf hinweist, dass die Referenzauflösung gerade läuft – und beginnt mit der Deserialisierung. Es erstellt mithilfe von JSON.parse ein rohes JavaScript-Objekt aus chunk.value und übergibt dieses Objekt anschließend an die Funktion reviveModel.
reviveModel(Antwort, übergeordnetesObjekt, übergeordneterSchlüssel, Wert, Referenz)

reviveModel verarbeitet jede Komponente innerhalb des analysierten Objekts rekursiv. Wenn es auf einen String-Wert stößt, ruft es parseModelString auf, um diesen zu verarbeiten.
parseModelString(response, obj, key, value, reference)

parseModelString verarbeitet die Zeichenfolge anhand des Präfixes, um verschiedene kodierte Typen zu behandeln. Bei Referenzen, die mit einem $ beginnen, wird die Funktion getOutlinedModel aufgerufen, um die chunkübergreifende Referenz aufzulösen.
getOutlinedModel(response, reference, parentObject, key, map)

getOutlinedModel teilt die Referenz am Trennzeichen „:“ auf, um einen Pfad für den Zugriff auf die Eigenschaft zu bilden, und durchläuft diesen Pfad dann auf dem Ziel-Chunk-Objekt, um den referenzierten Wert zurückzugeben. Wie in der nachstehenden Schwachstellenanalyse näher erläutert wird, ist das Fehlen einer Validierung dieser Eigenschaftsnamen genau der Punkt, an dem die Schwachstelle liegt.
Schwachstellenanalyse
Grundursache
CVE-2025-55182 originates from insufficient input validation in the getOutlinedModel() function within React’s server-side Flight reply handler (ReactFlightReplyServer.js). When a chunk reference includes a property path - such as $<id>:<prop1>:<prop2> - the function resolves it by traversing the specified properties on the target chunk object, computing the result as chunk[prop1][prop2].

Der entscheidende Schwachpunkt besteht darin, dass diese Eigenschaftsnamen niemals überprüft werden. Der Server überprüft nicht, ob es sich bei den angeforderten Eigenschaften um eigene Eigenschaften des Objekts oder um geerbte Prototyp-Eigenschaften handelt. Ein Angreifer kann daher __proto__ in den Eigenschaftspfad einfügen, um die Prototyp-Kette zu durchlaufen und interne Methoden zu erreichen, auf die über benutzergesteuerte Eingaben niemals zugegriffen werden sollte. Beispielsweise wird die Referenz $1:__proto__:then zu Chunk.prototype.then aufgelöst – eine Funktion, die der Angreifer dann mit kontrollierten Argumenten aufrufen kann.

Anfälliger Code
Die Angriffskette nutzt zwei unterschiedliche Codepfade in der „Flight“-Deserialisierungslogik von React aus.
Der erste ist `Chunk.prototype.then`, der das Verhalten von Chunks als Thenables regelt. Wenn `await` auf einen Chunk im Zustand `INITIALIZED` angewendet wird, wird `resolve(chunk.value)` aufgerufen. Ist `chunk.value` selbst ein Thenable (ein Objekt mit einer `.then()` -Methode), ruft der `await`-Operator rekursiv `chunk.value.then()` auf. Diese rekursive Auflösung ist der Mechanismus, über den ein Angreifer die Ausführung auf eine beliebige Funktion umleitet.
Der zweite ist der $B-Präfix-Handler (Blob) innerhalb von parseModelString():

Im Fall $B ruft die Funktion `response._formData.get(response._prefix + id)` auf. Sowohl `_formData.get` als auch `_prefix` sind Eigenschaften des Objekts `_response`, das im Chunk gespeichert ist. Durch die Manipulation dieser Eigenschaften mittels Durchlaufen der Prototypkette kann ein Angreifer diesen Aufruf so umleiten, dass der globale Konstruktor `Function` mit beliebigem Code als Argument aufgerufen wird.
Ausbeutung
Through prototype chain traversal, an attacker reaches the global Function constructor via the path <any_object>.constructor.constructor. Because Chunk.prototype.then is a function, the path $1:constructor:constructor resolves to the global Function constructor, which accepts a string and returns a callable function containing that code.

Um die potenziellen Auswirkungen in der Praxis zu veranschaulichen, haben unsere Stipendiaten eine Proof-of-Concept-Nutzlast entwickelt, die mit den unabhängig dokumentierten Analysen mehrerer Sicherheitsforschungsteams übereinstimmt. Der Exploit funktioniert in zwei Schritten:
Schritt 1 – Erstellen Sie den Scheinchunk:
The object delivered in field 0 acts as a fake chunk. Its then property is set to Chunk.prototype.then via the reference path $1:__proto__:then, allowing the Flight deserialization engine to invoke prototype-level behavior on this attacker-constructed object. The _response._formData.get property is pointed at the global Function constructor via $1:constructor:constructor, and _response._prefix is set to the malicious JavaScript code. The value field contains the string {"then": "$B0"}, instructing the blob handler to invoke itself on the same chunk when resolved. The status field is set to resolved_model so that initializeModelChunk is triggered when .then() is called, causing value to be parsed and the blob handler to fire.
Da Feld 1 zu diesem Zeitpunkt noch nicht empfangen wurde, erstellt der Server Callbacks für „resolve“ und „reject“, um die ausstehende Referenz zu verarbeiten.
Phase 2 – Lösung des Auslösers:
Sobald Feld 1 – das „$@0“ enthält, einen Rohverweis auf Chunk 0 – übermittelt wird, wird der ausstehende Chunk aufgelöst und verweist direkt auf den gefälschten Chunk. Dies löst wakeChunk aus, das die in der Warteschlange befindlichen Callbacks verarbeitet und während der Referenzauflösung die Durchquerung der Prototypkette initiiert. Sobald der gefälschte Chunk vollständig aufgelöst ist, wird wakeChunk erneut aufgerufen. Da der Resolve-Callback für den gefälschten Chunk die implizite Node.js-Auflösungsfunktion ist, ruft er die .then()-Methode des Chunks auf und löst dessen Wert auf – wodurch letztendlich der injizierte Schadcode über den Function-Konstruktor erstellt und ausgeführt wird.
Für den vollständigen Exploit ist lediglich eine einzige HTTP-Anfrage erforderlich:

Replacing {{COMMAND}} with any JavaScript code executes it on the server. The reason: -1 field prevents a toString() error during processing. The Next-Action header may contain any arbitrary value - even x - because the vulnerable deserialization occurs before the server validates the requested Server Function. This is what makes the vulnerability pre-authentication: the payload is processed during the deserialization phase, before any application-level authentication or authorization logic is reached.
Bei erfolgreicher Ausnutzung erlangt ein Angreifer vollständigen Zugriff auf den Node.js-Ausführungskontext auf dem Server, einschließlich Zugriff auf `child_process` zur Ausführung von Shell-Befehlen, auf Umgebungsvariablen mit Datenbank-Anmeldedaten und API , auf das lokale Dateisystem sowie auf Endpunkte für Cloud-Metadaten, die eine laterale Bewegung ermöglichen.
Konzeptnachweis
Unsere Forscher konnten die Sicherheitslücke in einer kontrollierten Laborumgebung mit einer Standard-Next.js-Anwendung reproduzieren, die mit „create-next-app“ generiert und für den Produktionsbetrieb bereitgestellt wurde – ohne Änderungen an der Standardkonfiguration. Die Reproduktion bestätigte, dass die oben beschriebene, auf eine einzige Anfrage basierende Exploit-Payload eine zuverlässige Remote-Code-Ausführung ermöglicht.


Die kontrollierte Demonstration zeigte, dass ein Angreifer mit Netzwerkzugriff auf einen anfälligen Next.js-Server beliebigen Node.js-Code ausführen kann – einschließlich der Erstellung einer Reverse-Shell über `child_process.exec()`, des Auslesens von Umgebungsvariablen und des Zugriffs auf das lokale Dateisystem –, ohne Anmeldedaten anzugeben oder Authentifizierungsprüfungen auf Anwendungsebene auszulösen. Der beliebige Wert, der für den Next-Action-Header akzeptiert wird, bestätigt zudem den Charakter der Schwachstelle als Vor-Authentifizierungs-Problem: Der Server verarbeitet und deserialisiert die Nutzlast, bevor er eine Aktionssuche oder Autorisierungsprüfung durchführt.
Milderung
Das React-Team veröffentlichte am 3. Dezember 2025 Patches – noch am selben Tag, an dem die Sicherheitslücke öffentlich bekannt gegeben wurde. Die behobenen Versionen sind als React 19.0.1, 19.1.2 und 19.2.1 verfügbar. Der Patch fügt eine strenge Eigenschaftsvalidierung in getOutlinedModel() und reviveModel() hinzu und blockiert explizit die Auflösung vererbter Prototyp-Eigenschaften – einschließlich __proto__, constructor und prototype – aus benutzergesteuerten Referenzpfaden in Flight-Nutzdaten.
Unternehmen sollten unverzüglich folgende Maßnahmen ergreifen:
- Aktualisieren Sie die React-Pakete auf eine gepatchte Version (19.0.1, 19.1.2 oder 19.2.1), indem Sie je nach Bedarf den Befehl „npm install react-server-dom-webpack@latest“, „react-server-dom-parcel@latest“ oder „react-server-dom-turbopack@latest“ ausführen.
- Framework-Abhängigkeiten aktualisieren – Next.js, React Router, Waku und andere betroffene Frameworks haben entsprechende Patches veröffentlicht. Informationen zu versionsspezifischen Upgrade-Pfaden finden Sie in der Empfehlung des React-Teams.
- Verlassen Sie sich nicht ausschließlich auf die Abhilfemaßnahmen der Hosting-Anbieter – zwar haben Anbieter wie Vercel nach Bekanntwerden der Sicherheitslücke vorübergehende WAF-Regeln implementiert, doch handelt es sich dabei um Notlösungen, die das Patchen der zugrunde liegenden Pakete nicht ersetzen können.
- Überprüfen Sie die Serverprotokolle auf POST-Anfragen mit Next-Action-Headern und „multipart/form-data“-Inhalten, die die Muster $@ oder __proto__ enthalten, und achten Sie in den Anwendungsprotokollen auf unerwartete Aufrufe von „child_process“ oder „execSync“.
Risikominderung mit OPSWAT
OPSWAT , eine proprietäre Technologie der MetaDefender™-Plattform, bietet die erforderliche Transparenz und Kontrolle, um sich gegen Schwachstellen wie CVE-2025-55182 zu schützen. Da diese Schwachstelle in Open-Source-npm-Paketen (react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack) liegt, müssen Unternehmen zunächst eine vollständige Bestandsaufnahme erstellen, wo diese Komponenten in ihrer Infrastruktur eingesetzt werden, bevor eine wirksame Behebung möglich ist.

OPSWAT erstellt eine umfassende Bestandsaufnahme aller verwendeten Softwarekomponenten, Bibliotheken, Container und Abhängigkeiten. Beim Scannen von Anwendungen oder Container-Images, die anfällige React-Pakete enthalten, stuft das System CVE-2025-55182 automatisch als „kritisch“ ein und gibt Hinweise auf verfügbare behobene Versionen, sodass Sicherheitsteams Maßnahmen priorisieren und Abhilfemaßnahmen ergreifen können, bevor die Schwachstelle ausgenutzt wird.
OPSWAT ist sowohl in MetaDefender – zum Scannen einzelner Anwendungen und Container-Images – als auch in MetaDefender Software Chain™ – für Transparenz auf Pipeline-Ebene über den gesamten Entwicklungszyklus hinweg – verfügbar. Zusammen ermöglichen sie Sicherheitsteams:
- Schwachstellenanfällige Komponenten schnell ausfindig machen – Sofort feststellen, welche Anwendungen und Container die betroffenen „react-server-dom-*“-Pakete in anfälligen Versionen enthalten, um sicherzustellen, dass keine Bereitstellung übersehen wird.
- Sorgen Sie für proaktives Patchen – Überwachen Sie Open-Source-Abhängigkeiten kontinuierlich, um veraltete oder unsichere Pakete zu erkennen, sobald neue Sicherheitshinweise veröffentlicht werden, und verringern Sie so das Sicherheitsrisiko.
- Gewährleistung der Compliance und Transparenz in der Lieferkette – Erfüllen Sie gesetzliche Anforderungen, indem Sie ein nachprüfbares Verzeichnis aller Softwarekomponenten und ihrer bekannten Schwachstellen führen.
Die Geschwindigkeit und das Ausmaß der Ausnutzung der Sicherheitslücke CVE-2025-55182 – allein in der ersten Woche gab es über 582 Millionen Angriffsversuche – machen deutlich, warum reaktives Patchen nicht mehr ausreicht. Zu wissen, welche Software man einsetzt, wo sie läuft und wann sie angreifbar wird, ist die Grundlage einer proaktiven Verteidigung. Diese Transparenz beginnt mit der SBOM.
Referenzen
- React-Team – Kritische Sicherheitslücke in React Server
- Wiz Research – React2Shell (CVE-2025-55182): Kritische Sicherheitslücke in React
- Trend Micro – CVE-2025-55182: Analyse von React2Shell, PoC-Chaos und Ausnutzung in freier Wildbahn
- Akamai – CVE-2025-55182: Remote-Code-Ausführung durch Deserialisierung in React- und Next.js Server
- Google Cloud Mehrere Angreifer nutzen React2Shell (CVE-2025-55182) aus
- AWS – Cyber-Bedrohungsgruppen mit Verbindungen zu China nutzen React2Shell rasch aus
- NVD – CVE-2025-55182
- React Server verstehen – Tony Alicea
- MDN Web Docs – Der `await`-Operator
- React-Quellcode – ReactFlightReplyServer.js (v19.0.0)
- Next.js-Quellcode – action-handler.ts (v16.0.0)
