
JAW: क्लाइंट-साइड जावास्क्रिप्ट के लिए एक ग्राफ-आधारित सुरक्षा विश्लेषण ढांचा
एक ओपन-सोर्स, प्रोटोटाइप कार्यान्वयन JavaScript के लिए प्रॉपर्टी ग्राफ का, जो esprima पार्सर और EsTree SpiderMonkey Spec पर आधारित है। JAW का उपयोग वेब अनुप्रयोगों और JavaScript-आधारित प्रोग्रामों के क्लाइंट-साइड विश्लेषण के लिए किया जा सकता है।
यह प्रोजेक्ट GNU AFFERO GENERAL PUBLIC LICENSE V3.0 के अंतर्गत लाइसेंस प्राप्त है। अधिक जानकारी के लिए यहाँ देखें।
JAW की एक Github पेज वेबसाइट https://soheilkhodayari.github.io/JAW/ पर उपलब्ध है।
रिलीज़ नोट्स:
JAW-V2 शाखा देखें।JAW-V1 शाखा देखें।JAW की संरचना नीचे दिखाई गई है।
JAW का उपयोग दो अलग-अलग तरीकों से किया जा सकता है:
सामान्य JavaScript विश्लेषण: प्रोग्राम के फ़ाइल सिस्टम path को निर्दिष्ट करके किसी भी JavaScript प्रोग्राम के मॉडलिंग और विश्लेषण के लिए JAW का उपयोग करें।
वेब अनुप्रयोग विश्लेषण: एक एकल सीड URL प्रदान करके वेब अनुप्रयोग का विश्लेषण करें।
एकत्रित वेब संसाधनों का उपयोग करके एक हाइब्रिड प्रोग्राम ग्राफ (HPG) बनाएं, जिसे Neo4j डेटाबेस में आयात किया जाएगा।
वैकल्पिक रूप से, HPG निर्माण मॉड्यूल को सिमैंटिक प्रकारों का मैपिंग कस्टम JavaScript भाषा टोकन प्रदान करें, जिससे उनके उद्देश्य (जैसे, HTTP अनुरोध फ़ंक्शन) के आधार पर JavaScript फ़ंक्शनों का वर्गीकरण सुविधाजनक होगा।
विभिन्न विश्लेषणों के लिए निर्मित Neo4j ग्राफ डेटाबेस से क्वेरी करें। JAW डेटा प्रवाह विश्लेषण, नियंत्रण प्रवाह विश्लेषण, पहुंच योग्यता विश्लेषण और पैटर्न मिलान के लिए उपयोगिता ट्रैवर्सल प्रदान करता है। इन ट्रैवर्सल का उपयोग कस्टम सुरक्षा विश्लेषण विकसित करने के लिए किया जा सकता है।
JAW में क्लाइंट-साइड CSRF, DOM क्लॉबरिंग और अनुरोध हाईजैकिंग भेद्यताओं का पता लगाने के लिए बिल्ट-इन ट्रैवर्सल भी शामिल हैं।
आउटपुट उसी फ़ोल्डर में संग्रहीत किए जाएंगे जहां इनपुट है।
स्थापना स्क्रिप्ट निम्नलिखित पूर्वापेक्षाओं पर निर्भर करती है:
npm package manager का नवीनतम संस्करण (node js)python 3.x का कोई स्थिर संस्करणpip पैकेज मैनेजरउसके बाद, आवश्यक निर्भरताएं इस प्रकार स्थापित करें:
$ ./install.sh
विस्तृत स्थापना निर्देशों के लिए, कृपया यहाँ देखें।
आप पाइपलाइन का एक उदाहरण बैकग्राउंड स्क्रीन में इस प्रकार चला सकते हैं:
$ python3 -m run_pipeline --conf=config.yaml
CLI निम्नलिखित विकल्प प्रदान करता है:
$ python3 -m run_pipeline -h
usage: run_pipeline.py [-h] [--conf FILE] [--site SITE] [--list LIST] [--from FROM] [--to TO]
यह स्क्रिप्ट टूल पाइपलाइन चलाती है।
वैकल्पिक तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें
--conf FILE, -C FILE पाइपलाइन कॉन्फ़िगरेशन फ़ाइल। (डिफ़ॉल्ट: config.yaml)
--site SITE, -S SITE परीक्षण करने के लिए वेबसाइट; कॉन्फ़िग फ़ाइल को ओवरराइड करता है (डिफ़ॉल्ट: None)
--list LIST, -L LIST परीक्षण करने के लिए साइट सूची; कॉन्फ़िग फ़ाइल को ओवरराइड करता है (डिफ़ॉल्ट: None)
--from FROM, -F FROM साइट सूची प्रदान करने पर विचार करने के लिए पहली प्रविष्टि; कॉन्फ़िग फ़ाइल को ओवरराइड करता है (डिफ़ॉल्ट: -1)
--to TO, -T TO साइट सूची प्रदान करने पर विचार करने के लिए अंतिम प्रविष्टि; कॉन्फ़िग फ़ाइल को ओवरराइड करता है (डिफ़ॉल्ट: -1)
इनपुट कॉन्फ़िग: JAW इनपुट के रूप में एक .yaml कॉन्फ़िग फ़ाइल की अपेक्षा करता है। एक उदाहरण के लिए config.yaml देखें।
संकेत: कॉन्फ़िग फ़ाइल विभिन्न पास (जैसे, क्रॉलिंग, स्थैतिक विश्लेषण, आदि) निर्दिष्ट करती है जिन्हें प्रत्येक भेद्यता वर्ग के लिए सक्षम या अक्षम किया जा सकता है। यह उपकरण बिल्डिंग ब्लॉक्स को व्यक्तिगत रूप से या अलग-अलग क्रम में चलाने की अनुमति देता है (जैसे, पहले सभी वेबएप्प क्रॉल करें, फिर सुरक्षा विश्लेषण करें)।
एक त्वरित उदाहरण चलाने के लिए जो प्रॉपर्टी ग्राफ बनाने और उस पर Cypher क्वेरी चलाने का प्रदर्शन करता है, ऐसा करें:
$ python3 -m analyses.example.example_analysis --input=$(pwd)/data/test_program/test.js
यह मॉड्यूल परीक्षण के लिए आवश्यक डेटा (अर्थात, JavaScript कोड और वेब पेजों की स्थिति मान) एकत्र करता है। यदि आप किसी विशिष्ट JavaScipt फ़ाइल का परीक्षण करना चाहते हैं जो आपके फ़ाइल सिस्टम पर पहले से मौजूद है, तो आप इस चरण को छोड़ सकते हैं।
JAW में Selenium (JAW-v1), Puppeteer (JAW-v2, v3) और Playwright (JAW-v3) पर आधारित क्रॉलर हैं। नवीनतम सुविधाओं के लिए, Puppeteer- या Playwright-आधारित संस्करणों का उपयोग करने की अनुशंसा की जाती है।
यह वेब क्रॉलर वेबपेजों के माध्यम से नेविगेट करते समय डायनेमिक टेंट ट्रैकिंग करने के लिए foxhound का उपयोग करता है, जो Firefox का एक इंस्ट्रुमेंटेड संस्करण है। क्रॉलर शुरू करने के लिए, ऐसा करें:
$ cd crawler
$ node crawler-taint.js --seedurl=https://google.com --maxurls=100 --headless=true --foxhoundpath=<वैकल्पिक-foxhound-executable-path>
foxhoundpath डिफ़ॉल्ट रूप से निम्नलिखित निर्देशिका पर सेट है: crawler/foxhound/firefox जिसमें एक बाइनरी है जिसका नाम firefox है।
नोट: इस संस्करण का उपयोग करने के लिए आपको foxhound का बिल्ड चाहिए। JAW-v3 रिलीज़ में एक ubuntu बिल्ड शामिल है।
क्रॉलर शुरू करने के लिए, ऐसा करें:
$ cd crawler
$ node crawler.js --seedurl=https://google.com --maxurls=100 --browser=chrome --headless=true
अधिक जानकारी के लिए यहाँ देखें।
क्रॉलर शुरू करने के लिए, ऐसा करें:
$ cd crawler/hpg_crawler
$ vim docker-compose.yaml # यहां वे वेबसाइटें सेट करें जिन्हें आप क्रॉल करना चाहते हैं और सेव करें
$ docker-compose build
$ docker-compose up -d
कृपया hpg_crawler के दस्तावेज़ीकरण के लिए यहाँ देखें।
दिए गए JavaScript फ़ाइल(फ़ाइलों) के लिए HPG उत्पन्न करने के लिए, ऐसा करें:
$ node engine/cli.js --lang=js --graphid=graph1 --input=/in/file1.js --input=/in/file2.js --output=$(pwd)/data/out/ --mode=csv
वैकल्पिक तर्क:
--lang: इनपुट प्रोग्राम की भाषा
--graphid: उत्पन्न HPG के लिए एक पहचानकर्ता
--input: इनपुट प्रोग्राम का पथ
--output: आउटपुट HPG का पथ, होना चाहिए
--mode: आउटपुट प्रारूप निर्धारित करता है (csv या graphML)
HPG को neo4j ग्राफ डेटाबेस (डॉकर इंस्टेंस) के अंदर आयात करने के लिए, ऐसा करें:
$ python3 -m hpg_neo4j.hpg_import --rpath=<csv-फ़ाइलों-वाले-फ़ोल्डर-का-पथ> --id=<xyz> --nodes=<nodes.csv> --edges=<rels.csv>
$ python3 -m hpg_neo4j.hpg_import -h
usage: hpg_import.py [-h] [--rpath P] [--id I] [--nodes N] [--edges E]
यह स्क्रिप्ट प्रॉपर्टी ग्राफ के CSV को neo4j डॉकर डेटाबेस में आयात करती है।
वैकल्पिक तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें
--rpath P `data` निर्देशिका के अंदर ग्राफ CSV फ़ाइलों वाले फ़ोल्डर का सापेक्ष पथ
--id I ग्राफ या डॉकर कंटेनर के लिए एक पहचानकर्ता
--nodes N नोड्स CSV फ़ाइल का नाम (डिफ़ॉल्ट: nodes.csv)
--edges E रिलेशन CSV फ़ाइल का नाम (डिफ़ॉल्ट: rels.csv)
hpg_crawler के आउटपुट के लिए हाइब्रिड प्रॉपर्टी ग्राफ बनाने और इसे स्थानीय neo4j इंस्टेंस के अंदर आयात करने के लिए, आप यह भी कर सकते हैं:
$ python3 -m engine.api <path> --js=<program.js> --import=<bool> --hybrid=<bool> --reqs=<requests.out> --evts=<events.out> --cookies=<cookies.pkl> --html=<html_snapshot.html>
मापदंडों का विनिर्देश:
<path>: विश्लेषण के लिए प्रोग्राम फ़ाइलों वाले फ़ोल्डर का पूर्ण पथ (engine/outputs फ़ोल्डर के अंतर्गत होना चाहिए)।--js=<program.js>: विश्लेषण के लिए JavaScript प्रोग्राम का नाम (डिफ़ॉल्ट: js_program.js)।--import=<bool>: क्या निर्मित प्रॉपर्टी ग्राफ को सक्रिय neo4j डेटाबेस में आयात किया जाना चाहिए (डिफ़ॉल्ट: true)।--hybrid=bool: क्या हाइब्रिड मोड सक्षम है (डिफ़ॉल्ट: false)। इसका मतलब है कि परीक्षक HTML स्नैपशॉट, फायर किए गए इवेंट, HTTP अनुरोध और कुकीज़ में से किसी के लिए फ़ाइलें इनपुट करके प्रॉपर्टी ग्राफ को समृद्ध करना चाहता है, जैसा कि JAW क्रॉलर द्वारा एकत्र किया गया है।--reqs=<requests.out>: केवल हाइब्रिड मोड के लिए, देखे गए नेटवर्क अनुरोधों के अनुक्रम वाली फ़ाइल का नाम, बहिष्कृत करने के लिए स्ट्रिंग false पास करें (डिफ़ॉल्ट: request_logs_short.out)।--evts=<events.out>: केवल हाइब्रिड मोड के लिए, फायर किए गए इवेंट के अनुक्रम वाली फ़ाइल का नाम, बहिष्कृत करने के लिए स्ट्रिंग false पास करें (डिफ़ॉल्ट: events.out)।--cookies=<cookies.pkl>: केवल हाइब्रिड मोड के लिए, कुकीज़ वाली फ़ाइल का नाम, बहिष्कृत करने के लिए स्ट्रिंग false पास करें (डिफ़ॉल्ट: cookies.pkl)।--html=<html_snapshot.html>: केवल हाइब्रिड मोड के लिए, DOM ट्री स्नैपशॉट वाली फ़ाइल का नाम, बहिष्कृत करने के लिए स्ट्रिंग false पास करें (डिफ़ॉल्ट: html_rendered.html)।अधिक जानकारी के लिए, आप ग्राफ निर्माण API के साथ प्रदान की गई सहायता CLI का उपयोग कर सकते हैं:
$ python3 -m engine.api -h
निर्मित HPG को फिर Cypher या NeoModel ORM का उपयोग करके क्वेरी किया जा सकता है।
आपको अपनी क्वेरी को analyses/<ANALYSIS_NAME> में रखना और चलाना चाहिए।
आप HPG को क्वेरी करने के लिए NeoModel ORM का उपयोग कर सकते हैं। क्वेरी लिखने के लिए:
analyses/example फ़ोल्डर में example_query_orm.py।$ python3 -m analyses.example.example_query_orm
अधिक जानकारी के लिए, कृपया यहाँ देखें।
आप कस्टम क्वेरी लिखने के लिए Cypher का उपयोग कर सकते हैं। इसके लिए:
analyses/example फ़ोल्डर में example_query_cypher.py।$ python3 -m analyses.example.example_query_cypher
अधिक जानकारी के लिए, कृपया यहाँ देखें।
यह अनुभाग बताता है कि भेद्यता पहचान के लिए JAW को कैसे कॉन्फ़िगर और उपयोग करें, और आउटपुट की व्याख्या कैसे करें। JAW में अन्य के साथ-साथ क्लाइंट-साइड CSRF और DOM क्लॉबरिंग का पता लगाने के लिए स्व-निहित क्वेरी भी शामिल हैं।
चरण 1. इनपुट config.yaml फ़ाइल में भेद्यता वर्ग के लिए विश्लेषण घटक को सक्षम करें:
request_hijacking:
enabled: true
# [...]
open_redirect:
enabled: false
# [...]
domclobbering:
enabled: false
# [...]
cs_csrf:
enabled: false
# [...]
चरण 2. पाइपलाइन का एक उदाहरण इस प्रकार चलाएं:
$ python3 -m run_pipeline --conf=config.yaml
संकेत. आप पाइपलाइन के कई उदाहरण विभिन्न screens के तहत चला सकते हैं:
$ screen -dmS s1 bash -c 'python3 -m run_pipeline --conf=conf1.yaml; exec sh'
$ screen -dmS s2 bash -c 'python3 -m run_pipeline --conf=conf2.yaml; exec sh'
$ # [...]
समानांतर कॉन्फ़िगरेशन फ़ाइलें स्वचालित रूप से उत्पन्न करने के लिए, आप generate_config.py स्क्रिप्ट का उपयोग कर सकते हैं।
आउटपुट इनपुट के समान फ़ोल्डर में sink.flows.out नामक फ़ाइल में संग्रहीत किए जाएंगे। उदाहरण के लिए, क्लाइंट-साइड CSRF के लिए, पता लगाए गए प्रत्येक HTTP अनुरोध के लिए, JAW एक प्रविष्टि आउटपुट करता है जो अनुरोध बनाने वाले तत्वों (अर्थात, प्रोग्राम स्लाइस) से जुड़े सिमैंटिक प्रकारों (जिसे सिमैंटिक टैग या लेबल भी कहा जाता है) के सेट को चिह्नित करता है। उदाहरण के लिए, सिमैंटिक प्रकार ['WIN.LOC'] से चिह्नित HTTP अनुरोध window.location इंजेक्शन बिंदु के माध्यम से जाली बनाने योग्य है। हालांकि, ['NON-REACH'] से चिह्नित अनुरोध जाली नहीं बनाया जा सकता है।
नीचे एक उदाहरण आउटपुट प्रविष्टि दिखाई गई है:
[*] Tags: ['WIN.LOC']
[*] NodeId: {'TopExpression': '86', 'CallExpression': '87', 'Argument': '94'}
[*] Location: 29
[*] Function: ajax
[*] Template: ajaxloc + "/bearer1234/"
[*] Top Expression: $.ajax({ xhrFields: { withCredentials: "true" }, url: ajaxloc + "/bearer1234/" })
1:['WIN.LOC'] variable=ajaxloc
0 (loc:6)- var ajaxloc = window.location.href
यह प्रविष्टि दिखाती है कि पंक्ति 29 पर, एक $.ajax कॉल एक्सप्रेशन है, और यह कॉल एक्सप्रेशन url टेम्पलेट मान ajaxloc + "/bearer1234/" के साथ एक ajax अनुरोध ट्रिगर करता है, जहां पैरामीटर ajaxloc एक प्रोग्राम स्लाइस है जो पंक्ति 6 से window.location.href से अपना मान पढ़ता है, इस प्रकार ['WIN.LOC'] के माध्यम से जाली बनाने योग्य है।
JAW के लिए परीक्षण प्रक्रिया को सुव्यवस्थित करने और यह सुनिश्चित करने के लिए कि आपका सेटअप सटीक है, हम एक सरल node.js वेब अनुप्रयोग प्रदान करते हैं जिसके साथ आप JAW का परीक्षण कर सकते हैं।
पहले, निर्भरताएं इस प्रकार स्थापित करें:
$ cd tests/test-webapp
$ npm install
फिर, एक नई स्क्रीन में अनुप्रयोग चलाएं:
$ screen -dmS jawwebapp bash -c 'PORT=6789 npm run devstart; exec sh'
अधिक जानकारी के लिए, हमारी विकी पेज यहाँ पर जाएँ। त्वरित पहुंच के लिए नीचे सामग्री की एक तालिका दी गई है।
पुल रिक्वेस्ट का हमेशा स्वागत है। यह प्रोजेक्ट एक सुरक्षित, स्वागत योग्य स्थान होने का इरादा रखता है, और योगदानकर्ताओं से योगदानकर्ता आचार संहिता का पालन करने की अपेक्षा की जाती है।
यदि आप शैक्षणिक अनुसंधान के लिए JAW का उपयोग करते हैं, तो हम आपको निम्नलिखित पेपर उद्धृत करने के लिए प्रोत्साहित करते हैं:
@inproceedings{JAW,
title = {JAW: Studying Client-side CSRF with Hybrid Property Graphs and Declarative Traversals},
author= {Soheil Khodayari and Giancarlo Pellegrino},
booktitle = {30th {USENIX} Security Symposium ({USENIX} Security 21)},
year = {2021},
address = {Vancouver, B.C.},
publisher = {{USENIX} Association},
}
JAW ने एक लंबा सफर तय किया है और हम यहां अपने योगदानकर्ताओं को एक अच्छी तरह से योग्य शाउटआउट देना चाहते हैं!