
Kurze Einführung in die Analyse der RCE-Sicherheitslücke in React Server Components.
In den letzten Tagen wurde eine Deserialisierungs-RCE-Schwachstelle in React breit diskutiert. Die offizielle CVSS-Bewertung beträgt volle 10.0 Punkte, gleichauf mit dem damaligen Log4j. Kurz darauf verbreiteten sich Gerüchte, es handele sich um das Log4j des modernen Frontends, was bei vielen Entwicklern in Unternehmen Panik auslöste. So wachten alle auf und begannen, Dokumentationen zu durchforsten und Patches einzuspielen... Gleichzeitig gab es im Internet auch viele kritische Stimmen. Einige Tests zeigten, dass die Schwachstelle nicht so schwerwiegend ist wie behauptet; im Gegenteil, die Ausnutzung erfordert bestimmte Bedingungen. Daher beschloss ich, mir Zeit zu nehmen und diese Schwachstelle eingehend zu untersuchen.
react-server-dom-webpack < 19.2.0, react-server-dom-turbopack < 19.2.0Die Ursache dieser Schwachstelle ist wie folgt: In [email protected] ist die Schlüsselfunktion zur serverseitigen Verarbeitung von Server Actions requireModule (Pseudocode):
function requireModule(metadata) {
var moduleExports = __webpack_require__(metadata[0]);
// ...
return "*" === metadata[2]
? moduleExports
: "" === metadata[2]
? moduleExports.__esModule
? moduleExports.default
: moduleExports
: moduleExports[metadata[2]]; // ← 漏洞点
}
Der Kern der Schwachstelle liegt im Teil moduleExports[metadata[2]]. Dieser Teil validiert metadata[2] nicht, sodass ein Angreifer nicht nur auf die eigenen Exporteigenschaften des Moduls, sondern auch auf Eigenschaften der Prototyp-Kette (wie constructor, __proto__ usw.) zugreifen kann. Nachdem der Angreifer metadata[0] konstruiert hat (z.B. auf vm verweist), kann er erneut metadata[2] konstruieren, um gefährliche Methoden aus bestimmten Modulen zu exportieren, wie z.B. vm.runInThisContext, was zur Ausnutzung der Schwachstelle führt.
Bei meiner Analyse habe ich die von ejpir bereitgestellte Testumgebung und den Exploit referenziert und als Beispiel den Code Execution Gadget vm_runInThisContext analysiert. Der Ablauf ist wie folgt (Hinweis: In realen Umgebungen kann der Exploit-Prozess etwas abweichen!):
Senden Sie zunächst eine Anfrage mit dem Payload. Der Haltepunkt beim Abrufen der Anfrageposition ist wie folgt:


Anschließend erreicht das Programm die Position const formData = parseMultipart(buffer, boundaryMatch[1]); und springt in parseMultipart

parseMultipart extrahiert die Anforderungsdaten und gibt sie an formData zurück

Springen Sie in const actionFn = await decodeAction(formData, serverManifest); Stelle, an der die Schwachstelle auftritt

Springen Sie in loadServerReference


Als nächstes erreichen wir die Kerncode-Position der Schwachstelle requireModule. Springen Sie hinein


Es gibt den id-Wert mit # als Trennzeichen für die Modulmethode zurück und gibt den bound-Parameterwert als Methodenparameter zurück




Springen Sie in actionFn, um den endgültigen Payload auszuführen



Damit ist die Ausnutzung der Schwachstelle abgeschlossen!
Diese Schwachstelle ist ebenfalls auf eine unzureichende Eingabevalidierung zurückzuführen, ähnlich wie bei Log4j und Fastjson. Ich habe oben vm_runInThisContext getestet, aber tatsächlich sind mehrere Gadgets ausnutzbar, wie zum Beispiel:
vm#runInThisContextvm#runInNewContextchild_process#execSyncchild_process#execFileSyncchild_process#spawnSyncfs#readFileSyncfs#writeFileSync#constructor#__proto__#prototypeEin Angreifer kann diese Schwachstelle nutzen, um Folgendes zu erreichen:
vm#runInThisContext oder child_process#execSyncfs#readFileSync, fs#writeFileSync.bashrc, Überschreiben von Anwendungsdateien usw..env, private Schlüssel, Datenbank-Anmeldedaten usw.)Darauf basierend können die folgenden Verteidigungsmaßnahmen empfohlen werden:
Temporäre Verteidigung kann aus diesen Blickwinkeln erfolgen: Es können Regeln in der WAF konfiguriert werden, um diese gefährlichen Felder zu blockieren und so bösartige Angriffe rechtzeitig abzufangen. Außerdem kann ein solcher Filter in Nginx eingerichtet werden, wie folgt:
# Nginx 配置示例
location /formaction {
# 拦截包含危险模块引用的请求
if ($request_body ~* "(vm#|child_process#|fs#|module#)") {
return 403;
}
# 拦截原型链污染尝试
if ($request_body ~* "(#constructor|#__proto__|#prototype)") {
return 403;
}
}
Der Hersteller hat bereits ein Sicherheitsupdate veröffentlicht. Aktualisieren Sie umgehend auf eine sichere Version! :
# Upgrade react-server-dom-webpack
npm install react-server-dom-webpack@>=19.2.0
# Upgrade react-server-dom-turbopack
npm install react-server-dom-turbopack@>=19.2.0
# Next.js users
npm install next@>=15.0.5
Behobene Versionen:
react-server-dom-webpack: >= 19.2.0react-server-dom-turbopack: >= 19.2.0next.js: >= 15.0.5Bei der Analyse der oben genannten Schwachstelle habe ich mich auf die entsprechenden Exploits von whiteov3rflow bezogen und ein Tool zur Erkennung der Schwachstelle für die Testumgebung entwickelt, das ich im GitHub-Repository bereitgestellt habe.

Wer sich selbst testen möchte, kann es über diesen Link abrufen (Hinweis: Aufgrund der Testumgebung des ursprünglichen Autors ist es derzeit möglicherweise nur für die ursprüngliche Testumgebung geeignet; weitere Verbesserungen folgen. Bei Bedarf kann man es auch selbst anpassen...). Beachten Sie, dass eine legale Autorisierung erforderlich ist, nicht autorisierte Schäden sind untersagt!
Bis heute, dem 5. Dezember 2025, habe ich online gesehen, dass das "Gerücht" um diese Schwachstelle wie eine Achterbahn auf und ab geht, mal "Atombombe", mal "Wasserloch", und dann wieder "Atombombe"... Die zugehörigen Ausnutzungsmethoden sind noch zahlreicher. Nach derzeitigen Informationen scheint sich die "Atombombe" zu bestätigen, nur der Auswirkungsbereich ist geringer als bei Log4j. Aber unabhängig davon sollten alle Beteiligten so schnell wie möglich aktualisieren, um zukünftige Probleme zu vermeiden!!!
Außerdem ein Sicherheitshinweis an Entwickler: Vertraue niemals Benutzereingaben. Log4j, Fastjson und das aktuelle ReactRCE sind alle aufgrund dieses Punktes betroffen. Daher müssen bei der tatsächlichen Geschäftsentwicklung an gefährlichen Stellen unbedingt Sandboxen oder Whitelists verwendet werden, um strenge Überprüfungen durchzuführen und Tragödien zu vermeiden!!!
Aus Büchern Gelerntes wirkt oberflächlich; um die Sache wirklich zu verstehen, muss man vorsichtig handeln.