
MANDÍBULA
Sitio web | Docios | Configuración | Rastreador | Inicio rápido Docker (ejemplo)
Una implementación prototipo de fuente abierta de gráficos de propiedades para JavaScript basado en el analizador ESPRIMA y la especificación Estree Spidermonkey. Se puede utilizar JAW para analizar el lado del cliente de aplicaciones web y programas basados en JavaScript.
Este proyecto tiene licencia bajo GNU AFFERO GENERAL PUBLIC LICENSE V3.0 . Vea aquí para obtener más información.
Jaw tiene un sitio web de Pages Github disponible en https://soheilkhodayari.github.io/jaw/.
Notas de la versión:
JAW-V2 .JAW-V1 .La arquitectura de la mandíbula se muestra a continuación.

La mandíbula se puede usar de dos maneras distintas:
Análisis arbitrario de JavaScript: utilice JAW para modelar y analizar cualquier programa de JavaScript especificando la path del sistema de archivos del programa.
Análisis de aplicaciones web: analice una aplicación web proporcionando una sola URL de semillas.
Use los recursos web recopilados para crear un gráfico de programa híbrido (HPG), que se importará a una base de datos NEO4J.
Opcionalmente, proporcione al módulo de construcción HPG una asignación de tipos semánticos a tokens de lenguaje JavaScript personalizados, facilitando la categorización de funciones de JavaScript en función de su propósito (por ejemplo, funciones de solicitud HTTP).
Consulte la base de datos de gráficos Neo4j construida para varios análisis. JAW ofrece recorridos de utilidad para análisis de flujo de datos, análisis de flujo de control, análisis de accesibilidad y coincidencia de patrones. Estos recorridos se pueden utilizar para desarrollar análisis de seguridad personalizados.
Jaw también incluye transversales incorporados para detectar CSRF del lado del cliente, DOM Clobbering y vulnerabilidades de secuestro de solicitudes.
Las salidas se almacenarán en la misma carpeta que la de la entrada.
El script de instalación se basa en los siguientes requisitos previos:
npm package manager (nodo JS)python 3.xpipPosteriormente, instale las dependencias necesarias a través de:
$ ./install.sh Para obtener instrucciones de instalación detailed , consulte aquí.
Puede ejecutar una instancia de la tubería en una pantalla de fondo a través de:
$ python3 -m run_pipeline --conf=config.yamlLa CLI proporciona las siguientes opciones:
$ 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)
Configuración de entrada: Jaw espera un archivo de configuración .yaml como entrada. Consulte config.yaml para un ejemplo.
Pista. El archivo de configuración especifica diferentes pases (por ejemplo, rastreo, análisis estático, etc.) que se pueden habilitar o deshabilitar para cada clase de vulnerabilidad. Esto permite ejecutar los bloques de construcción de herramientas individualmente, o en un orden diferente (por ejemplo, rastrear todas las aplicaciones web primero, luego realizar análisis de seguridad).
Para ejecutar un ejemplo rápido que demuestre cómo construir un gráfico de propiedades y ejecutar consultas de Cypher sobre él, haga:
$ python3 -m analyses.example.example_analysis --input= $( pwd ) /data/test_program/test.jsEste módulo recopila los datos (es decir, el código JavaScript y los valores de estado de las páginas web) necesarios para las pruebas. Si desea probar un archivo Javascipt específico que ya tiene en su sistema de archivos, puede omitir este paso.
Jaw tiene rastreadores basados en Selenium (Jaw-V1), Puppeteer (Jaw-V2, V3) y dramaturgo (Jaw-V3). Para la mayoría de las características actualizadas, se recomienda utilizar las versiones con sede en Puppeteer o Playwright.
Este rastreador web emplea a Foxhound, una versión instrumentada de Firefox, para realizar un seguimiento dinámico de contaminación mientras navega a través de páginas web. Para comenzar el rastreador, haz:
$ cd crawler
$ node crawler-taint.js --seedurl=https://google.com --maxurls=100 --headless=true --foxhoundpath= < optional-foxhound-executable-path > El foxhoundpath se establece, por defecto, en el siguiente directorio: crawler/foxhound/firefox que contiene un binario llamado firefox .
Nota: Necesita una compilación de Foxhound para usar esta versión. Una construcción de Ubuntu se incluye en el lanzamiento de Jaw-V3.
Para comenzar el rastreador, haz:
$ cd crawler
$ node crawler.js --seedurl=https://google.com --maxurls=100 --browser=chrome --headless=trueVea aquí para obtener más información.
Para comenzar el rastreador, haz:
$ 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 Consulte la documentación del hpg_crawler aquí para obtener más información.
Para generar un HPG para un (s) archivo (s) JavaScript dado (s), hacer: 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)
Para importar un HPG dentro de una base de datos de gráficos NEO4J (instancia de Docker), do:
$ 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)
Para crear un gráfico de propiedades híbridas para la salida del hpg_crawler e importarlo dentro de una instancia local de NEO4J, también puede hacer:
$ 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 >Especificación de parámetros:
<path> : ruta absoluta a la carpeta que contiene los archivos de programa para el análisis (debe estar debajo de la carpeta engine/outputs ).--js=<program.js> : nombre del programa JavaScript para el análisis (predeterminado: js_program.js ).--import=<bool> : si el gráfico de propiedades construidas debe importarse a una base de datos NEO4J activa (predeterminado: verdadero).--hybrid=bool : si el modo híbrido está habilitado (predeterminado: false ). Esto implica que el probador desea enriquecer el gráfico de propiedades ingresando archivos para cualquiera de las instantáneas HTML, eventos disparados, solicitudes HTTP y cookies, según lo recopilado por el rastreador de la mandíbula.--reqs=<requests.out> : solo para modo híbrido, el nombre del archivo que contiene la secuencia de solicitudes de red OBSEvered, pase la cadena false para excluir (predeterminado: request_logs_short.out ).--evts=<events.out> : solo para modo híbrido, el nombre del archivo que contiene la secuencia de eventos disparados, pase la cadena false para excluir (predeterminado: events.out ).--cookies=<cookies.pkl> : solo para modo híbrido, el nombre del archivo que contiene las cookies, pase la cadena false para excluir (predeterminado: cookies.pkl ).--html=<html_snapshot.html> : solo para modo híbrido, el nombre del archivo que contiene la instantánea del árbol DOM, pase la cadena false para excluir (predeterminado: html_rendered.html ).Para obtener más información, puede usar la CLI de ayuda proporcionada con la API de construcción de gráficos:
$ python3 -m engine.api -hEl HPG construido se puede consultar usando Cypher o el neomodel ORM.
Debe colocar y ejecutar sus consultas en analyses/<ANALYSIS_NAME> .
Puede usar el neomodel ORM para consultar el HPG. Para escribir una consulta:
example_query_orm.py en la carpeta analyses/example . $ python3 -m analyses.example.example_query_orm Para obtener más información, consulte aquí.
Puede usar Cypher para escribir consultas personalizadas. Para esto:
example_query_cypher.py en la carpeta analyses/example . $ python3 -m analyses.example.example_query_cypherPara obtener más información, consulte aquí.
Esta sección describe cómo configurar y usar la mandíbula para la detección de vulnerabilidad, y cómo interpretar la salida. Jaw contiene, entre otras, consultas autónomos para detectar CSRF del lado del cliente y DOM Clobbering
Paso 1. Habilite el componente de análisis para la clase de vulnerabilidad en el archivo de entrada config.yaml:
request_hijacking :
enabled : true
# [...]
open_redirect :
enabled : false
# [...]
domclobbering :
enabled : false
# [...]
cs_csrf :
enabled : false
# [...]Paso 2. Ejecute una instancia de la tubería con:
$ python3 -m run_pipeline --conf=config.yaml Pista. Puede ejecutar múltiples instancias de la tubería en diferentes screen S:
$ 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 '
$ # [...] Para generar archivos de configuración paralelos automáticamente, puede usar el script generate_config.py .
Las salidas se almacenarán en un archivo llamado sink.flows.out en la misma carpeta que la de la entrada. Para el CSRF del lado del cliente, por ejemplo, para cada solicitud HTTP detectada, la mandíbula emite una entrada que marca el conjunto de tipos semánticos (también conocidos como, etiquetas o etiquetas semánticas) asociados con los elementos que construyen la solicitud (es decir, los cortes del programa). Por ejemplo, una solicitud HTTP marcada con el tipo semántico ['WIN.LOC'] es perdonable a través de la window.location Punto de inyección de ubicación. Sin embargo, una solicitud marcada con ['NON-REACH'] no es perdonable.
A continuación se muestra una entrada de salida de ejemplo:
[*] 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
Esta entrada muestra que en la línea 29, hay una expresión de llamadas $.ajax , y esta expresión de llamadas desencadena una solicitud ajax con el valor de plantilla de URL de ajaxloc + "/bearer1234/ , donde el parámetro ajaxloc es una porción de programa que lee su valor en la línea 6 desde ['WIN.LOC'] window.location.href .
Para optimizar el proceso de prueba para JAW y asegurarnos de que su configuración sea precisa, proporcionamos una aplicación web node.js simple con la que puede probar JAW.
Primero, instale las dependencias a través de:
$ cd tests/test-webapp
$ npm installLuego, ejecute la aplicación en una nueva pantalla:
$ screen -dmS jawwebapp bash -c ' PORT=6789 npm run devstart; exec sh 'Para obtener más información, visite nuestra página Wiki aquí. A continuación se muestra una tabla de contenido para acceso rápido.
Las solicitudes de extracción siempre son bienvenidas. Este proyecto está destinado a ser un espacio seguro y acogedor, y se espera que los contribuyentes se adhieran al Código de Conducta de los contribuyentes.
Si usa la mandíbula para la investigación académica, le recomendamos que cite el siguiente documento:
@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 ha recorrido un largo camino y queremos dar a nuestros contribuyentes un merecido saludo aquí!
@tmbrbr, @c01gide, @jndre y sepehr mirzaei.