Mafalda Ferreira, Miguel Monteiro, Tiago Brito, Miguel E. Coimbra, Nuno Santos, Limin Jia y José Fragoso Santos. 2024. Análisis eficiente de vulnerabilidad estática para JavaScript con gráficos de dependencia multiversión. https://doi.org/xxxx
La carpeta de evaluación de artefactos contiene todas las instrucciones y scripts necesarios utilizados para reproducir los resultados y las figuras del documento original.
| Mafalda Ferreira | José Fragoso Santos | Marques Filipe | Nuno santos |
Graph.js es un escáner de vulnerabilidad estático especializado en el análisis de los paquetes de NPM y la detección de vulnerabilidades de contaminación de estilo Taint y prototipo.
Su flujo de ejecución está compuesto por dos fases: construcción de gráficos y consultas de gráficos . En la primera fase, Graph.js construye un gráfico de dependencia de multiversión (ODM) del programa a analizar. Esta estructura de datos basada en gráficos se fusiona en la misma representación el árbol de sintaxis abstracto, el gráfico de flujo de control y el gráfico de dependencia de datos. Esta fase tiene dos salidas:
En la segunda fase, Graph.js importa el gráfico a una base de datos de gráficos Neo4J y ejecuta consultas de gráficos, escritas en Cypher, para capturar patrones de código vulnerables, por ejemplo, rutas de dependencia de datos que conectan fuentes poco confiables con sumideros peligrosos.
Graph.js genera un gráfico usando el nodo y usa Neo4J para consultar el gráfico.
Se puede ejecutar localmente o en un contenedor Docker (configuración más fácil y más robusta).
Construya el contenedor Docker ejecutando el comando:
docker build -t graphjs .
Configure el entorno local ejecutando el comando:
./setup.sh
Graph.js proporciona una interfaz de línea de comandos. Ejecutarlo con -h para una descripción breve.
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 ejecutar Graph.js, ejecute el comando:
./graphjs_docker.sh -f < file_to_analyze > [options]Graph.js proporciona una interfaz de línea de comandos. Ejecutarlo con -h para una descripción breve.
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 ejecutar Graph.js, ejecute el comando:
python3 graphjs.py -f < file_to_analyze > [options]De manera predeterminada, todos los resultados se almacenan en una carpeta GraphJS-Results , en la raíz del proyecto, con la siguiente estructura:
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)
El código Graph.JS está diseñado para habilitar el uso directo de otros, y se puede adaptar fácilmente para acomodar nuevos escenarios. Como se describió anteriormente, Graph.js se compone de dos fases: construcción de gráficos y consultas de gráficos. El código de construcción del gráfico se encuentra en la carpeta graphjs/parser/src , y los archivos más relevantes se organizan de la siguiente manera:
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
El código que se refiere al algoritmo de construcción de MDG se encuentra en src/traverse/dependency, where the file /dependencia_trackers.ts` contienen las reglas y estructuras referidas en el documento. El OMD está destinado a ser genérico, por lo que todos los pasos del edificio se pueden adaptar a nuevos escenarios mediante la creación de nuevos tipos de nodos y bordes.
El código para las consultas está ubicada en la carpeta graphjs/detection . Las consultas son completamente personalizables, por lo que es posible no solo modificar las consultas existentes sino también para crear nuevas consultas que buscan patrones nuevos y diferentes en el gráfico.
npm start -- -f < file_to_be_analyzed > [options]| Descripción | Bandera | Por defecto | Requerido | Requerimiento |
|---|---|---|---|---|
| Archivo JavaScript para analizar | -F | - | Sí | - |
| Ubicación del archivo de configuración | -do | '../config.json' | No | - |
| Ubicación del archivo normalizado | -O | - | No | - |
| Ubicación del directorio de salida del gráfico (archivos CSV y SVG) | -gramo | 'Src/Graphs/' | No | - |
| Emitir los archivos CSV gráficos | -csv | FALSO | No | - |
| Emitir la figura del gráfico | --gráfico | FALSO | No | - |
| Establezca la matriz de estructuras para ignorar en la figura gráfica | --i = [AST, CFG ...] | [] | No | gráfico |
| Establezca la variedad de funciones para ignorar en la figura gráfica | --if = [...] | [] | No | gráfico |
| Mostrar el código en cada declaración en la figura gráfica | --Carolina del Sur | FALSO | No | gráfico |
| Modo silencioso (no detallado) | --silencioso | FALSO | No | - |
El desarrollo de Graph.js se relaciona con una investigación adicional realizada por este grupo.
Este trabajo comprende un estudio empírico de herramientas de análisis de código estático para detectar vulnerabilidades en el código Node.js. Creamos un conjunto de datos curado de las vulnerabilidades de código 957 Node.js, caracterizados y anotados analizando la información contenida en los informes de asesoramiento de NPM .
El conjunto de datos está disponible aquí.
La publicación asociada con este trabajo es:
@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},
}
En este trabajo, desarrollamos un prototipo de gobernador, un sistema de cumplimiento de políticas consciente de GDPR para marcos web. Reglekeeper usa Graph.js para verificar automáticamente la presencia de errores de cumplimiento de GDPR en los servidores Node.js.
El prototipo está disponible aquí.
La publicación asociada con este trabajo es:
@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},
}