Mafalda Ferreira, Miguel Monteiro, Tiago Brito, Miguel E. Coimbra, Nuno Santos, Limin Jia et José Fragoso Santos. 2024. Analyse efficace de la vulnérabilité statique pour JavaScript avec des graphiques de dépendance multiversion. https://doi.org/xxxx
Le dossier d'évaluation des artefacts contient toutes les instructions et scripts nécessaires pour reproduire les résultats et les figures du papier d'origine.
| Mafalda Ferreira | José Fragoso Santos | Marques Filipe | Nuno Santos |
Graph.js est un scanner de vulnérabilité statique spécialisé dans l'analyse des packages NPM et la détection des vulnérabilités de la pollution de style et prototype.
Son flux d'exécution est composé de deux phases: la construction du graphique et les requêtes de graphique . Dans la première phase, Graph.js construit un graphique de dépendance multiversion (MDG) du programme à analyser. Cette structure de données basée sur des graphiques fusionne dans la même représentation l'arborescence de syntaxe abstraite, le graphique de flux de contrôle et le graphique de dépendance des données. Cette phase a deux sorties:
Dans la deuxième phase, Graph.js importe le graphique dans une base de données de graphiques NEO4J et exécute des requêtes de graphique, écrites dans Cypher, pour capturer des modèles de code vulnérables, par exemple, les chemins de dépendance des données reliant des sources peu fiables à des éviers dangereux.
Graph.js génère un graphique utilisant le nœud et utilise Neo4j pour interroger le graphique.
Il peut être exécuté localement ou dans un conteneur Docker (configuration plus facile et plus robuste).
Construisez le conteneur Docker en exécutant la commande:
docker build -t graphjs .
Configurez l'environnement local en exécutant la commande:
./setup.sh
Graph.js fournit une interface de ligne de commande. Exécutez-le avec -h pour une courte description.
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.Pour exécuter graph.js, exécutez la commande:
./graphjs_docker.sh -f < file_to_analyze > [options]Graph.js fournit une interface de ligne de commande. Exécutez-le avec -h pour une courte description.
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.Pour exécuter graph.js, exécutez la commande:
python3 graphjs.py -f < file_to_analyze > [options]Par défaut, tous les résultats sont stockés dans un dossier GraphJS-Results , à la racine du projet, avec la structure suivante:
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)
Le code Graph.js est conçu pour permettre une utilisation simple par d'autres et peut être facilement adapté pour accueillir de nouveaux scénarios. Comme décrit précédemment, Graph.js est composé de deux phases: la construction du graphique et les requêtes graphiques. Le code de construction de graphiques est situé dans le dossier graphjs/parser/src , et les fichiers les plus pertinents sont organisés comme suit:
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
Le code faisant référence à l'algorithme de construction MDG est situé dans src/traverse/dependency, where the file / Dependency_trackers.ts` contient les règles et structures référées dans l'article. Le MDG est destiné à être générique, de sorte que toutes les étapes de construction peuvent être adaptées à de nouveaux scénarios en créant de nouveaux types de nœuds et de bords.
Le code des requêtes est situé dans le dossier graphjs/detection . Les requêtes sont entièrement personnalisables, il est donc possible non seulement modifier les requêtes existantes, mais aussi pour créer de nouvelles requêtes qui recherchent de nouveaux modèles et différents dans le graphique.
npm start -- -f < file_to_be_analyzed > [options]| Description | Drapeau | Défaut | Requis | Nécessite |
|---|---|---|---|---|
| Fichier JavaScript à analyser | -f | - | Oui | - |
| Emplacement du fichier de configuration | -C | '../config.json' | Non | - |
| Emplacement du fichier normalisé | -o | - | Non | - |
| Emplacement du répertoire de sortie du graphique (fichiers CSV et SVG) | -g | 'src / graphs /' | Non | - |
| Sortir les fichiers de CSV graphiques | --CSV | FAUX | Non | - |
| Sortir la figure du graphique | --graphique | FAUX | Non | - |
| Définissez le tableau de structures à ignorer dans la figure du graphique | --i = [ast, cfg ...] | [] | Non | graphique |
| Définissez le tableau de fonctions à ignorer dans la figure du graphique | --if = [...] | [] | Non | graphique |
| Afficher le code dans chaque instruction de la figure graphique | - SC | FAUX | Non | graphique |
| Mode silencieux (pas verbeux) | --silencieux | FAUX | Non | - |
Le développement de Graph.js se rapporte à des recherches supplémentaires effectuées par ce groupe.
Ce travail comprend une étude empirique des outils d'analyse de code statique pour détecter les vulnérabilités dans le code Node.js. Nous avons créé un ensemble de données organisé de vulnérabilités de code Node.js 957, caractérisées et annotées en analysant les informations contenues dans les rapports consultatifs NPM .
L'ensemble de données est disponible ici.
La publication associée à ce travail est:
@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},
}
Dans ce travail, nous avons développé un prototype de RuleKeeper, un système de conformité de politique AwAP-Aware Aware pour les cadres Web. RuleKeeper utilise Graph.js pour vérifier automatiquement la présence de bogues de conformité RGPD dans les serveurs Node.js.
Le prototype est disponible ici.
La publication associée à ce travail est:
@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},
}