Ce référentiel contient la majeure partie du code de notre article CCS'19: "Hidenoseek: Camouflager Javascript malveillant en asts bénins", à savoir:
Veuillez noter que dans son état actuel, le code est un POC et non une API à part entière pour la production.
Hidenoseek est une nouvelle attaque de camouflage générique, qui modifie les constructions d'échantillons JavaScript malveillants pour reproduire exactement une syntaxe bénigne existante. À cette fin, nous améliorons statiquement les arbres de syntaxe abstraits (AST) des entrées JavaScript valides avec des informations de contrôle et de flux de données. Nous appelons la structure de données résultante comme graphique de dépendance du programme (PDG). En particulier, Hidenoseek recherche des sous-graphes isomorphes entre les fichiers malveillants et bénignes. Plus précisément, il remplace les sous-actes bénins par leurs équivalents malveillants (même structure syntaxique) et ajuste les dépendances bénignes des données - sans modification de l'AST -, de sorte que la sémantique malveillante est conservée.
Pour des raisons éthiques, nous avons décidé de publier ni le code complet de notre module de sélection de clone ni notre module de remplacement de clone. Par conséquent, cette version Hidenoseek peut être utilisée pour détecter les clones syntaxiques, mais pas pour les réécrire .
install python3 # (tested with 3.6.7)
install nodejs # (tested with 8.10.0)
install npm # (tested with 3.5.2)
cd src
npm install escodegen # (tested with 1.9.1)
cd ..
Hidenoseek fonctionne directement au niveau PDG. Pour détecter les clones entre 2 dossiers JavaScript, vous devez générer les PDG au préalable (CF. Génération PDGS) et les donner comme entrée à la fonction src/samples_generation.replace_ast_df_folder .
Pour détecter les clones entre 2 échantillons JavaScript, vous devez donner les chemins des fichiers directement en entrée à la fonction src/samples_generation.replace_ast .
Pour générer les PDG des fichiers JS à partir du dossier Folder_name, lancez la commande shell suivante à partir de l'emplacement du dossier src :
$ python3 -c "from pdgs_generation import store_pdg_folder; store_pdg_folder('FOLDER_NAME')"
Les PDG correspondants seront stockés dans Folder_name / PDG.
Pour générer le PDG d'un fichier JS Input_file donné, lancez les commandes Python3 suivantes à partir de l'emplacement du dossier src :
>>> from pdgs_generation 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:
>>> from pdgs_generation import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')
Notez que, pour cette version HidenoseEK, nous avons ajouté un délai de 60 secondes pour le processus de génération PDG (cf. Ligne 83 de src/pdgs_generation.py ).
Pour trouver des clones entre les PDG bénignes du dossier Folder_Benign_PDG et les malveillants de Folder_Malicious_PDGS, lancez la commande Python3 suivante à partir de l'emplacement du dossier src :
$ python3 -c "from samples_generation import replace_ast_df_folder; replace_ast_df_folder('FOLDER_BENIGN_PDGS', 'FOLDER_MALICIOUS_PDGS')"
Pour chaque PDG malveillant, un dossier PDG_NAME-ANALYSY sera créé dans Folder_Malicious_PDGS. Pour chaque PDG bénigne analysé, il contiendra un fichier JSON (format de nom: bennign_malicious.json), qui résume les principales conclusions, telles que les nœuds identiques, la proportion de nœuds identiques, les jetons différents, les différentes références ...
De plus, nous affichons dans Stdout le code bénin et malveillant des clones signalés. Cela peut être désactivé, par exemple, pour le multiprocessement, en commentant l'appel à print_clones ligne 153 de src/samples_generation.py .
Pour trouver des clones entre un fichier JS bénigne bénigne_js et un malveillant malicious_js, lancez les commandes Python3 suivantes à partir de l'emplacement du dossier src :
>>> from samples_generation import replace_ast
>>> replace_ast('BENIGN_JS', 'MALICIOUS_JS')
Les sorties, en termes de fichier JSON et de stdout, sont telles que précédemment.
Les fonctions src/pdgs_generation.store_pdg_folder et src/samples_generation.replace_ast_df_folder sont entièrement parallélisées. Dans les deux cas, nous utilisons actuellement 1 CPU, mais vous pouvez le modifier en modifiant la variable num_workers de src/utility_df.py . Si vous utilisez plus de 1 CPU, vous devez commenter l'appel à print_clones Line 153 de src/samples_generation.py .
L' example/Benign-example contient example.js example/Malicious-seed/seed.js
Pour détecter les clones entre ces 2 fichiers, lancez les commandes Python3 suivantes à partir de l'emplacement du dossier src :
>>> from samples_generation import replace_ast
>>> replace_ast('../example/Benign-example/example.js', '../example/Malicious-seed/seed.js')
Vous obtiendrez la sortie suivante sur STDOUT:
INFO:Successfully selected 2 clones in XXXs
==============
[<node.Node object at XXX>, <node.Node object at XXX>]
obj.setAttribute('type', 'application/x-shockwave-flash');
obj = document.createElement('object');
[<node.Node object at XXX>, <node.Node object at XXX>]
wscript.run('cmd.exe /c "<malicious powershell>;"', '0');
wscript = WScript.CreateObject('WScript.Shell');
--
[<node.Node object at XXX>, <node.Node object at XXX>]
obj.setAttribute('tabindex', '-1');
obj = document.createElement('object');
[<node.Node object at XXX>, <node.Node object at XXX>]
wscript.run('cmd.exe /c "<malicious powershell>;"', '0');
wscript = WScript.CreateObject('WScript.Shell');
--
==============
INFO:Could find 100.0% of the malicious nodes in the benign AST
Notre outil a trouvé 2 clones (à chaque fois composés de 2 déclarations). Cela signifie que la graine malveillante entière pourrait être réécrite de 2 manières différentes dans l'exemple bénin.
De plus, l' example/Malicious-seed/seed-analysis/example_seed.json , contenant des informations sur les clones supplémentaires, a été créé.
Si vous utilisez Hidenoseek pour la recherche universitaire, vous êtes fortement encouragé à citer l'article suivant:
@inproceedings{fass2019hidenoseek,
author="Fass, Aurore and Backes, Michael and Stock, Ben",
title="{textsc{HideNoSeek}: Camouflaging Malicious JavaScript in Benign ASTs}",
booktitle="ACM CCS",
year="2019"
}
Dans le domaine des logiciels malveillants, les systèmes basés sur l'apprentissage sont devenus populaires pour détecter de nouvelles variantes malveillantes. Néanmoins, les attaquants ayant une connaissance spécifique et interne d'un système cible peuvent être en mesure de produire des échantillons d'entrée qui sont mal classés. Dans la pratique, l'hypothèse d' attaquants forts n'est pas réaliste car elle implique l'accès à l'information d'initiés. Nous proposons plutôt Hidenoseek, une attaque de camouflage nouvelle et générique, qui échappe à toute la classe de détecteurs en fonction des caractéristiques syntaxiques, sans avoir besoin d'informations sur le système qu'il essaie d'échapper. Notre attaque consiste à changer les constructions d'échantillons de javascript malveillants pour reproduire une syntaxe bénigne.
À cette fin, nous réécrivons automatiquement les arbres de syntaxe abstraits (AST) des entrées JavaScript malveillantes dans ceux bénins existants. En particulier, Hidenoseek utilise des graines malveillantes et recherche des sous-graphes isomorphes entre les graines et les scripts bénins traditionnels. Plus précisément, il remplace les sous-actes bénins par leurs équivalents malveillants (même structure syntaxique) et ajuste les dépendances bénignes des données - sans changer l'AST--, de sorte que la sémantique malveillante est conservée. En pratique, nous avons exploité 23 graines malveillantes pour générer 91 020 scripts malveillants, qui reproduisent parfaitement les AST des 10 000 pages Web Alexa. De plus, nous pouvons produire en moyenne 14 échantillons malveillants différents avec le même AST que chaque Top 10 Alexa.
Dans l'ensemble, un classificateur standard formé a 99,98% de faux négatifs avec les entrées de Hideoseek, tandis qu'un classificateur formé sur de tels échantillons a plus de 88,74% de faux positifs, ce qui rend les détecteurs statiques ciblés peu fiables.
Ce projet est concédé sous licence de la licence AGPL3, que vous pouvez trouver dans LICENSE .