Propomos uma ferramenta para analisar estaticamente o código JavaScript. Para esse fim, construímos o AST (Sintaxe Resumo) de um arquivo JavaScript de entrada. Para raciocinar as condições que precisam ser atendidas para um caminho de execução específico a ser adotado, adicionamos posteriormente as bordas do fluxo de controle à AST. Referimos o gráfico resultante como CFG (controle de fluxo de controle). Em seguida, para raciocinar sobre dependências variáveis, adicionamos bordas de fluxo de dados ao CFG. Finalmente, para calcular valores variáveis, realizamos uma análise de ponteiro. Referimos o gráfico resultante como o PDG (Gráfico de dependência do programa).
Observe que, em seu estado atual, o código é um POC e não uma API de produção totalmente pronta para produção.
Adotamos uma definição do CFG que difere um pouco do de Allen à medida que aumentamos nosso AST com as bordas do fluxo de controle. Dessa forma, construímos uma estrutura articular que combina informações de fluxo de controle com os nós e bordas AST de granulação fina. Nosso PDG também difere um pouco da definição de Ferrante et al. Como optamos por adicionar bordas de fluxo de dados ao nosso CFG. Dessa forma, mantemos informações sobre a ordem da declaração e temos uma representação de granulação fina dos fluxos de dados diretamente no nível variável (à medida que construímos o CFG no AST).
Detalhes adicionais podem ser encontrados na minha dissertação.
Este código foi usado para analisar estaticamente as extensões do navegador. Consulte Paper e Código Doublex.
As versões preliminares deste código também foram usadas para detectar amostras de JavaScript maliciosas: papel HideNoseek & Code e JSTAP Paper & Code.
E para estudar técnicas de transformação de código JavaScript: Paper & 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)
Para instalar o GraphViz (apenas para desenhar gráficos, ainda não documentados, abra um problema se estiver interessado)
pip3 install graphviz
On MacOS: install brew and then brew install graphviz
On Linux: sudo apt-get install graphviz
Para gerar o PDG de um arquivo *.js específico, inicie os seguintes comandos Python3 do local da pasta src :
>>> from build_pdg import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict())
Por padrão, o PDG correspondente não será armazenado. Para armazená -lo em uma pasta pdg_path existente , ligue para:
$ python3 -c "from build_pdg import get_data_flow; get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')"
Observe que adicionamos um tempo limite de 10 min para a análise de fluxo de dados/ponteiro (cf. Linha 149 de src/build_pdg.py ) e um limite de memória de 20 GB (cf. Linha 115 de src/build_pdg.py ).
Vamos considerar um diretório DIR contendo vários arquivos JavaScript para analisar. Para gerar os PDGs (= ASTS aprimorados com controle e fluxo de dados e análise de ponteiro) de todos esses arquivos, inicie o seguinte comando Shell a partir da pasta src Local:
$ python3 -c "from build_pdg import store_pdg_folder; store_pdg_folder('DIR')"
Os PDGs correspondentes serão armazenados no DIR/PDG .
Atualmente, estamos usando 1 CPU, mas você pode alterá -lo modificando a variável num_workers de src/utility_df.py (a linha 51 ).
Este projeto está licenciado nos termos da licença AGPL3, que você pode encontrar na LICENSE .