JavaScript 코드를 정적으로 분석하는 도구를 제안합니다. 이를 위해 입력 자바 스크립트 파일의 AST (Abstract Syntax Tree)를 빌드합니다. 특정 실행 경로를 수행하기 위해 충족 해야하는 조건에 대해 추론하기 위해 AST에 제어 흐름 가장자리를 추가합니다. 결과 그래프를 CFG (Control Flow Graph)라고합니다. 다음으로, 가변 종속성에 대해 추론하기 위해 CFG에 데이터 흐름 가장자리를 추가합니다. 마지막으로 변수 값을 계산하기 위해 포인터 분석을 수행합니다. 결과 그래프를 PDG (프로그램 의존성 그래프)라고합니다.
현재 상태에서 코드는 POC이며 본격적인 생산 준비 API가 아닙니다.
우리는 제어 흐름 가장자리가있는 AST를 향상시키기 때문에 Allen과 약간 다른 CFG의 정의를 채택합니다. 이런 식으로, 우리는 제어 흐름 정보와 세밀한 AST 노드 및 모서리를 결합한 조인트 구조를 구축합니다. 우리의 PDG는 또한 Ferrante et al.의 정의와 약간 다릅니다. 우리는 CFG에 데이터 흐름 가장자리를 추가하기로 결정했습니다. 이런 식으로, 우리는 명세서 순서에 관한 정보를 유지하고 데이터 흐름을 변수 수준 (AST에서 CFG를 구축 할 때)을 직접적으로 표현합니다.
자세한 내용은 내 논문에서 찾을 수 있습니다.
이 코드는 브라우저 확장을 정적으로 분석하는 데 사용되었습니다. Doublex Paper & Code를 참조하십시오.
이 코드의 예비 버전은 악의적 인 JavaScript 샘플을 감지하는 데 사용되었습니다 : Hidenoseek Paper & Code 및 JSTAP 용지 및 코드.
JavaScript 코드 변환 기술을 연구하기 위해 : 종이 및 코드.
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)
GraphViz를 설치하려면 (아직 문서화되지 않은 그래프 그리기 용으로 만 해당하는 경우에만 관심이 있으시면 문제를여십시오).
pip3 install graphviz
On MacOS: install brew and then brew install graphviz
On Linux: sudo apt-get install graphviz
특정 *.js 파일의 PDG를 생성하려면 src 폴더에서 다음 Python3 명령을 시작하십시오.
>>> from build_pdg import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict())
기본적으로 해당 PDG가 저장되지 않습니다. 기존 PDG_PATH 폴더에 저장하려면 다음과 같습니다.
$ python3 -c "from build_pdg import get_data_flow; get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')"
데이터 흐름/포인터 분석 ( src/build_pdg.py 의 149 행) 및 20GB의 메모리 제한 ( src/build_pdg.py 의 115 행)에 대해 10 분의 시간 초과를 추가했습니다.
분석 할 여러 JavaScript 파일이 포함 된 디렉토리 DIR 고려해 봅시다. 이러한 모든 파일의 PDG (= 컨트롤 및 데이터 흐름 및 포인터 분석으로 향상된 ASTS)를 생성하려면 src 폴더 위치에서 다음 쉘 명령을 시작하십시오.
$ python3 -c "from build_pdg import store_pdg_folder; store_pdg_folder('DIR')"
해당 PDG는 DIR/PDG 에 저장됩니다.
현재 1 CPU를 사용하고 있지만 src/utility_df.py (1 행 51 )에서 변수 num_workers를 수정하여이를 변경할 수 있습니다.
이 프로젝트는 LICENSE 에서 찾을 수있는 AGPL3 라이센스의 조건에 따라 라이센스가 부여됩니다.