
JAW: إطار تحليل أمني قائم على الرسوم البيانية لجافا سكريبت من جانب العميل
جيه إيه دبليو
الموقع الإلكتروني | الوثائق | الإعداد | الزاحف | بداية سريعة دوكر (مثال)
إطار عمل مفتوح المصدر، ونموذج أولي لرسوم الخصائص البيانية (property graphs) للجافا سكريبت استناداً إلى محلل esprima، ومواصفات EsTree SpiderMonkey. يمكن استخدام JAW لتحليل الجانب العميل من تطبيقات الويب والبرامج المستندة إلى JavaScript.
هذا المشروع مرخص بموجب GNU AFFERO GENERAL PUBLIC LICENSE V3.0. راجع هنا لمزيد من المعلومات.
يحتوي JAW على موقع إلكتروني على صفحات Github متاح على https://soheilkhodayari.github.io/JAW/.
ملاحظات الإصدارات:
JAW-V2.JAW-V1.هندسة JAW موضحة أدناه.
يمكن استخدام JAW بطريقتين مختلفتين:
تحليل جافا سكريبت عشوائي: استخدم JAW لنمذجة وتحليل أي برنامج جافا سكريبت عن طريق تحديد path (مسار) نظام الملفات للبرنامج.
تحليل تطبيق ويب: تحليل تطبيق ويب من خلال توفير عنوان URL بذرة واحد.
استخدم موارد الويب التي تم جمعها لإنشاء رسم بياني للبرنامج الهجين (HPG)، والذي سيتم استيراده إلى قاعدة بيانات Neo4j.
اختيارياً، قم بتزويد وحدة بناء HPG بتعيين من الأنواع الدلالية (semantic types) إلى رموز لغة جافا سكريبت المخصصة، مما يسهل تصنيف دوال جافا سكريبت بناءً على غرضها (على سبيل المثال، دوال طلبات HTTP).
استعلم عن قاعدة بيانات الرسم البياني Neo4j التي تم بناؤها لإجراء تحليلات متنوعة. يقدم JAW عمليات اجتياز مساعدة لتحليل تدفق البيانات، وتحليل تدفق التحكم، وتحليل الوصول، ومطابقة الأنماط. يمكن استخدام هذه العمليات لتطوير تحليلات أمنية مخصصة.
يتضمن JAW أيضاً عمليات اجتياز مدمجة لاكتشاف ثغرات CSRF من جانب العميل، و DOM Clobbering واختراق الطلبات.
سيتم تخزين المخرجات في نفس مجلد الإدخال.
يعتمد نص التثبيت على المتطلبات الأساسية التالية:
npm package manager (node js)python 3.xpipبعد ذلك، قم بتثبيت التبعيات اللازمة عبر:
$ ./install.sh
للحصول على تعليمات تثبيت مفصلة، يرجى الاطلاع هنا.
يمكنك تشغيل مثيل من خط الأنابيب في شاشة خلفية عبر:
$ python3 -m run_pipeline --conf=config.yaml
توفر واجهة سطر الأوامر الخيارات التالية:
$ 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 للحصول على مثال.
تلميح. يحدد ملف التكوين مراحل مختلفة (مثل الزحف، التحليل الثابت، إلخ) والتي يمكن تشغيلها أو تعطيلها لكل فئة من فئات الثغرات الأمنية. هذا يسمح بتشغيل اللبنات الأساسية للأداة بشكل فردي، أو بترتيب مختلف (على سبيل المثال، قم بالزحف إلى جميع تطبيقات الويب أولاً، ثم قم بإجراء التحليل الأمني).
لتشغيل مثال سريع يوضح كيفية بناء رسم بياني للخصائص وتشغيل استعلامات Cypher عليه، قم بما يلي:
$ python3 -m analyses.example.example_analysis --input=$(pwd)/data/test_program/test.js
تقوم هذه الوحدة بجمع البيانات (أي كود جافا سكريبت وقيم حالة صفحات الويب) اللازمة للاختبار. إذا كنت تريد اختبار ملف جافا سكريبت محدد لديك بالفعل على نظام الملفات الخاص بك، يمكنك تخطي هذه الخطوة.
يحتوي JAW على زاحفات تعتمد على Selenium (JAW-v1)، و Puppeteer (JAW-v2, v3) و Playwright (JAW-v3). للحصول على أحدث الميزات، يوصى باستخدام الإصدارات المستندة إلى Puppeteer أو Playwright.
يستخدم زاحف الويب هذا foxhound، وهو إصدار معدّل من Firefox، لأداء تتبع التلوث الديناميكي (dynamic taint tracking) أثناء تنقله عبر صفحات الويب. لبدء الزاحف، قم بما يلي:
$ 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 لاستخدام هذا الإصدار. يتم تضمين بناء أوبونتو في إصدار 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 # قم بتعيين مواقع الويب التي تريد الزحف إليها هنا واحفظ
$ docker-compose build
$ docker-compose up -d
يرجى الرجوع إلى توثيق hpg_crawler هنا لمزيد من المعلومات.
لإنشاء HPG لمجموعة (مجموعات) من ملفات جافا سكريبت، قم بما يلي:
$ 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: لغة برنامج الإدخال
--graphid: معرف لـ HPG الذي تم إنشاؤه
--input: مسار برنامج (برامج) الإدخال
--output: مسار HPG الناتج، يجب أن يكون i
--mode: يحدد تنسيق الإخراج (csv أو 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>: اسم برنامج جافا سكريبت للتحليل (الافتراضي: 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 لاستبعاد (الافتراضي: ).لمزيد من المعلومات، يمكنك استخدام واجهة سطر الأوامر المساعدة المقدمة مع واجهة برمجة تطبيقات بناء الرسم البياني:
$ 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
لمزيد من المعلومات، يرجى الاطلاع هنا.
يصف هذا القسم كيفية تكوين JAW واستخدامه لاكتشاف الثغرات الأمنية، وكيفية تفسير المخرجات. يحتوي JAW، من بين أمور أخرى، على استعلامات مكتفية بذاتها لاكتشاف CSRF من جانب العميل و DOM 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
تلميح. يمكنك تشغيل مثيلات متعددة من خط الأنابيب تحت 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 إدخالاً يحدد مجموعة الأنواع الدلالية (المعروفة أيضاً باسم العلامات أو التسميات الدلالية) المرتبطة بالعناصر التي تشكل الطلب (أي شرائح البرنامج). على سبيل المثال، طلب 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'].
من أجل تبسيط عملية اختبار JAW والتأكد من صحة الإعداد الخاص بك، نقدم تطبيق ويب بسيط node.js يمكنك اختبار JAW به.
أولاً، قم بتثبيت التبعيات عبر:
$ cd tests/test-webapp
$ npm install
ثم، قم بتشغيل التطبيق في شاشة جديدة:
$ screen -dmS jawwebapp bash -c 'PORT=6789 npm run devstart; exec sh'
لمزيد من المعلومات، قم بزيارة صفحة الويكي الخاصة بنا هنا. فيما يلي جدول محتويات للوصول السريع.
طلبات السحب (Pull requests) مرحب بها دائماً. هذا المشروع يهدف إلى أن يكون مساحة آمنة ومرحبة، ومن المتوقع أن يلتزم المساهمون بمدونة سلوك المساهم.
إذا كنت تستخدم 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 شوطاً طويلاً ونريد أن نوجه تحية خاصة لمساهمينا هنا!
events.out--cookies=<cookies.pkl>: لوضع الهجين فقط، اسم الملف الذي يحتوي على ملفات تعريف الارتباط، قم بتمرير السلسلة false لاستبعاد (الافتراضي: cookies.pkl).--html=<html_snapshot.html>: لوضع الهجين فقط، اسم الملف الذي يحتوي على لقطة شجرة DOM، قم بتمرير السلسلة false لاستبعاد (الافتراضي: html_rendered.html).