
KIEFER
Website | Docs | Setup | Crawler | Schnellstart Docker (Beispiel)
Eine Open-Source-Prototyp-Implementierung von Eigenschaftsgraphen für JavaScript basierend auf dem Esprima-Parser und der Estree Spidermonkey Spec. Der JAW kann zur Analyse der clientseitigen Webanwendungen und von JavaScript-basierten Programmen verwendet werden.
Dieses Projekt ist unter GNU AFFERO GENERAL PUBLIC LICENSE V3.0 lizenziert. Weitere Informationen finden Sie hier.
Jaw hat eine GitHub Pages -Website unter https://soheilkhodayari.github.io/jaw/.
Versionshinweise:
JAW-V2 Zweig.JAW-V1 Zweig.Die Architektur des Kiefers ist unten gezeigt.

Kiefer kann auf zwei verschiedene Arten verwendet werden:
Beliebige JavaScript -Analyse: Verwenden Sie den JAW zum Modellieren und Analysieren eines JavaScript -Programms, indem der path des Programms angeben.
Webanwendungsanalyse: Analysieren Sie eine Webanwendung, indem Sie eine einzelne Saatgut -URL bereitstellen.
Verwenden Sie die gesammelten Webressourcen, um ein Hybrid -Programmdiagramm (HPG) zu erstellen, das in eine NEO4J -Datenbank importiert wird.
Versuchen Sie optional das HPG -Konstruktionsmodul mit einer Zuordnung semantischer Typen an benutzerdefinierte JavaScript -Sprach -Token, wodurch die Kategorisierung von JavaScript -Funktionen basierend auf ihrem Zweck (z. B. HTTP -Anforderungsfunktionen) erleichtert wird.
Fragen Sie die konstruierte Neo4j -Graph -Datenbank für verschiedene Analysen ab. JAW bietet Versorgungsunternehmen für die Datenflussanalyse, die Kontrollflussanalyse, die Erreichbarkeitsanalyse und die Musteranpassung. Diese Traverals können verwendet werden, um benutzerdefinierte Sicherheitsanalysen zu entwickeln.
Jaw enthält auch integrierte Durchläufe zum Erkennen von CSRF-CSRF, DOM CLOBBERING und Anfordern von Schwachstellen.
Die Ausgänge werden im selben Ordner wie die der Eingabe gespeichert.
Das Installationsskript basiert auf den folgenden Voraussetzungen:
npm package manager (Node JS)python 3.xpip Package ManagerInstallieren Sie danach die erforderlichen Abhängigkeiten über:
$ ./install.sh detailed Installationsanweisungen finden Sie hier.
Sie können eine Instanz der Pipeline in einem Hintergrundbildschirm ausführen:
$ python3 -m run_pipeline --conf=config.yamlDie CLI bietet die folgenden Optionen:
$ 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)
Eingabekonfiguration: Jaw erwartet eine .yaml -Konfigurationsdatei als Eingabe. Ein Beispiel finden Sie in config.yaml.
Hinweis. Die Konfigurationsdatei gibt verschiedene Durchgänge an (z. B. Crawling, statische Analyse usw.), die für jede Sicherheitsklasse aktiviert oder deaktiviert werden können. Auf diese Weise können die Werkzeugbausteine einzeln oder in einer anderen Reihenfolge ausgeführt werden (z. B. kriechen Sie zuerst alle WebApps und führen Sie dann eine Sicherheitsanalyse durch).
Um ein kurzes Beispiel auszuführen, das demonstriert, wie Sie ein Eigenschaftsgraphen erstellen und Cypher -Abfragen darüber ausführen, sollten Sie:
$ python3 -m analyses.example.example_analysis --input= $( pwd ) /data/test_program/test.jsDieses Modul sammelt die Daten (dh, JavaScript -Code und Statuswerte von Webseiten), die zum Testen benötigt werden. Wenn Sie eine bestimmte Javascipt -Datei testen möchten, die Sie bereits in Ihrem Dateisystem haben, können Sie diesen Schritt überspringen .
Jaw hat Crawlers basierend auf Selenium (JAW-V1), Puppenspieler (JAW-V2, V3) und Dramatikern (JAW-V3). Für aktuellste Funktionen wird empfohlen, die Puppenspieler- oder Dramatiker-basierten Versionen zu verwenden.
Dieser Webcrawler verwendet Foxhound, eine instrumentierte Version von Firefox, um eine dynamische Verfolgung von Makeln durchzuführen, während sie über Webseiten navigiert. Um den Crawler zu beginnen, tun Sie:
$ cd crawler
$ node crawler-taint.js --seedurl=https://google.com --maxurls=100 --headless=true --foxhoundpath= < optional-foxhound-executable-path > Der foxhoundpath ist standardmäßig in das folgende Verzeichnis eingestellt: crawler/foxhound/firefox das einen binären namens firefox enthält.
Hinweis: Sie benötigen einen Build von Foxhound, um diese Version zu verwenden. Ein Ubuntu-Build ist in der JAW-V3-Veröffentlichung enthalten.
Um den Crawler zu beginnen, tun Sie:
$ cd crawler
$ node crawler.js --seedurl=https://google.com --maxurls=100 --browser=chrome --headless=trueWeitere Informationen finden Sie hier.
Um den Crawler zu beginnen, tun Sie:
$ 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 Weitere Informationen finden Sie in der Dokumentation des hpg_crawler hier.
Um eine HPG für eine bestimmte (set) javaScript -Datei (en) zu generieren, do:
$ 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)
Um ein HPG in eine NEO4J -Diagrammdatenbank (Docker -Instanz) zu importieren, tun Sie:
$ 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)
Um ein hybrides Eigenschaftsdiagramm für die Ausgabe des hpg_crawler zu erstellen und in einer lokalen NEO4J -Instanz zu importieren, können Sie auch:
$ 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 >Parameterspezifikation:
<path> : Absolutes Pfad zum Ordner, der die Programmdateien zur Analyse enthält (muss unter dem Ordner engine/outputs liegen).--js=<program.js> : Name des JavaScript-Programms zur Analyse (Standard: js_program.js ).--import=<bool> : Ob das konstruierte Eigenschaftsgraphen in eine aktive NEO4J-Datenbank importiert werden sollten (Standard: TRUE).--hybrid=bool : Ob der Hybridmodus aktiviert ist (Standard: false ). Dies impliziert, dass der Tester das Eigenschaftsgraphen anreichern möchte, indem sie Dateien für einen der HTML -Snapshot, abgefeuerte Ereignisse, HTTP -Anfragen und Cookies eingeben, wie sie vom Kiefer -Crawler gesammelt wurden.--reqs=<requests.out> : Nur für den Hybridmodus, der Name der Datei mit der Abfolge von obsverten Netzwerkanforderungen enthält, übergeben Sie die Zeichenfolge false um auszuschließen (Standard: request_logs_short.out ).--evts=<events.out> : Nur für den Hybridmodus, der Name der Datei mit der Abfolge von entlassenen Ereignissen enthält, übergeben Sie die Zeichenfolge false , um auszuschließen (Standard: events.out ).--cookies=<cookies.pkl> : Nur für den Hybridmodus, Name der Datei mit den Cookies, übergeben Sie die Zeichenfolge false um auszuschließen (Standard: cookies.pkl ).--html=<html_snapshot.html> : Geben Sie nur für den Hybridmodus den Namen der DOM-Baum-Snapshot aus, um die String false auszuschließen (Standard: html_rendered.html ).Für weitere Informationen können Sie die Help CLI verwenden, die mit der Graph Construction API zur Verfügung gestellt wird:
$ python3 -m engine.api -hDas konstruierte HPG kann dann mit Cypher oder dem Neomodel -ORM abgefragt werden.
Sie sollten Ihre Abfragen in analyses/<ANALYSIS_NAME> aufstellen und ausführen.
Sie können das Neomodel ORM verwenden, um die HPG abzufragen. Eine Frage schreiben:
example_query_orm.py Im Ordner analyses/example . $ python3 -m analyses.example.example_query_orm Weitere Informationen finden Sie hier.
Sie können Cypher verwenden, um benutzerdefinierte Abfragen zu schreiben. Dafür:
example_query_cypher.py Im Ordner analyses/example . $ python3 -m analyses.example.example_query_cypherWeitere Informationen finden Sie hier.
In diesem Abschnitt wird beschrieben, wie der Kiefer für die Sicherheitserkennung konfiguriert und verwendet wird und wie die Ausgabe interpretiert wird. Jaw enthält unter anderem in sich geschlossene Abfragen zum Erkennen von clientseitigen CSRF und DOM-CLOBBERING
Schritt 1. Aktivieren Sie die Analysekomponente für die Sicherheitsklasse in der Eingabekonfiguration.YAML -Datei:
request_hijacking :
enabled : true
# [...]
open_redirect :
enabled : false
# [...]
domclobbering :
enabled : false
# [...]
cs_csrf :
enabled : false
# [...]Schritt 2. Führen Sie eine Instanz der Pipeline mit: aus:
$ python3 -m run_pipeline --conf=config.yaml Hinweis. Sie können mehrere Instanzen der Pipeline unter verschiedenen screen s ausführen:
$ 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 '
$ # [...] Um parallele Konfigurationsdateien automatisch zu generieren, können Sie das Skript generate_config.py verwenden.
Die Ausgänge werden in einer Datei namens sink.flows.out im selben Ordner wie die der Eingabe gespeichert. Für clientseitige CSRF gibt beispielsweise für jede festgestellte HTTP-Anforderung einen Eingang aus, der den Satz semantischer Typen (AKA, semantische Tags oder Bezeichnungen) markiert, die den Elementen zugeordnet sind, die die Anforderung (dh die Programmscheiben) konstruieren. Beispielsweise ist eine mit dem semantische Typ ['WIN.LOC'] gekennzeichnete HTTP -Anforderung über das window.location . Eine mit ['NON-REACH'] ist jedoch nicht verteilbar.
Nachstehend ist ein Beispielausgabeintrag angezeigt:
[*] 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
Dieser Eintrag zeigt, dass in Zeile 29 ein $.ajax -Anrufexpression vorhanden ist, und dieser Anrufausdruck löst eine ajax -Anforderung mit dem URL -Vorlagenwert von ajaxloc + "/bearer1234/ aus, wobei der Parameter ajaxloc ein Programm Slice Lesung seines Wertes 6 von window.location.href , somit durch ['WIN.LOC'] .
Um den Testprozess für Jaw zu optimieren und sicherzustellen, dass Ihr Setup korrekt ist, stellen wir eine einfache node.js -Webanwendung an, mit der Sie den Kiefer testen können.
Installieren Sie zunächst die Abhängigkeiten über:
$ cd tests/test-webapp
$ npm installFühren Sie dann die Anwendung in einem neuen Bildschirm aus:
$ screen -dmS jawwebapp bash -c ' PORT=6789 npm run devstart; exec sh 'Weitere Informationen finden Sie hier auf unserer Wiki -Seite. Unten finden Sie ein Inhaltsverzeichnis für schnellen Zugriff.
Pull -Anfragen sind immer begrüßt. Dieses Projekt soll ein sicherer, einladender Raum sein, und die Mitwirkenden werden voraussichtlich den Verhaltenskodex für den Mitarbeiter halten.
Wenn Sie den Kiefer für die akademische Forschung verwenden, empfehlen wir Ihnen, das folgende Papier zu zitieren:
@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 hat einen langen Weg zurückgelegt und wir wollen unseren Mitwirkenden hier einen wohlverdienten Schrei geben!
@tmbrbr, @C01GIDE, @Jndre und Sepehr Mirzaei.