
턱
웹 사이트 | 문서 | 설정 | 크롤러 | 빠른 시작 Docker (예)
Esprima Parser 및 Estree Spidermonkey Spec를 기반으로 JavaScript 용 Property Graph의 오픈 소스, 프로토 타입 구현. Jaw는 웹 응용 프로그램의 클라이언트 측 및 JavaScript 기반 프로그램을 분석하는 데 사용할 수 있습니다.
이 프로젝트는 GNU AFFERO GENERAL PUBLIC LICENSE V3.0 에 따라 라이센스가 부여됩니다. 자세한 내용은 여기를 참조하십시오.
Jaw에는 https://soheilkhodayari.github.io/jaw/에서 Github 페이지 웹 사이트가 있습니다.
릴리스 노트 :
JAW-V2 지점을 참조하십시오.JAW-V1 브랜치를 참조하십시오.턱의 아키텍처는 다음과 같습니다.

턱은 두 가지 다른 방식으로 사용할 수 있습니다.
임의의 JavaScript 분석 : 프로그램의 파일 시스템 path 지정하여 JavaScript 프로그램을 모델링하고 분석하는 데 JAW를 활용합니다.
웹 응용 프로그램 분석 : 단일 시드 URL을 제공하여 웹 응용 프로그램을 분석합니다.
수집 된 웹 리소스를 사용하여 HPG (Hybrid Program Graph)를 작성하여 NEO4J 데이터베이스로 가져옵니다.
선택적으로, Semantic 유형을 맞춤형 JavaScript 언어 토큰에 매핑하여 HPG 구성 모듈에 공급하여 목적에 따라 JavaScript 기능의 분류를 용이하게합니다 (예 : HTTP 요청 기능).
다양한 분석을 위해 구성된 Neo4j 그래프 데이터베이스를 쿼리하십시오. Jaw는 데이터 흐름 분석, 제어 흐름 분석, 도달 성 분석 및 패턴 매칭을위한 유틸리티 트래버스를 제공합니다. 이러한 횡단은 사용자 정의 보안 분석을 개발하는 데 사용될 수 있습니다.
Jaw에는 클라이언트 측 CSRF, Dom Clobbering 및 요청 납치 취약점을 감지하기위한 내장 트래버스도 포함되어 있습니다.
출력은 입력과 동일한 폴더에 저장됩니다.
설치 스크립트는 다음과 같은 전제 조건에 의존합니다.
npm package manager (노드 JS)의 최신 버전python 3.x 의 모든 안정적인 버전pip 패키지 관리자그런 다음 다음을 통해 필요한 종속성을 설치하십시오.
$ ./install.sh detailed 설치 지침은 여기를 참조하십시오.
다음을 통해 배경 화면에서 파이프 라인 인스턴스를 실행할 수 있습니다.
$ python3 -m run_pipeline --conf=config.yamlCLI는 다음 옵션을 제공합니다.
$ python3 -m run_pipeline -h
usage: run_pipeline.py [-h] [--conf FILE] [--site SITE] [--list LIST] [--from FROM] [--to TO]
This script runs the tool pipeline.
optional arguments:
-h, --help show this help message and exit
--conf FILE, -C FILE pipeline configuration file. (default: config.yaml)
--site SITE, -S SITE website to test; overrides config file (default: None)
--list LIST, -L LIST site list to test; overrides config file (default: None)
--from FROM, -F FROM the first entry to consider when a site list is provided; overrides config file (default: -1)
--to TO, -T TO the last entry to consider when a site list is provided; overrides config file (default: -1)
입력 구성 : jaw는 .yaml 구성 파일을 입력으로 기대합니다. 예를 들어 Config.yaml을 참조하십시오.
힌트. 구성 파일은 각 취약성 클래스에 대해 활성화 또는 비활성화 할 수있는 다른 패스 (예 : 크롤링, 정적 분석 등)를 지정합니다. 이를 통해 도구 빌딩 블록을 개별적으로 또는 다른 순서로 실행할 수 있습니다 (예 : 모든 웹 앱을 먼저 크롤링 한 다음 보안 분석을 수행합니다).
속성 그래프를 작성하고 사이퍼 쿼리를 실행하는 방법을 보여주는 빠른 예제를 실행하려면 다음을 수행하십시오.
$ python3 -m analyses.example.example_analysis --input= $( pwd ) /data/test_program/test.js이 모듈은 테스트에 필요한 데이터 (즉, JavaScript 코드 및 웹 페이지의 상태 값)를 수집합니다. 파일 시스템에 이미 가지고있는 특정 javascipt 파일을 테스트하려면이 단계를 건너 뛸 수 있습니다.
Jaw는 셀레늄 (Jaw-V1), 인형극 (Jaw-V2, V3) 및 극작가 (Jaw-V3)를 기반으로 한 크롤러가 있습니다. 대부분의 최신 기능의 경우 인형극 또는 극작가 기반 버전을 사용하는 것이 좋습니다.
이 웹 크롤러는 Firefox의 계측 된 버전 인 Foxhound를 사용하여 웹 페이지를 통해 탐색 할 때 동적 오염 추적을 수행합니다. 크롤러를 시작하려면 :
$ cd crawler
$ node crawler-taint.js --seedurl=https://google.com --maxurls=100 --headless=true --foxhoundpath= < optional-foxhound-executable-path > foxhoundpath 기본적으로 다음 디렉토리로 설정되어 있습니다. crawler/foxhound/firefox 는 firefox 라는 이진이 포함되어 있습니다.
참고 : 이 버전을 사용하려면 Foxhound 빌드가 필요합니다. 우분투 빌드는 JAW-V3 릴리스에 포함되어 있습니다.
크롤러를 시작하려면 :
$ cd crawler
$ node crawler.js --seedurl=https://google.com --maxurls=100 --browser=chrome --headless=true자세한 내용은 여기를 참조하십시오.
크롤러를 시작하려면 :
$ cd crawler/hpg_crawler
$ vim docker-compose.yaml # set the websites you want to crawl here and save
$ docker-compose build
$ docker-compose up -d 자세한 내용은 여기 hpg_crawler 의 문서를 참조하십시오.
주어진 (세트) JavaScript 파일에 대한 HPG를 생성하려면 다음을 수행하십시오.
$ node engine/cli.js --lang=js --graphid=graph1 --input=/in/file1.js --input=/in/file2.js --output=$(pwd)/data/out/ --mode=csv
optional arguments:
--lang: language of the input program
--graphid: an identifier for the generated HPG
--input: path of the input program(s)
--output: path of the output HPG, must be i
--mode: determines the output format (csv or graphML)
NEO4J 그래프 데이터베이스 (Docker Instance) 내부에서 HPG를 가져 오려면 다음을 수행하십시오.
$ python3 -m hpg_neo4j.hpg_import --rpath=<path-to-the-folder-of-the-csv-files> --id=<xyz> --nodes=<nodes.csv> --edges=<rels.csv>
$ python3 -m hpg_neo4j.hpg_import -h
usage: hpg_import.py [-h] [--rpath P] [--id I] [--nodes N] [--edges E]
This script imports a CSV of a property graph into a neo4j docker database.
optional arguments:
-h, --help show this help message and exit
--rpath P relative path to the folder containing the graph CSV files inside the `data` directory
--id I an identifier for the graph or docker container
--nodes N the name of the nodes csv file (default: nodes.csv)
--edges E the name of the relations csv file (default: rels.csv)
hpg_crawler 의 출력에 대한 하이브리드 속성 그래프를 작성하고 로컬 NEO4J 인스턴스 내에서 가져 오려면 다음을 수행 할 수 있습니다.
$ python3 -m engine.api < path > --js= < program.js > --import= < bool > --hybrid= < bool > --reqs= < requests.out > --evts= < events.out > --cookies= < cookies.pkl > --html= < html_snapshot.html >매개 변수의 사양 :
<path> : 분석을 위해 프로그램 파일을 포함하는 폴더에 대한 절대 경로 ( engine/outputs 폴더 아래에 있어야 함).--js=<program.js> : 분석용 JavaScript 프로그램의 이름 (기본값 : js_program.js ).--import=<bool> : 구성된 속성 그래프를 활성 NEO4J 데이터베이스로 가져와야하는지 (기본값 : true).--hybrid=bool : 하이브리드 모드가 활성화되어 있는지 (기본값 : false ). 이는 테스터가 jaw 크롤러가 수집 한 HTML 스냅 샷, 해고 된 이벤트, HTTP 요청 및 쿠키에 대한 파일을 입력하여 속성 그래프를 풍부하게하려는 것을 의미합니다.--reqs=<requests.out> : 하이브리드 모드만으로는 병화 된 네트워크 요청 시퀀스를 포함하는 파일 이름의 이름을 제외하여 false 전달합니다 (default : request_logs_short.out ).--evts=<events.out> : 하이브리드 모드 만 해고 된 이벤트 시퀀스를 포함하는 파일 이름의 이름은 false 전달하여 배제합니다 (default : events.out ).--cookies=<cookies.pkl> : 하이브리드 모드 전용 쿠키가 포함 된 파일 이름의 이름은 false 전달하여 배제합니다 (default : cookies.pkl ).--html=<html_snapshot.html> : 하이브리드 모드 만 있으면 Dom Tree Snapshot이 포함 된 파일 이름의 이름은 string false 전달하여 (기본값 : html_rendered.html ).자세한 내용은 그래프 구성 API와 함께 제공된 도움말 CLI를 사용할 수 있습니다.
$ python3 -m engine.api -h그런 다음 Cypher 또는 Neomodel ORM을 사용하여 구성된 HPG를 쿼리 할 수 있습니다.
analyses/<ANALYSIS_NAME> 에 쿼리를 배치하고 실행해야합니다.
Neomodel ORM을 사용하여 HPG를 쿼리 할 수 있습니다. 쿼리를 작성하려면 :
example_query_orm.py analyses/example 폴더의 $ python3 -m analyses.example.example_query_orm 자세한 내용은 여기를 참조하십시오.
Cypher를 사용하여 사용자 정의 쿼리를 작성할 수 있습니다. 이것을 위해 :
example_query_cypher.py analyses/example 폴더의 $ python3 -m analyses.example.example_query_cypher자세한 내용은 여기를 참조하십시오.
이 섹션에서는 취약성 감지를 위해 JAW를 구성하고 사용하는 방법과 출력 해석 방법에 대해 설명합니다. jaw에는 클라이언트 측 CSRF 및 Dom Clobbering을 감지하기위한 자체 포함 쿼리가 포함되어 있습니다.
1 단계. 입력 config.yaml 파일에서 취약성 클래스의 분석 구성 요소를 활성화합니다.
request_hijacking :
enabled : true
# [...]
open_redirect :
enabled : false
# [...]
domclobbering :
enabled : false
# [...]
cs_csrf :
enabled : false
# [...]2 단계. 파이프 라인 인스턴스를 다음과 같이 실행하십시오.
$ python3 -m run_pipeline --conf=config.yaml 힌트. 다른 screen 에서 여러 개의 파이프 라인 인스턴스를 실행할 수 있습니다.
$ screen -dmS s1 bash -c ' python3 -m run_pipeline --conf=conf1.yaml; exec sh '
$ screen -dmS s2 bash -c ' python3 -m run_pipeline --conf=conf2.yaml; exec sh '
$ # [...] 병렬 구성 파일을 자동으로 생성하려면 generate_config.py 스크립트를 사용할 수 있습니다.
출력은 입력과 동일한 폴더 sink.flows.out 파일에 저장됩니다. 예를 들어, 클라이언트 측 CSRF의 경우, 각 HTTP 요청 감지에 대해 턱은 요청을 구성하는 요소 (즉, 프로그램 슬라이스)와 관련된 의미 유형 (일명, 시맨틱 태그 또는 레이블)을 표시하는 항목을 출력합니다. 예를 들어, 시맨틱 유형 ['WIN.LOC'] 으로 표시된 HTTP 요청은 window.location Injection Point를 통해 용서할 수 있습니다. 그러나 ['NON-REACH'] 로 표시된 요청은 용서할 수 없습니다.
예제 출력 항목은 다음과 같습니다.
[*] Tags: ['WIN.LOC']
[*] NodeId: {'TopExpression': '86', 'CallExpression': '87', 'Argument': '94'}
[*] Location: 29
[*] Function: ajax
[*] Template: ajaxloc + "/bearer1234/"
[*] Top Expression: $.ajax({ xhrFields: { withCredentials: "true" }, url: ajaxloc + "/bearer1234/" })
1:['WIN.LOC'] variable=ajaxloc
0 (loc:6)- var ajaxloc = window.location.href
이 항목은 29 행에 $.ajax 호출 표현식이 있음을 보여줍니다.이 호출 표현식은 ajaxloc + "/bearer1234/ 의 URL window.location.href ['WIN.LOC'] 으로 ajax ajaxloc 을 트리거합니다.
JAW의 테스트 프로세스를 간소화하고 설정이 정확한지 확인하려면 JAW를 테스트 할 수있는 간단한 node.js 웹 응용 프로그램을 제공합니다.
먼저 다음을 통해 종속성을 설치하십시오.
$ cd tests/test-webapp
$ npm install그런 다음 새 화면에서 응용 프로그램을 실행하십시오.
$ screen -dmS jawwebapp bash -c ' PORT=6789 npm run devstart; exec sh '자세한 내용은 위키 페이지를 방문하십시오. 아래는 빠른 액세스를위한 목차입니다.
풀 요청은 항상 환영됩니다. 이 프로젝트는 안전하고 환영하는 공간이되기위한 것이며 기고자들은 기고자 행동 강령을 준수해야합니다.
학업 연구에 턱을 사용하는 경우 다음 논문을 인용하는 것이 좋습니다.
@inproceedings{JAW,
title = {JAW: Studying Client-side CSRF with Hybrid Property Graphs and Declarative Traversals},
author= {Soheil Khodayari and Giancarlo Pellegrino},
booktitle = {30th {USENIX} Security Symposium ({USENIX} Security 21)},
year = {2021},
address = {Vancouver, B.C.},
publisher = {{USENIX} Association},
}
Jaw는 먼 길을 왔으며 우리는 기고자들에게 잘 알려진 소리를주고 싶습니다!
@tmbrbr, @c01gide, @jndre 및 sepehr mirzaei.