
PoC — PasteGuard में कॉन्फ़िगर किए गए प्रोवाइडर API कुंजियों का क्रॉस-ओरिजिन प्रॉक्सी दुरुपयोग (GHSA-q94x-p9rc-q89f, CVE-2026-86998, CVSS 7.6)।
CVE स्थिति: अनुरोधित, असाइनमेंट लंबित। यह निष्कर्ष GHSA-q94x-p9rc-q89f के रूप में प्रकाशित किया गया है। CVE असाइनमेंट पर इस रिपॉज़िटरी का नाम बदलकर
CVE-YYYY-NNNNN-pasteguard-PoCकर दिया जाएगा और इस बैनर को CVE लिंक से बदल दिया जाएगा।
| शोधकर्ता | Dostxodjayev Abdullox (@squeeze440) |
| सलाह | GHSA-q94x-p9rc-q89f |
| CVSS 3.1 | 7.6 (उच्च) |
| कमज़ोरी | CWE-352, CWE-942 |
सारांश: PasteGuard 0.9.1 में LLM-प्रॉक्सी रूट्स पर CORS/CSRF सुरक्षा का अभाव एक रिमोट हमलावर (ऑपरेटर के ब्राउज़र द्वारा देखी जाने वाली कोई भी वेबसाइट, या लोकल नेटवर्क पर कोई भी होस्ट) को PasteGuard की सर्वर-साइड फ़ॉलबैक API कुंजी का उपयोग करके ऑपरेटर के कॉन्फ़िगर किए गए OpenAI/Anthropic API पर प्रमाणित अनुरोध ट्रिगर करने, और प्रतिक्रिया पढ़ने की अनुमति देता है, /openai/v1/chat/completions (और सहोदर /anthropic/v1/messages) पर क्रॉस-ओरिजिन fetch() के माध्यम से।
उत्पाद: PasteGuard (github.com/sgasser/pasteguard)
परीक्षित संस्करण: कमिट 100718191499c52934f3b2ccca72ca16373fb765 (2026-07-30), package.json संस्करण 0.9.1
अनुमानित CVSS v3.1: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:H — 7.6 (उच्च)
UI:R — ऑपरेटर का ब्राउज़र PasteGuard के चलने के दौरान एक पेज (कोई भी पेज, किसी भी साइट पर) खोलना आवश्यक है; इसके अलावा कोई अन्य इंटरैक्शन आवश्यक नहीं है।C:L / I:L — हमलावर की अपनी JS केवल अपने ही हमलावर-चयनित प्रॉम्प्ट की प्रतिक्रिया पढ़ती है (ऑपरेटर की पिछली बातचीत/डैशबोर्ड डेटा नहीं, जो सही ढंग से CORS से बाहर रखा गया है), लेकिन यह अभी भी एक लाइव फंडेड अकाउंट की पुष्टि/उपयोग करता है और ऑपरेटर की पहचान के तहत अकाउंट के उपयोग/ऑडिट ट्रेल को दूषित करता है।A:H — यथार्थवादी, असीमित प्रभाव: एक हमलावर पेज इस अनुरोध को अनिश्चित काल तक लूप कर सकता है, जिससे ऑपरेटर के प्रोवाइडर अकाउंट/कोटा के विरुद्ध वास्तविक बिल किया गया उपयोग होता है (वित्तीय नुकसान, संभावित रेट-लिमिट समाप्ति या प्रोवाइडर-साइड दुरुपयोग फ़्लैग) और रास्ते में कोई रेट लिमिटिंग या ओरिजिन जाँच नहीं है।S:U — प्रभाव उसी ट्रस्ट बाउंड्री के भीतर रहता है (प्रॉक्सी का अपना कॉन्फ़िगर किया गया क्रेडेंशियल ही उपयोग किया जाता है); कोई अलग सुरक्षा प्राधिकरण पार नहीं होता।विवरण:
PasteGuard की HTTP लेयर डैशबोर्ड को छोड़कर हर रूट पर एक अनुमतिवादी, वाइल्डकार्ड CORS नीति लागू करती है:
src/index.ts:40-45 — const corsMiddleware = cors(); (बिना विकल्पों के Hono का cors() डिफ़ॉल्ट रूप से Access-Control-Allow-Origin: * देता है) को app.use("*", ...) के माध्यम से सब कुछ पर लागू किया जाता है, केवल /dashboard और /dashboard/* के लिए स्पष्ट छूट के साथ। ठीक ऊपर की टिप्पणी (src/index.ts:34-39) दिखाती है कि लेखक ने डैशबोर्ड CORS एक्सपोज़र के बारे में सावधानी से सोचा था लेकिन उसके नीचे के प्रॉक्सी रूट्स तक वही तर्क नहीं बढ़ाया।src/config.ts:153 — host: z.string().default("0.0.0.0"), config.example.yaml:13 में लाइव पुष्टि की गई। प्रॉक्सी डिफ़ॉल्ट रूप से सभी इंटरफ़ेस पर सुनता है, केवल लूपबैक पर नहीं, इसलिए यह LAN से भी पहुँच योग्य है, केवल ऑपरेटर के अपने ब्राउज़र से ही नहीं।src/providers/openai/client.ts:48-53:
// Use client's auth header if provided, otherwise fall back to config
if (authHeader) {
headers.Authorization = authHeader;
} else if (config.api_key) {
headers.Authorization = `Bearer ${config.api_key}`;
}
यदि आने वाले अनुरोध में कोई Authorization हेडर नहीं होता है, तो PasteGuard चुपचाप अपनी सर्वर-होल्ड providers.openai.api_key को आउटबाउंड अनुरोध में संलग्न कर देता है। config.example.yaml:22-24 इसे "Apps & APIs" उपयोग केस के लिए एक जानबूझकर सुविधा ("Optional fallback if client doesn't send auth header") के रूप में प्रलेखित करता है।src/providers/anthropic/client.ts:37-61 /anthropic/v1/messages के लिए समान फ़ॉलबैक पैटर्न लागू करता है (x-api-key/Authorization का config.api_key पर फ़ॉलबैक) — समान मूल कारण के सहोदर उदाहरण के रूप में पुष्टि की गई, स्वतंत्र रूप से एंड-टू-एंड पुनः सत्यापित नहीं (नीचे PoC दायरा देखें)।चूँकि वाइल्डकार्ड CORS नीति उन रूट्स के सामने बैठती है जो इस फ़ॉलबैक क्रेडेंशियल को रखते हैं, कोई भी ओरिजिन (1) ब्राउज़र को बिना Authorization हेडर के अनुरोध भेजने के लिए प्रेरित कर सकता है, जिससे सर्वर अपनी वास्तविक API कुंजी संलग्न कर देता है, और (2) JSON प्रतिक्रिया पढ़ सकता है, क्योंकि Access-Control-Allow-Origin: * मौजूद है। इन रूट्स की रक्षा कोई Origin/Referer जाँच या CSRF टोकन नहीं करता।
प्रमाण की अवधारणा (गतिशील रूप से पुष्टि की गई, केवल स्थिर रूप से ट्रेस नहीं):
config.yaml को providers.openai.base_url: http://127.0.0.1:9091 (मॉक अपस्ट्रीम) और providers.openai.api_key: "sk-VICTIM-SECRET-DO-NOT-LEAK-12345", pii_detection.enabled: false (केवल मॉक्ड डिटेक्टर /health, पूर्ण GLiNER मॉडल सेवा की आवश्यकता से बचने के लिए), secrets_detection.enabled: false के साथ कॉन्फ़िगर किया। PasteGuard को bun run src/index.ts से शुरू किया, /health → 200 की पुष्टि की।127.0.0.1:9091 पर एक मॉक अपस्ट्रीम (mock_upstream.py) शुरू किया जो प्राप्त होने वाले किसी भी Authorization हेडर को लॉग करता है।http://127.0.0.2:8001/attack.html (अलग शाब्दिक लूपबैक IP, Chrome के साइट-आइसोलेशन नियमों के अनुसार — समान-ओरिजिन localhost परीक्षण नहीं), से python3 -m http.server 8001 --bind 127.0.0.2 के माध्यम से एक वास्तविक हमलावर पेज परोसा। पेज की लोड पर एकमात्र क्रिया:
fetch("http://127.0.0.1:3000/openai/v1/chat/completions", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ model: "gpt-4o-mini", messages: [{ role: "user", content: "cross-origin drive-by call, attacker supplied NO api key" }] })
}).then(r => r.json()).then(data => { /* render on page */ });
http://127.0.0.2:8001/attack.html पर चलाया। DevTools नेटवर्क निरीक्षण के माध्यम से पुष्टि की:
origin: http://127.0.0.2:8001, sec-fetch-site: cross-site, हमलावर पेज द्वारा कोई Authorization हेडर नहीं भेजा गया।access-control-allow-origin: *, HTTP 200, JSON बॉडी हमलावर पेज की JS द्वारा पूरी तरह पठनीय।../evidence/cross_origin_csrf_success.png।RECEIVED AUTH HEADER: Bearer sk-VICTIM-SECRET-DO-NOT-LEAK-12345 — यह साबित करता है कि PasteGuard ने सर्वर-साइड पर ऑपरेटर की वास्तविक कॉन्फ़िगर की गई कुंजी संलग्न की, बिना हमलावर पेज के कभी उसे जाने या आपूर्ति किए।कच्चा प्रमाण: ~/engagements/pasteguard/evidence/cross_origin_csrf_success.png, ~/engagements/pasteguard/evidence/mock_upstream_log.txt.
/anthropic/v1/messages रूट की स्थिर रूप से पुष्टि की गई (ऊपर file:line) कि वह समान फ़ॉलबैक + वाइल्डकार्ड-CORS पैटर्न साझा करता है, लेकिन मूल कारण /openai पर पहले ही पुष्ट हो जाने के बाद सत्र के depth-over-breadth/5-minute-rule मार्गदर्शन के हित में इसे अलग से लाइव ब्राउज़र PoC के माध्यम से दोबारा नहीं चलाया गया।
प्रभाव: PasteGuard ऑपरेटर के ब्राउज़र द्वारा देखी जाने वाली कोई भी वेबसाइट (दुर्भावनापूर्ण विज्ञापन, समझौता की गई साइट, या डिफ़ॉल्ट 0.0.0.0 बाइंड के कारण उसी LAN पर एक हमलावर) चुपचाप ऑपरेटर के अपने OpenAI/Anthropic अकाउंट के माध्यम से उनके लोकल PasteGuard इंस्टेंस के ज़रिए असीमित बिल किए गए अनुरोध चला सकती है, टैब खुला होने के अलावा कोई उपयोगकर्ता इंटरैक्शन नहीं और ऑपरेटर के लिए अपने प्रोवाइडर बिलिंग डैशबोर्ड को देखने के अलावा इसे नोटिस करने का कोई तरीका नहीं। यह एक सीधा वित्तीय-दुरुपयोग / कोटा-समाप्ति वेक्टर है, और द्वितीयक रूप से ऑपरेटर के प्रोवाइडर अकाउंट उपयोग/ऑडिट ट्रेल को हमलावर-चयनित सामग्री से दूषित करता है।