
MANDÍBULA
Site | DOCs | Configuração | RAUTLER | Docker de início rápido (exemplo)
Uma implementação de protótipo de código aberto de gráficos de propriedades para JavaScript baseado no analisador Esprima e na especificação Estree Spidermonkey. A mandíbula pode ser usada para analisar o lado do cliente de aplicativos da Web e programas baseados em JavaScript.
Este projeto é licenciado sob GNU AFFERO GENERAL PUBLIC LICENSE V3.0 . Veja aqui para obter mais informações.
O JAW possui um site de páginas do Github disponível em https://soheilkhodayari.github.io/jaw/.
Notas de lançamento:
JAW-V2 .JAW-V1 .A arquitetura da mandíbula é mostrada abaixo.

A mandíbula pode ser usada de duas maneiras distintas:
Análise arbitrária de JavaScript: Utilize a mandíbula para modelar e analisar qualquer programa JavaScript, especificando o path do sistema de arquivos do programa.
Análise de Aplicativos da Web: Analise um aplicativo da Web fornecendo um único URL de semente.
Use os recursos da Web coletados para criar um gráfico de programa híbrido (HPG), que será importado para um banco de dados NEO4J.
Opcionalmente, forneça ao módulo de construção do HPG um mapeamento de tipos semânticos para os tokens de linguagem JavaScript personalizados, facilitando a categorização das funções JavaScript com base em seu objetivo (por exemplo, funções de solicitação HTTP).
Consulte o banco de dados de gráficos Neo4j construído para várias análises. A mandíbula oferece travessias utilitárias para análise de fluxo de dados, análise de fluxo de controle, análise de acessibilidade e correspondência de padrões. Esses travessos podem ser usados para desenvolver análises de segurança personalizadas.
O JAW também inclui travessias internas para detectar CSRF do lado do cliente, Dom Clobbering e solicitar vulnerabilidades de seqüestro.
As saídas serão armazenadas na mesma pasta da entrada.
O script de instalação depende dos seguintes pré -requisitos:
npm package manager (nó JS)python 3.xpipPosteriormente, instale as dependências necessárias via:
$ ./install.sh Para instruções detailed de instalação, consulte aqui.
Você pode executar uma instância do pipeline em uma tela de segundo plano via:
$ python3 -m run_pipeline --conf=config.yamlA CLI fornece as seguintes opções:
$ 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)
Config de entrada: o JAW espera um arquivo de configuração .yaml como entrada. Consulte Config.yaml para um exemplo.
Dica. O arquivo de configuração especifica passes diferentes (por exemplo, rastejamento, análise estática, etc), que podem ser ativados ou desativados para cada classe de vulnerabilidade. Isso permite a execução dos blocos de construção de ferramentas individualmente ou em uma ordem diferente (por exemplo, rasteje todos os WebApps primeiro e depois conduza a análise de segurança).
Para executar um exemplo rápido, demonstrando como criar um gráfico de propriedades e executar consultas de cifra sobre ele, faça:
$ python3 -m analyses.example.example_analysis --input= $( pwd ) /data/test_program/test.jsEste módulo coleta os dados (isto é, código JavaScript e valores estaduais das páginas da Web) necessários para testes. Se você deseja testar um arquivo javascipt específico que você já possui no seu sistema de arquivos, poderá pular esta etapa.
Jaw tem rastreadores baseados em selênio (JAW-V1), marionetista (Jaw-V2, V3) e dramaturgo (JAW-V3). Para a maioria dos recursos atualizados, é recomendável usar as versões baseadas em bonecos ou dramaturgos.
Este rastreador da Web emprega a Foxhound, uma versão instrumentada do Firefox, para executar o rastreamento dinâmico de mancha enquanto navega através de páginas da web. Para começar o rastreador, faça:
$ cd crawler
$ node crawler-taint.js --seedurl=https://google.com --maxurls=100 --headless=true --foxhoundpath= < optional-foxhound-executable-path > O foxhoundpath é, por padrão, definido para o seguinte diretório: crawler/foxhound/firefox que contém um binário chamado firefox .
Nota: Você precisa de uma construção do Foxhound para usar esta versão. Uma compilação do Ubuntu está incluída na versão JAW-V3.
Para começar o rastreador, faça:
$ cd crawler
$ node crawler.js --seedurl=https://google.com --maxurls=100 --browser=chrome --headless=trueVeja aqui para obter mais informações.
Para começar o rastreador, faça:
$ 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 a documentação do hpg_crawler AQUI para obter mais informações.
Para gerar um HPG para um determinado (conjunto de) arquivos JavaScript, faça: faça:
$ 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 um HPG dentro de um banco de dados de gráficos Neo4J (Instância do Docker), faça:
$ 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 criar um gráfico de propriedades híbridas para a saída do hpg_crawler e importá -lo dentro de uma instância local Neo4J, você também pode fazer:
$ 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 >Especificação de parâmetros:
<path> : caminho absoluto para a pasta que contém os arquivos de programa para análise (deve estar na pasta do engine/outputs ).--js=<program.js> : Nome do programa JavaScript for Analysis (padrão: js_program.js ).--import=<bool> : se o gráfico de propriedades construído deve ser importado para um banco de dados NEO4J ativo (padrão: true).--hybrid=bool : se o modo híbrido está ativado (padrão: false ). Isso implica que o testador deseja enriquecer o gráfico da propriedade, inserindo arquivos para qualquer um dos instantâneos HTML, eventos demitidos, solicitações HTTP e cookies, conforme coletado pelo rastreador da mandíbula.--reqs=<requests.out> : Somente para o modo híbrido, nome do arquivo que contém a sequência de solicitações de rede obseverada, passe a string false para excluir (padrão: request_logs_short.out ).--evts=<events.out> : Somente para o modo híbrido, nome do arquivo que contém a sequência de eventos disparados, passe a sequência false para excluir (padrão: events.out ).--cookies=<cookies.pkl> : Somente para o modo híbrido, nome do arquivo que contém os cookies, passe a sequência false para excluir (padrão: cookies.pkl ).--html=<html_snapshot.html> : Somente para o modo híbrido, nome do arquivo que contém o instantâneo da árvore dom, passe a sequência false para excluir (padrão: html_rendered.html ).Para obter mais informações, você pode usar a ajuda da CLI fornecida com a API de construção de gráficos:
$ python3 -m engine.api -hO HPG construído pode ser consultado usando o Cypher ou o Neomodel ORM.
Você deve colocar e executar suas consultas em analyses/<ANALYSIS_NAME> .
Você pode usar o neomodelo ORM para consultar o HPG. Para escrever uma consulta:
example_query_orm.py Na pasta analyses/example . $ python3 -m analyses.example.example_query_orm Para mais informações, consulte aqui.
Você pode usar o Cypher para escrever consultas personalizadas. Por esta:
example_query_cypher.py Na pasta analyses/example . $ python3 -m analyses.example.example_query_cypherPara mais informações, consulte aqui.
Esta seção descreve como configurar e usar mandíbula para detecção de vulnerabilidades e como interpretar a saída. Jaw contém, entre outros, consultas independentes para detectar CSRF do lado do cliente e Dom Clobbering
Etapa 1. Habilite o componente de análise para a classe de vulnerabilidade no arquivo de configuração de entrada.yaml:
request_hijacking :
enabled : true
# [...]
open_redirect :
enabled : false
# [...]
domclobbering :
enabled : false
# [...]
cs_csrf :
enabled : false
# [...]Etapa 2. Execute uma instância do pipeline com:
$ python3 -m run_pipeline --conf=config.yaml Dica. Você pode executar várias instâncias do pipeline em 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 gerar arquivos de configuração paralela automaticamente, você pode usar o script generate_config.py .
As saídas serão armazenadas em um arquivo chamado sink.flows.out na mesma pasta que a entrada. Para o CSRF do lado do cliente, por exemplo, para cada solicitação HTTP detectada, a JAW produz uma entrada marcando o conjunto de tipos semânticos (também conhecidos como etiquetas ou etiquetas semânticas) associadas aos elementos que construíram a solicitação (ou seja, as fatias do programa). Por exemplo, uma solicitação HTTP marcada com o tipo semântico ['WIN.LOC'] é perdoável através da window.location . Ponto de injeção de localização. No entanto, uma solicitação marcada com ['NON-REACH'] não é perdoável.
Um exemplo de entrada de saída é mostrado abaixo:
[*] 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 mostra que, na linha 29, existe uma expressão de chamada de $.ajax , e essa expressão de chamada desencadeia uma solicitação ajax com o valor do modelo URL de ajaxloc + "/bearer1234/ , onde o parâmetro ajaxloc é um programa que lê seu valor na linha 6 da window.location.href , portanto, esquecida por ['WIN.LOC'] .
Para otimizar o processo de teste da mandíbula e garantir que sua configuração seja precisa, fornecemos um aplicativo Web node.js simples com o qual você pode testar o JAW.
Primeiro, instale as dependências via:
$ cd tests/test-webapp
$ npm installEm seguida, execute o aplicativo em uma nova tela:
$ screen -dmS jawwebapp bash -c ' PORT=6789 npm run devstart; exec sh 'Para mais informações, visite nossa página wiki aqui. Abaixo está um índice para acesso rápido.
Solicitações de tração são sempre recebidas. Este projeto deve ser um espaço seguro e acolhedor, e os colaboradores devem aderir ao código de conduta dos colaboradores.
Se você usar a mandíbula para pesquisa acadêmica, incentivamos você a citar o seguinte artigo:
@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 percorreu um longo caminho e queremos dar aos nossos colaboradores um grito bem merecido aqui!
@tmbrbr, @c01gide, @jndre e sepehr mirzaei.