{"uuid": "40f9bdf1-bf60-4338-864b-8a3ae0bb567b", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "2a075640-a300-48a4-bb44-bc6130783b9b", "vulnerability": "CVE-2025-46568", "type": "published-proof-of-concept", "source": "https://t.me/wr3dmast3rvs/57", "content": "\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432 \u043b\u0430\u0439\u0432-\u0440\u0435\u0436\u0438\u043c\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u043a\u043e\u0434\u0430 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 SSRF \u0432 Stirling-PDF (CVE-2025-46568): \u0447\u0442\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 WeasyPrint. \u041d\u0435 \u0431\u044b\u043b\u043e \u043e\u0441\u043e\u0431\u043e \u0432\u0430\u0436\u043d\u043e, \u043a\u0430\u043a\u0430\u044f CVE. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u043f\u043e\u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430 \ud83c\udfc3\u200d\u2642\ufe0f\n\nStirling-PDF \u2014 \u044d\u0442\u043e \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 PDF (\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435). \u0412 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0434\u043e 0.45.0 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 SSRF-\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u043c\u0443 \u0447\u0438\u0442\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 HTML \u0432 WeasyPrint \u26a0\ufe0f\n\n\u0421\u0443\u0442\u044c \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438:\n1. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442 HTML-\u043a\u043e\u043d\u0442\u0435\u043d\u0442, \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e URL;\n2. WeasyPrint \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0433 , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b (file://) \u0432 PDF \u043a\u0430\u043a \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\n\n\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u2014 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0430\u043d\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u0438 HTML \u043f\u0435\u0440\u0435\u0434 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u043e\u043c:\n// 1. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 URL \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0445\u0435\u043c\u0443 http/https\nif (!URL.matches(\"^https?://.*\") || !GeneralUtils.isValidURL(URL)) {\n    throw new IllegalArgumentException(\"Invalid URL format provided.\");\n}\n\n// 2. \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 URL \u0432 WeasyPrint \u0431\u0435\u0437 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 HTML\nList command = new ArrayList&lt;&gt;();\ncommand.add(runtimePathConfig.getWeasyPrintPath());\ncommand.add(URL);  // HTML \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \ncommand.add(\"--pdf-forms\");\ncommand.add(tempOutputFile.toString());\n\n// 3. WeasyPrint \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 PDF \u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438\nProcessExecutor.runCommandWithOutputHandling(command);\n\nPoC:\n\n\n\n    \n\n\n\n\n\u0415\u0441\u043b\u0438 \u0412\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430 \u0438\u043b\u0438 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f, \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043a Discord \u0438 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0438! \ud83d\udd0d", "creation_timestamp": "2025-06-21T19:52:27.000000Z"}