Este repositorio contiene la mayor parte del código de nuestro documento CCS'19: "Hidenosek: camuflando JavaScript malicioso en ASTS benignos", a saber:
Tenga en cuenta que en su estado actual, el código es un POC y no una API lista completa lista para la producción.
Hidenoseek es un ataque de camuflaje novedoso y genérico, que cambia las construcciones de muestras de JavaScript maliciosas para reproducir exactamente una sintaxis benigna existente. Para este propósito, mejoramos estáticamente los árboles de sintaxis abstractos (ASTS) de entradas de JavaScript válidas con información de control y flujo de datos. Nos referimos a la estructura de datos resultante como gráfico de dependencia del programa (PDG). En particular, Hidenosek busca subgrafías isomórficas entre los archivos maliciosos y benignos. Específicamente, reemplaza los sub-ases benignos por sus equivalentes maliciosos (misma estructura sintáctica) y ajusta las dependencias de datos benignos, sin cambiar el AST, de modo que se mantenga la semántica maliciosa.
Por razones éticas, decidimos no publicar ni el código completo de nuestro módulo de selección de clonos ni nuestro módulo de reemplazo de clones. Por lo tanto, esta versión de Hidenosek se puede usar para detectar clones sintácticos, pero no para reescribirlos .
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 ..
Hidenosek funciona directamente a nivel PDG. Para detectar clones entre 2 carpetas JavaScript, debe generar los PDG de antemano (cf. Generación PDGS) y darlos como entrada a la función src/samples_generation.replace_ast_df_folder .
Para detectar clones entre 2 muestras de JavaScript, debe dar las rutas de los archivos directamente como entrada a la función src/samples_generation.replace_ast .
Para generar los PDG de los archivos JS en la carpeta de carpeta_name, inicie el siguiente comando shell desde la ubicación de la carpeta src :
$ python3 -c "from pdgs_generation import store_pdg_folder; store_pdg_folder('FOLDER_NAME')"
Los PDG correspondientes se almacenarán en carpeta_name/PDG.
Para generar el PDG de un archivo js input_file, inicie los siguientes comandos Python3 desde la ubicación de la carpeta src :
>>> from pdgs_generation import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict())
Por defecto, el PDG correspondiente no se almacenará. Para almacenarlo en una carpeta PDG_Path existente, llame:
>>> from pdgs_generation import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')
Tenga en cuenta que, para esta versión de Hidenosek, agregamos un tiempo de espera de 60 segundos para el proceso de generación PDG (cf. Línea 83 de src/pdgs_generation.py ).
Para encontrar clones entre los PDG benignos de la carpeta de carpeta_benign_pdgs y los maliciosos desde la carpeta_malicious_pdgs, inicie el siguiente comando Python3 desde la ubicación de la carpeta src :
$ python3 -c "from samples_generation import replace_ast_df_folder; replace_ast_df_folder('FOLDER_BENIGN_PDGS', 'FOLDER_MALICIOUS_PDGS')"
Para cada PDG malicioso, se creará una carpeta PDG_NAME-Analysis en carpeta_malicious_pdgs. Para cada PDG benigno analizado, contendrá un archivo JSON (formato de nombre: benign_malicious.json), que resume los hallazgos principales, como nodos idénticos, la proporción de nodos idénticos, tokens diferentes, diferentes puntos de referencia ...
Además, mostramos en el código benigno y malicioso de los clones informados. Esto se puede deshabilitar, por ejemplo, para el multiprocesamiento, comentando la línea de llamada a la línea print_clones 153 de src/samples_generation.py .
Para encontrar clones entre un archivo JS benigno benign_js y uno malicioso de Malicious_JS, inicie los siguientes comandos Python3 desde la ubicación de la carpeta src :
>>> from samples_generation import replace_ast
>>> replace_ast('BENIGN_JS', 'MALICIOUS_JS')
Las salidas, en términos de archivo JSON y en stdout, son como anteriormente.
El src/pdgs_generation.store_pdg_folder y src/samples_generation.replace_ast_df_folder las funciones están completamente paralelizadas. En ambos casos, actualmente estamos usando 1 CPU, pero puede cambiarlo modificando las variables num_workers de src/utility_df.py . Si usa más de 1 CPU, debe comentar la Línea de Línea de Llama a print_clones de src/samples_generation.py .
El example/Benign-example contiene example.js El ejemplo benigno de nuestro artículo, mientras que example/Malicious-seed/seed.js es la semilla maliciosa de nuestro papel.
Para detectar clones entre estos 2 archivos, inicie los siguientes comandos Python3 desde la ubicación de la carpeta src :
>>> from samples_generation import replace_ast
>>> replace_ast('../example/Benign-example/example.js', '../example/Malicious-seed/seed.js')
Obtendrá la siguiente salida en 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
Nuestra herramienta encontró 2 clones (cada vez compuestos por 2 declaraciones). Significa que toda la semilla maliciosa podría reescribirse de 2 maneras diferentes en el ejemplo benigno.
Además, se creó el example/Malicious-seed/seed-analysis/example_seed.json , que contiene información clon adicional.
Si usa Hidenosek para la investigación académica, se le recomienda encarecidamente citar el siguiente documento:
@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"
}
En el campo de malware, los sistemas basados en el aprendizaje se han vuelto populares para detectar nuevas variantes maliciosas. Sin embargo, los atacantes con conocimiento específico e interno de un sistema objetivo pueden producir muestras de entrada que se clasifican erróneamente. En la práctica, la suposición de atacantes fuertes no es realista, ya que implica acceso a información interna. En su lugar, proponemos Hidenosek, un ataque de camuflaje novedoso y genérico, que evade toda la clase de detectores basados en características sintácticas, sin necesidad de ninguna información sobre el sistema que está tratando de evadir. Nuestro ataque consiste en cambiar las construcciones de muestras de JavaScript maliciosas para reproducir una sintaxis benigna.
Para este propósito, reescribimos automáticamente los árboles de sintaxis abstractos (AST) de las entradas de JavaScript maliciosas en las benignas existentes. En particular, Hidenosek utiliza semillas maliciosas y busca subgrafías isomórficas entre las semillas y los guiones benignos tradicionales. Específicamente, reemplaza los sub-ases benignos por sus equivalentes maliciosos (la misma estructura sintáctica) y ajusta las dependencias de datos benignos, sin cambiar el AST, para que se mantenga la semántica maliciosa. En la práctica, aprovechamos 23 semillas maliciosas para generar 91,020 guiones maliciosos, que reproducen perfectamente las AST de las 10,000 páginas web de Alexa. Además, podemos producir en promedio 14 muestras maliciosas diferentes con el mismo AST que cada Alexa Top 10.
En general, un clasificador entrenado estándar tiene 99.98% falsos negativos con entradas de Hidenosek, mientras que un clasificador entrenado en tales muestras tiene más de 88.74% falsos positivos, lo que hace que los detectores estáticos específicos no sean confiables.
Este proyecto tiene licencia bajo los términos de la licencia AGPL3, que puede encontrar en LICENSE .