
فك
الموقع | مستندات | الإعداد | الزاحف | Quick Start Docker (مثال)
تنفيذ Open Source ، النموذج الأولي للرسوم البيانية للممتلكات لـ JavaScript استنادًا إلى محلل Esprima ، ومواصفات Estree Spidermonkey. يمكن استخدام الفك لتحليل جانب العميل لتطبيقات الويب والبرامج القائمة على جافا سكريبت.
تم ترخيص هذا المشروع بموجب GNU AFFERO GENERAL PUBLIC LICENSE V3.0 . انظر هنا لمزيد من المعلومات.
Jaw لديه موقع GitHub Pages متاح على https://soheilkhodayari.github.io/jaw/.
ملاحظات الإصدار:
JAW-V2 .JAW-V1 .يظهر بنية الفك أدناه.

يمكن استخدام الفك بطريقتين متميزتين:
تحليل JavaScript التعسفي: استخدم الفك لنمذجة وتحليل أي برنامج JavaScript من خلال تحديد path نظام ملفات البرنامج.
تحليل تطبيق الويب: تحليل تطبيق الويب من خلال توفير عنوان URL SEED واحد.
استخدم موارد الويب التي تم جمعها لإنشاء رسم بياني للبرنامج المختلط (HPG) ، والذي سيتم استيراده إلى قاعدة بيانات NEO4J.
اختياريا ، قم بتزويد وحدة إنشاء HPG باستخدام رسم خرائط للأنواع الدلالية لرموز لغة JavaScript المخصصة ، مما يسهل تصنيف وظائف JavaScript استنادًا إلى الغرض منها (على سبيل المثال ، وظائف طلب HTTP).
الاستعلام عن قاعدة بيانات الرسم البياني Neo4j المصنوع من أجل التحليلات المختلفة. يوفر JAW عبور فائدة لتحليل تدفق البيانات ، وتحليل تدفق التحكم ، وتحليل قابلية الوصول ، ومطابقة الأنماط. يمكن استخدام هذه التمريرات لتطوير تحليلات الأمان المخصصة.
يتضمن Jaw أيضًا عبورًا مدمجًا للكشف عن CSRF من جانب العميل ، و Combbering DOM وطلب نقاط الضعف.
سيتم تخزين المخرجات في نفس المجلد مثل المدخلات.
يعتمد البرنامج النصي للتثبيت على المتطلبات التالية:
npm package manager (Node JS)python 3.xpipبعد ذلك ، قم بتثبيت التبعيات اللازمة عبر:
$ ./install.sh للحصول على إرشادات التثبيت detailed ، يرجى الاطلاع هنا.
يمكنك تشغيل مثيل لخط الأنابيب في شاشة الخلفية عبر:
$ 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]
This script runs the tool pipeline.
optional arguments:
-h, --help show this help message and exit
--conf FILE, -C FILE pipeline configuration file. (default: config.yaml)
--site SITE, -S SITE website to test; overrides config file (default: None)
--list LIST, -L LIST site list to test; overrides config file (default: None)
--from FROM, -F FROM the first entry to consider when a site list is provided; overrides config file (default: -1)
--to TO, -T TO the last entry to consider when a site list is provided; overrides config file (default: -1)
تكوين الإدخال: يتوقع Jaw ملف تكوين .yaml كمدخل. انظر config.yaml للحصول على مثال.
تَلمِيح. يحدد ملف التكوين تمريرات مختلفة (على سبيل المثال ، الزحف ، التحليل الثابت ، إلخ) والتي يمكن تمكينها أو تعطيلها لكل فئة من فئة الضعف. يتيح ذلك تشغيل لبنات إنشاء الأدوات بشكل فردي ، أو بترتيب مختلف (على سبيل المثال ، قم بالزحف على جميع WebApps أولاً ، ثم إجراء تحليل الأمان).
لتشغيل مثال سريع توضح كيفية إنشاء رسم بياني خاصية وتشغيل استعلامات Cypher عليه ، قم:
$ python3 -m analyses.example.example_analysis --input= $( pwd ) /data/test_program/test.jsتقوم هذه الوحدة بجمع البيانات (أي رمز JavaScript وقيم الحالة لصفحات الويب) اللازمة للاختبار. إذا كنت ترغب في اختبار ملف Javascipt معين لديك بالفعل على نظام الملفات الخاص بك ، فيمكنك تخطي هذه الخطوة.
يمتلك الفك زحفًا على أساس السيلينيوم (JAW-V1) و Puppeteer (Jaw-V2 ، V3) والكاتب المسرحي (Jaw-V3). بالنسبة لمعظم الميزات الحديثة ، يوصى باستخدام الإصدارات القائمة على الدمى أو الكاتب المسرحي.
يستخدم هذا الزاحف على الويب Foxhound ، وهو إصدار مُجهز من Firefox ، لأداء تتبع Dynamic Taint أثناء التنقل عبر صفحات الويب. لبدء الزاحف ، افعل:
$ cd crawler
$ node crawler-taint.js --seedurl=https://google.com --maxurls=100 --headless=true --foxhoundpath= < optional-foxhound-executable-path > تم تعيين foxhoundpath بشكل افتراضي على الدليل التالي: crawler/foxhound/firefox الذي يحتوي على ثنائي يدعى firefox .
ملاحظة: تحتاج إلى بناء من Foxhound لاستخدام هذا الإصدار. يتم تضمين بناء Ubuntu في إصدار Jaw-V3.
لبدء الزاحف ، افعل:
$ cd crawler
$ node crawler.js --seedurl=https://google.com --maxurls=100 --browser=chrome --headless=trueانظر هنا لمزيد من المعلومات.
لبدء الزاحف ، افعل:
$ cd crawler/hpg_crawler
$ vim docker-compose.yaml # set the websites you want to crawl here and save
$ docker-compose build
$ docker-compose up -d يرجى الرجوع إلى وثائق hpg_crawler هنا لمزيد من المعلومات.
لإنشاء HPG لمجموعة (مجموعة من) ملفات (مجموعة) JavaScript ، افعل:
$ node engine/cli.js --lang=js --graphid=graph1 --input=/in/file1.js --input=/in/file2.js --output=$(pwd)/data/out/ --mode=csv
optional arguments:
--lang: language of the input program
--graphid: an identifier for the generated HPG
--input: path of the input program(s)
--output: path of the output HPG, must be i
--mode: determines the output format (csv or graphML)
لاستيراد HPG داخل قاعدة بيانات الرسم البياني Neo4J (مثيل Docker) ، قم:
$ python3 -m hpg_neo4j.hpg_import --rpath=<path-to-the-folder-of-the-csv-files> --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]
This script imports a CSV of a property graph into a neo4j docker database.
optional arguments:
-h, --help show this help message and exit
--rpath P relative path to the folder containing the graph CSV files inside the `data` directory
--id I an identifier for the graph or docker container
--nodes N the name of the nodes csv file (default: nodes.csv)
--edges E the name of the relations csv file (default: 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 (افتراضي: صحيح).--hybrid=bool : ما إذا كان الوضع الهجين ممكّنًا (افتراضيًا: false ). هذا يعني أن المختبر يريد إثراء الرسم البياني الخاصية عن طريق إدخال ملفات لأي من لقطة HTML ، والأحداث التي تم إطلاقها ، وطلبات HTTP وملفات تعريف الارتباط ، وفقًا لما تم جمعه من قبل زاحف الفك.--reqs=<requests.out> : بالنسبة للوضع الهجين فقط ، اسم الملف الذي يحتوي على تسلسل طلبات الشبكة obsevered ، تمرير السلسلة 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 ).لمزيد من المعلومات ، يمكنك استخدام مساعدة CLI التي تم توفيرها مع واجهة برمجة تطبيقات إنشاء الرسم البياني:
$ python3 -m engine.api -hيمكن بعد ذلك الاستعلام عن HPG المصمم باستخدام Cypher أو Neomodel ORM.
يجب عليك وضع وتشغيل استفساراتك في analyses/<ANALYSIS_NAME> .
يمكنك استخدام Neomodel ORM للاستعلام عن HPG. لكتابة استعلام:
example_query_orm.py في مجلد analyses/example . $ python3 -m analyses.example.example_query_orm لمزيد من المعلومات ، يرجى الاطلاع هنا.
يمكنك استخدام Cypher لكتابة استفسارات مخصصة. لهذا:
example_query_cypher.py في مجلد analyses/example . $ python3 -m analyses.example.example_query_cypherلمزيد من المعلومات ، يرجى الاطلاع هنا.
يصف هذا القسم كيفية تكوين واستخدام الفك لاكتشاف الضعف ، وكيفية تفسير الإخراج. يحتوي الفك ، من بين أمور أخرى ، على استفسارات قائمة بذاتها لاكتشاف CSRF من جانب العميل و Clobbering
الخطوة 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 تَلمِيح. يمكنك تشغيل مثيلات متعددة من خط الأنابيب تحت screen مختلفة:
$ 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 بإخراج إدخال يمثل مجموعة من أنواع الدلالات (المعروفة أيضًا باسم العلامات الدلالية أو الملصقات) المرتبطة بالعناصر التي تبني الطلب (أي شرائح البرنامج). على سبيل المثال ، يتم تسامح طلب HTTP مع النوع الدلالي ['WIN.LOC'] من خلال نقطة حقن 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 ، ويؤدي تعبير المكالمات هذا إلى طلب ajax مع قيمة قالب url لـ ajaxloc + "/bearer1234/ ، حيث تكون المعلمة ajaxloc عبارة عن شريحة برنامج يقرأ قيمتها 6 من window.location.href ، وبالتالي التسامح ['WIN.LOC'] .
من أجل تبسيط عملية الاختبار للفك والتأكد من أن الإعداد الخاص بك دقيق ، فإننا نقدم تطبيقًا بسيطًا على الويب node.js يمكنك اختبار الفك معه.
أولاً ، قم بتثبيت التبعيات عبر:
$ cd tests/test-webapp
$ npm installثم ، قم بتشغيل التطبيق في شاشة جديدة:
$ screen -dmS jawwebapp bash -c ' PORT=6789 npm run devstart; exec sh 'لمزيد من المعلومات ، تفضل بزيارة صفحة Wiki هنا. فيما يلي جدول محتويات للوصول السريع.
يتم الترحيب دائمًا بطلبات السحب. يهدف هذا المشروع إلى أن يكون مساحة آمنة ومرحبة ، ومن المتوقع أن يلتزم المساهمون بمدونة قواعد السلوك المساهم.
إذا كنت تستخدم الفك للبحث الأكاديمي ، فنحن نشجعك على الاستشهاد بالورقة التالية:
@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},
}
لقد قطعت الفك شوطًا طويلاً ونريد أن نمنح المساهمين صراخًا مستحقًا هنا!
tmbrbr ، @c01gide ، jndre ، و sepehr mirzaei.