Mafalda Ferreira, Miguel Monteiro, Tiago Brito, Miguel E. Coimbra, Nuno Santos, Limin Jia e José Fragoso Santos. 2024. Análise de vulnerabilidade estática eficiente para JavaScript com gráficos de dependência multiverso. https://doi.org/xxxx
A pasta de avaliação do artefato contém todas as instruções e scripts necessários para reproduzir os resultados e os números do artigo original.
| Mafalda Ferreira | José Fragoso Santos | Filipe Marques | Nuno Santos |
Graph.js é um scanner de vulnerabilidade estática especializado na análise de pacotes NPM e na detecção de vulnerabilidades de poluição no estilo de mancha e protótipo.
Seu fluxo de execução é composto por duas fases: construção de gráficos e consultas de gráfico . Na primeira fase, o Graph.js cria um gráfico de dependência multiverso (MDG) do programa a ser analisado. Essa estrutura de dados baseada em gráfico se unir à mesma representação a árvore de sintaxe abstrata, o gráfico de fluxo de controle e o gráfico de dependência de dados. Esta fase tem duas saídas:
Na segunda fase, o Graph.js importa o gráfico para um banco de dados de gráficos NEO4J e executa consultas gráficas, escritas em Cypher, para capturar padrões de código vulneráveis, por exemplo, caminhos de dependência de dados que conectam fontes não confiáveis a sumidouros perigosos.
Graph.js gera um gráfico usando o nó e usa o Neo4J para consultar o gráfico.
Ele pode ser executado localmente ou em um recipiente do docker (configuração mais fácil e mais robusta).
Construa o contêiner do docker executando o comando:
docker build -t graphjs .
Configure o ambiente local executando o comando:
./setup.sh
Graph.js fornece uma interface de linha de comando. Execute -o com -h para uma breve descrição.
Usage: ./graphjs_docker.sh -f <file> [options]
Description: Run Graph.js for a given file <file> in a Docker container.
Required:
-f <file> Filename (.js).
Options:
-o <path> Path to store analysis results.
-l Store docker logs.
-e Create exploit template.
-s Silent mode: Does not save graph .svg.
-h Print this help.Para executar graph.js, execute o comando:
./graphjs_docker.sh -f < file_to_analyze > [options]Graph.js fornece uma interface de linha de comando. Execute -o com -h para uma breve descrição.
Usage: graphjs.py [-h] -f FILE [-o OUTPUT] [-s] [-d] [-e]
Options:
-h, --help show this help message and exit
-f FILE, --file FILE Path to JavaScript file (.js) or directory containing JavaScript files for analysis.
-o OUTPUT, --output OUTPUT
Path to store all output files.
-s, --silent Silent mode - no console and graph output.
-d, --docker Query mode - executes neo4j in a docker container instead of running locally.
-e, --exploit Generates symbolic tests.Para executar graph.js, execute o comando:
python3 graphjs.py -f < file_to_analyze > [options]Por padrão, todos os resultados são armazenados em uma pasta GraphJS-Results , na raiz do projeto, com a seguinte estrutura:
graphjs-results
├── graph
│ ├── graph_stats.json (stores some metrics)
│ ├── nodes.csv (csv file of the graph nodes)
│ ├── rels.csv (csv file of the graph relationships)
│ └── normalized.js (normalized code)
└── taint_summary_detection.json (detection results)
O código graph.js foi projetado para permitir o uso direto por outras pessoas e pode ser facilmente adaptado para acomodar novos cenários. Conforme descrito anteriormente, o Graph.js é composto por duas fases: construção de gráficos e consultas gráficas. O código de construção do gráfico está localizado na pasta graphjs/parser/src , e os arquivos mais relevantes são organizados da seguinte forma:
src
├── parser.ts
├── output # Code to generate outputs (.csv and .svg)
├── traverse # Parsing algorithms
├── dependency
│ ├── structures/dependency_trackers.ts
│ └── dep_builder.ts
├── ast-builder.ts
├── cfg-builder.ts
└── cg-builder.ts
O código referente ao algoritmo de construção do MDG está localizado em src/traverse/dependency, where the file /dependency_trackers.ts` contém as regras e estruturas referidas no artigo. O MDG deve ser genérico, para que todas as etapas de construção possam ser adaptadas a novos cenários, criando novos tipos de nós e bordas.
O código das consultas está localizado na pasta graphjs/detection . As consultas são totalmente personalizáveis; portanto, é possível não apenas modificar as consultas existentes, mas também criar novas consultas que pesquisam padrões novos e diferentes no gráfico.
npm start -- -f < file_to_be_analyzed > [options]| Descrição | Bandeira | Padrão | Obrigatório | Requer |
|---|---|---|---|---|
| Arquivo javascript a ser analisado | -f | - | Sim | - |
| Localização do arquivo de configuração | -C | '../config.json' | Não | - |
| Localização do arquivo normalizado | -o | - | Não | - |
| Localização do diretório de saída do gráfico (arquivos CSV e SVG) | -g | 'src/gráficos/' | Não | - |
| Saia os arquivos CSV do gráfico | --CSV | falso | Não | - |
| Saia da figura do gráfico | --gráfico | falso | Não | - |
| Defina uma matriz de estruturas a serem ignoradas na figura do gráfico | --i = [ast, cfg ...] | [] | Não | gráfico |
| Defina uma variedade de funções para ignorar na figura do gráfico | --if = [...] | [] | Não | gráfico |
| Mostre o código em cada instrução na figura do gráfico | --SC | falso | Não | gráfico |
| Modo silencioso (não detalhado) | -Silent | falso | Não | - |
O desenvolvimento do Graph.js refere -se a pesquisas adicionais realizadas por este grupo.
Este trabalho compreende um estudo empírico das ferramentas de análise de código estático para detectar vulnerabilidades no código Node.js. Criamos um conjunto de dados com curadoria de vulnerabilidades de código 957 Node.js, caracterizadas e anotadas pela análise das informações contidas nos relatórios consultivos do NPM .
O conjunto de dados está disponível aqui.
A publicação associada a este trabalho é:
@inproceedings{vulcan_tor,
author = {Brito, Tiago and Ferreira, Mafalda and Monteiro, Miguel and Lopes, Pedro and Barros, Miguel and Santos, José Fragoso and Santos, Nuno},
booktitle = {IEEE Transactions on Reliability},
title = {Study of JavaScript Static Analysis Tools for Vulnerability Detection in Node.js Packages},
year = {2023},
pages = {1-16},
doi = {10.1109/TR.2023.3286301},
}
Neste trabalho, desenvolvemos um protótipo de regime de regras, um sistema de conformidade com políticas com reconhecimento de GDPR para estruturas da web. O RuleKeeper usa o Graph.js para verificar automaticamente a presença de bugs de conformidade do GDPR nos servidores Node.js.
O protótipo está disponível aqui.
A publicação associada a este trabalho é:
@inproceedings{ferreira_sp23,
author = {Ferreira, Mafalda and Brito, Tiago and Santos, José Fragoso and Santos, Nuno},
title = {RuleKeeper: GDPR-Aware Personal Data Compliance for Web Frameworks},
booktitle = {Proceedings of 44th IEEE Symposium on Security and Privacy (S&P'23)},
year = {2023},
doi = {10.1109/SP46215.2023.00058},
pages = {1014-1031},
publisher = {IEEE Computer Society},
address = {Los Alamitos, CA, USA},
}