
MÂCHOIRE
Site Web | Docs | Configuration | Crawler | Docker de démarrage rapide (exemple)
Une implémentation de prototype open-source de graphiques de propriétés pour JavaScript basé sur l'analyseur ESPRIMA et la spécification ESTREE SpiderMonkey. La mâchoire peut être utilisée pour analyser le côté client des applications Web et des programmes JavaScript.
Ce projet est autorisé sous GNU AFFERO GENERAL PUBLIC LICENSE V3.0 . Voir ici pour plus d'informations.
Jaw dispose d'un site Web GitHub Pages disponible sur https://soheilkhodayari.github.io/jaw/.
Notes de libération:
JAW-V2 .JAW-V1 .L'architecture de la mâchoire est présentée ci-dessous.

La mâchoire peut être utilisée de deux manières distinctes:
Analyse arbitraire JavaScript: utilisez la mâchoire pour la modélisation et l'analyse de tout programme JavaScript en spécifiant le path du système de fichiers du programme.
Analyse des applications Web: analysez une application Web en fournissant une seule URL de semence.
Utilisez les ressources Web collectées pour créer un graphique de programme hybride (HPG), qui sera importé dans une base de données NEO4J.
Facultativement, fournissez le module de construction HPG avec une cartographie des types sémantiques aux jetons de langue JavaScript personnalisés, facilitant la catégorisation des fonctions JavaScript en fonction de leur objectif (par exemple, les fonctions de demande HTTP).
Interrogez la base de données de graphiques Neo4j construite pour diverses analyses. La mâchoire offre des traversées des services publics pour l'analyse du flux de données, l'analyse du flux de contrôle, l'analyse de l'accouchement et la correspondance des modèles. Ces traversées peuvent être utilisées pour développer des analyses de sécurité personnalisées.
La mâchoire comprend également des traversées intégrées pour détecter le CSRF côté client, les vulnérabilités DOM Clobber et de demande de détournement.
Les sorties seront stockées dans le même dossier que celle de l'entrée.
Le script d'installation repose sur les conditions préalables suivantes:
npm package manager (Node JS)python 3.xpip Package ManagerEnsuite, installez les dépendances nécessaires via:
$ ./install.sh Pour des instructions d'installation detailed , veuillez consulter ici.
Vous pouvez exécuter une instance du pipeline dans un écran d'arrière-plan via:
$ python3 -m run_pipeline --conf=config.yamlLa CLI offre les options suivantes:
$ 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)
Configage d'entrée: Jaw s'attend à un fichier de configuration .yaml comme entrée. Voir config.yaml pour un exemple.
Indice. Le fichier de configuration spécifie différentes laissez-passer (par exemple, rampant, analyse statique, etc.) qui peuvent être activées ou désactivées pour chaque classe de vulnérabilité. Cela permet d'exécuter les éléments de construction des outils individuellement ou dans un ordre différent (par exemple, ramper tous les webapp d'abord, puis effectuer une analyse de sécurité).
Pour exécuter un exemple rapide démontrant comment construire un graphique de propriété et exécuter des requêtes Cypher dessus, faites:
$ python3 -m analyses.example.example_analysis --input= $( pwd ) /data/test_program/test.jsCe module collecte les données (c.-à-d. Le code JavaScript et les valeurs d'état des pages Web) nécessaires pour les tests. Si vous souhaitez tester un fichier Javascipt spécifique que vous avez déjà sur votre système de fichiers, vous pouvez ignorer cette étape.
Jaw a des robots basés sur le sélénium (JAW-V1), le marionnettiste (Jaw-V2, V3) et le dramaturge (Jaw-V3). Pour la plupart des fonctionnalités à jour, il est recommandé d'utiliser les versions basées sur les marionnettes ou le dramaturge.
Ce crawler Web utilise Foxhound, une version instrumentée de Firefox, pour effectuer un suivi de souillure dynamique alors qu'il navigue dans les pages Web. Pour commencer le Crawler, faites:
$ cd crawler
$ node crawler-taint.js --seedurl=https://google.com --maxurls=100 --headless=true --foxhoundpath= < optional-foxhound-executable-path > Le foxhoundpath est par défaut réglé sur le répertoire suivant: crawler/foxhound/firefox qui contient un binaire nommé firefox .
Remarque: vous avez besoin d'une construction de Foxhound pour utiliser cette version. Une version Ubuntu est incluse dans la version JAW-V3.
Pour commencer le Crawler, faites:
$ cd crawler
$ node crawler.js --seedurl=https://google.com --maxurls=100 --browser=chrome --headless=trueVoir ici pour plus d'informations.
Pour commencer le Crawler, faites:
$ 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 Veuillez vous référer à la documentation du hpg_crawler ici pour plus d'informations.
Pour générer un HPG pour un (ensemble de) Fichier JavaScript donné (s), faire:
$ 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)
Pour importer un HPG dans une base de données de graphiques NEO4J (instance Docker), faites:
$ 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)
Afin de créer un graphique de propriété hybride pour la sortie du hpg_crawler et de l'importer dans une instance NEO4J locale, vous pouvez également faire:
$ 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 >Spécification des paramètres:
<path> : Chemin absolu vers le dossier contenant les fichiers du programme pour l'analyse (doit être sous le dossier engine/outputs ).--js=<program.js> : nom du programme JavaScript pour l'analyse (par défaut: js_program.js ).--import=<bool> : si le graphique de la propriété construit doit être importé dans une base de données NEO4J active (par défaut: true).--hybrid=bool : si le mode hybride est activé (par défaut: false ). Cela implique que le testeur souhaite enrichir le graphique de la propriété en entrant des fichiers pour l'un des instantanés HTML, des événements licenciés, des demandes HTTP et des cookies, tels que collectés par le robot de mâchoire.--reqs=<requests.out> : Pour le mode hybride uniquement, le nom du fichier contenant la séquence des demandes de réseau Obsevered, passez la chaîne false à exclure (par défaut: request_logs_short.out ).--evts=<events.out> : Pour le mode hybride uniquement, le nom du fichier contenant la séquence des événements tirés, passez la chaîne false à exclure (par défaut: events.out ).--cookies=<cookies.pkl> : pour le mode hybride uniquement, nom du fichier contenant les cookies, passez la chaîne false à exclure (par défaut: cookies.pkl ).--html=<html_snapshot.html> : pour le mode hybride uniquement, nom du fichier contenant l'instantané de l'arborescence Dom, passez la chaîne false à exclure (par défaut: html_rendered.html ).Pour plus d'informations, vous pouvez utiliser la CLI d'aide fournie avec l'API de construction de graphiques:
$ python3 -m engine.api -hLe HPG construit peut ensuite être interrogé à l'aide de Cypher ou de l'ORM Neomodel.
Vous devez placer et exécuter vos requêtes dans analyses/<ANALYSIS_NAME> .
Vous pouvez utiliser le Neomodel ORM pour interroger le HPG. Pour écrire une requête:
example_query_orm.py dans le dossier analyses/example . $ python3 -m analyses.example.example_query_orm Pour plus d'informations, veuillez consulter ici.
Vous pouvez utiliser Cypher pour écrire des requêtes personnalisées. Pour ça:
example_query_cypher.py dans le dossier analyses/example . $ python3 -m analyses.example.example_query_cypherPour plus d'informations, veuillez consulter ici.
Cette section décrit comment configurer et utiliser la mâchoire pour la détection de vulnérabilité et comment interpréter la sortie. La mâchoire contient, entre autres, des requêtes autonomes pour détecter le CSRF côté client et Dom Clobbering
Étape 1. Activez le composant d'analyse de la classe de vulnérabilité dans le fichier de configuration de saisie.
request_hijacking :
enabled : true
# [...]
open_redirect :
enabled : false
# [...]
domclobbering :
enabled : false
# [...]
cs_csrf :
enabled : false
# [...]Étape 2. Exécutez une instance du pipeline avec:
$ python3 -m run_pipeline --conf=config.yaml Indice. Vous pouvez exécuter plusieurs instances du pipeline sous différents 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 '
$ # [...] Pour générer automatiquement des fichiers de configuration parallèles, vous pouvez utiliser le script generate_config.py .
Les sorties seront stockées dans un fichier appelé sink.flows.out dans le même dossier que celui de l'entrée. Pour le CSRF côté client, par exemple, pour chaque demande HTTP détectée, la mâchoire produit une entrée marquant l'ensemble des types sémantiques (aka, étiquettes ou étiquettes sémantiques) associés aux éléments construisant la demande (c'est-à-dire les tranches de programme). Par exemple, une demande HTTP marquée du type sémantique ['WIN.LOC'] est pardonable par le point d'injection window.location . Cependant, une demande marquée de ['NON-REACH'] n'est pas pardonable.
Un exemple d'entrée de sortie est illustré ci-dessous:
[*] 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
Cette entrée montre que sur la ligne 29, il y a une expression de l'appel $.ajax , et cette expression d'appel déclenche une demande ajax avec la valeur de modèle URL de ajaxloc + "/bearer1234/ , où le paramètre ajaxloc est une tranche de programme en lisant sa valeur à la ligne 6 de window.location.href , donc pardonnable à ['WIN.LOC'] .
Afin de rationaliser le processus de test pour la mâchoire et de nous assurer que votre configuration est exacte, nous fournissons une application Web node.js simple avec laquelle vous pouvez tester la mâchoire.
Tout d'abord, installez les dépendances via:
$ cd tests/test-webapp
$ npm installEnsuite, exécutez l'application dans un nouvel écran:
$ screen -dmS jawwebapp bash -c ' PORT=6789 npm run devstart; exec sh 'Pour plus d'informations, visitez notre page Wiki ici. Vous trouverez ci-dessous une table des matières pour un accès rapide.
Les demandes de traction sont toujours les bienvenues. Ce projet est destiné à être un espace sûr et accueillant, et les contributeurs devraient adhérer au code de conduite des contributeurs.
Si vous utilisez la mâchoire pour la recherche universitaire, nous vous encourageons à citer l'article suivant:
@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},
}
La mâchoire a parcouru un long chemin et nous voulons donner à nos contributeurs un cri bien mérité ici!
@tmbbrbr, @ c01gide, @jndre et sepehr mirzaei.