Nous proposons un outil pour analyser statiquement le code JavaScript. À cette fin, nous construisons l'AST (arborescence de syntaxe abstraite) d'un fichier JavaScript d'entrée. Pour raisonner sur les conditions qui doivent être remplies pour un chemin d'exécution spécifique à emprunter, nous ajoutons par la suite des bords d'écoulement de contrôle à l'AST. Nous appelons le graphique résultant comme le CFG (graphique de flux de contrôle). Ensuite, pour raisonner sur les dépendances variables, nous ajoutons des bords de flux de données au CFG. Enfin, pour calculer les valeurs variables, nous effectuons une analyse de pointeur. Nous appelons le graphique résultant comme le PDG (graphique de dépendance du programme).
S'il vous plaît, notez que dans son état actuel, le code est un POC et non une API à part entière prête pour la production.
Nous adoptons une définition du CFG qui diffère légèrement des Allen car nous améliorons notre AST avec des bords d'écoulement de contrôle. De cette façon, nous construisons une structure conjointe qui combine les informations de flux de contrôle avec les nœuds et les bords AST à grain fin. Notre PDG diffère également légèrement de la définition de Ferrante et al. Comme nous avons choisi d'ajouter des bords de flux de données à notre CFG. De cette façon, nous conservons des informations concernant l'ordre des déclarations et avons une représentation à grain fin des flux de données directement au niveau variable (car nous construisons le CFG sur l'AST).
Des détails supplémentaires peuvent être trouvés dans ma thèse.
Ce code a été utilisé pour analyser statiquement les extensions du navigateur. Voir Doublex Paper & Code.
Les versions préliminaires de ce code ont également été utilisées pour détecter les échantillons de JavaScript malveillant: Hidenoseek Paper & Code et JSTAP Paper & Code.
Et pour étudier les techniques de transformation du code JavaScript: papier et code.
install python3 # (tested with 3.7.3 and 3.7.4)
install nodejs
install npm
cd src
npm install esprima # (tested with 4.0.1)
npm install escodegen # (tested with 1.14.2 and 2.0.0)
Pour installer Graphviz (uniquement pour les graphiques de dessin, non encore documentés, veuillez ouvrir un problème si vous êtes intéressé)
pip3 install graphviz
On MacOS: install brew and then brew install graphviz
On Linux: sudo apt-get install graphviz
Pour générer le PDG d'un fichier * .js spécifique, lancez les commandes Python3 suivantes à partir de l'emplacement du dossier src :
>>> from build_pdg import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict())
Par défaut, le PDG correspondant ne sera pas stocké. Pour le stocker dans un dossier PDG_PATH existant , appelez:
$ python3 -c "from build_pdg import get_data_flow; get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')"
Notez que nous avons ajouté un délai d'expiration de 10 min pour l'analyse de flux de données / pointeur (cf. ligne 149 de src/build_pdg.py ), et une limite de mémoire de 20 Go (cf. ligne 115 de src/build_pdg.py ).
Prenons un DIR contenant plusieurs fichiers JavaScript à analyser. Pour générer les PDG (= AST améliorés avec le contrôle et le flux de données, et l'analyse du pointeur) de tous ces fichiers, lancez la commande shell suivante à partir de l'emplacement du dossier src :
$ python3 -c "from build_pdg import store_pdg_folder; store_pdg_folder('DIR')"
Les PDG correspondants seront stockés dans DIR/PDG .
Actuellement, nous utilisons 1 CPU, mais vous pouvez le modifier en modifiant la variable num_workers de src/utility_df.py (la ligne 51 ).
Ce projet est concédé sous licence de la licence AGPL3, que vous pouvez trouver dans LICENSE .