Proponemos una herramienta para analizar estáticamente el código JavaScript. Para este fin, construimos el AST (árbol de sintaxis abstracto) de un archivo de entrada JavaScript. Para razonar sobre las condiciones que deben cumplirse para una ruta de ejecución específica, posteriormente agregamos bordes de flujo de control al AST. Nos referimos al gráfico resultante como el CFG (gráfico de flujo de control). A continuación, para razonar sobre dependencias variables, agregamos bordes de flujo de datos al CFG. Finalmente, para calcular valores variables, realizamos un análisis de puntero. Nos referimos al gráfico resultante como el PDG (gráfico de dependencia del programa).
Tenga en cuenta que en su estado actual, el código es una API POC y no una API lista completa lista.
Adoptamos una definición del CFG que difiere ligeramente de Allen a medida que mejoramos nuestra AST con los bordes de flujo de control. De esta manera, construimos una estructura conjunta que combina información de flujo de control con los nodos y bordes AST de grano fino. Nuestro PDG también difiere ligeramente de la definición de Ferrante et al. Como elegimos agregar bordes de flujo de datos a nuestro CFG. De esta manera, conservamos información sobre el orden de las declaraciones y tenemos una representación de grano fino de los flujos de datos directamente en el nivel variable (a medida que construimos el CFG en el AST).
Se pueden encontrar detalles adicionales en mi disertación.
Este código se ha utilizado para analizar estáticamente las extensiones del navegador. Ver Doublex Paper & Code.
Las versiones preliminares de este código también se utilizaron para detectar muestras de JavaScript maliciosas: Hidenosek Paper & Code y Jstap Paper & Code.
Y para estudiar técnicas de transformación del código JavaScript: papel y código.
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)
Para instalar GraphViz (solo para gráficos de dibujo, aún no documentado, abra un problema si está interesado)
pip3 install graphviz
On MacOS: install brew and then brew install graphviz
On Linux: sudo apt-get install graphviz
Para generar el PDG de un archivo específico *.js, inicie los siguientes comandos Python3 desde la ubicación de la carpeta src :
>>> from build_pdg 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:
$ python3 -c "from build_pdg import get_data_flow; get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')"
Tenga en cuenta que agregamos un tiempo de espera de 10 minutos para el análisis de flujo de datos/puntero (cf. Línea 149 de src/build_pdg.py ), y un límite de memoria de 20GB (cf. línea 115 de src/build_pdg.py ).
Consideremos un DIR directorio que contiene varios archivos JavaScript para analizar. Para generar los PDG (= ASTS mejorados con el control y el flujo de datos, y el análisis del puntero) de todos estos archivos, inicie el siguiente comando shell desde la ubicación de la carpeta src :
$ python3 -c "from build_pdg import store_pdg_folder; store_pdg_folder('DIR')"
Los PDG correspondientes se almacenarán en DIR/PDG .
Actualmente, estamos utilizando 1 CPU, pero puede cambiarlo modificando las variables num_workers de src/utility_df.py (la línea 51 ).
Este proyecto tiene licencia bajo los términos de la licencia AGPL3, que puede encontrar en LICENSE .