
顎
ウェブサイト|ドキュメント|セットアップ|クローラー|クイックスタートdocker(例)
Esprima ParserおよびESTERE SPIDERMONKEYスペックに基づいたJavaScriptのプロパティグラフのオープンソース、プロトタイプ実装。 JAWは、Webアプリケーションのクライアント側とJavaScriptベースのプログラムを分析するために使用できます。
このプロジェクトはGNU AFFERO GENERAL PUBLIC LICENSE V3.0に基づいてライセンスされています。詳細については、こちらをご覧ください。
Jawには、https://soheilkhodayari.github.io/jaw/で入手可能なGithubページのWebサイトがあります。
リリースメモ:
JAW-V2ブランチを参照してください。JAW-V1ブランチを参照してください。顎のアーキテクチャを以下に示します。

顎は2つの異なる方法で使用できます。
任意のJavaScript分析:プログラムのファイルシステムpathを指定して、JavaScriptプログラムをモデリングおよび分析するためにJAWを使用します。
Webアプリケーション分析:単一のシードURLを提供して、Webアプリケーションを分析します。
収集されたWebリソースを使用して、NEO4Jデータベースにインポートされるハイブリッドプログラムグラフ(HPG)を作成します。
オプションで、HPG構造モジュールにセマンティックタイプのマッピングをカスタムJavaScript言語トークンに提供し、目的に基づいて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を参照してください。
ヒント。構成ファイルは、脆弱性クラスごとに有効または無効にできるさまざまなパス(例えば、クローリング、静的分析など)を指定します。これにより、ツールビルディングブロックを個別に実行するか、別の順序で実行できます(たとえば、すべてのWebAppsを最初にクロールしてから、セキュリティ分析を実施します)。
プロパティグラフを構築し、その上でCypherクエリを実行する方法を示す簡単な例を実行するには、次を実行します。
$ python3 -m analyses.example.example_analysis --input= $( pwd ) /data/test_program/test.jsこのモジュールは、テストに必要なデータ(すなわち、JavaScriptコード、Webページの状態値)を収集します。既にファイルシステムにある特定のJavaSciptファイルをテストする場合は、この手順をスキップできます。
Jawには、セレン(顎-V1)、操り人形師(顎-V2、V3)、劇作家(顎-V3)に基づいたクローラーがあります。ほとんどの最新の機能については、操り人形師または劇作家ベースのバージョンを使用することをお勧めします。
このWeb Crawlerは、Firefoxの機器版であるFoxhoundを採用して、Webページをナビゲートする際に動的な汚染追跡を実行します。クローラーを開始するには、
$ cd crawler
$ node crawler-taint.js --seedurl=https://google.com --maxurls=100 --headless=true --foxhoundpath= < optional-foxhound-executable-path > foxhoundpathは、デフォルトで次のディレクトリに設定されています。Crawler crawler/foxhound/firefoxには、 firefoxという名前のバイナリが含まれています。
注:このバージョンを使用するには、Foxhoundのビルドが必要です。 Ubuntuビルドは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のドキュメントを参照してください。
特定の(set of)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インスタンス)内に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リクエスト、Cookieのいずれかのファイルを入力することにより、プロパティグラフを充実させたいことを意味します。--reqs=<requests.out> :ハイブリッドモードのみの場合、obseveredネットワーク要求のシーケンスを含むファイルの名前は、文字列をfalseに渡して除外します(default: request_logs_short.out )。--evts=<events.out> :ハイブリッドモードのみの場合、発射されたイベントのシーケンスを含むファイルの名前は、文字列をfalseに渡して除外します(default: events.out )。--cookies=<cookies.pkl> :ハイブリッドモードのみの場合、Cookieを含むファイルの名前は、文字列をfalse渡して除外します(default: cookies.pkl )。--html=<html_snapshot.html> :ハイブリッドモードのみの場合、domツリースナップショットを含むファイルの名前は、string falseを渡して除外します(default: html_rendered.html )。詳細については、グラフ構造APIで提供されるCLIを使用することができます。
$ python3 -m engine.api -h構築されたHPGは、Cypherまたはneomodel ormを使用して照会できます。
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詳細については、こちらをご覧ください。
このセクションでは、脆弱性の検出に顎を構成して使用する方法と、出力を解釈する方法について説明します。ジョーには、特にクライアント側の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インジェクションポイントを介して忘れられます。ただし、 ['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テンプレート値を使用してajax要求をトリガーします。パラメーターajaxlocは、 window.location.hrefからwindoc.hrefから['WIN.LOC']を使用することを許可するプログラムスライスです。
ジョーのテストプロセスを合理化し、セットアップが正確であることを確認するために、JAWをテストできる簡単なnode.js Webアプリケーションを提供します。
まず、依存関係を介してインストールします。
$ cd tests/test-webapp
$ npm install次に、アプリケーションを新しい画面で実行します。
$ screen -dmS jawwebapp bash -c ' PORT=6789 npm run devstart; exec sh '詳細については、こちらのWikiページをご覧ください。以下は、迅速なアクセスのための目次です。
プルリクエストは常に歓迎されます。このプロジェクトは、安全で歓迎するスペースになることを目的としており、貢献者は貢献者行動規範を遵守することが期待されています。
学術研究に顎を使用する場合は、次の論文を引用することをお勧めします。
@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},
}
ジョーは長い道のりを歩んできました。私たちはここで貢献者に当然の叫び声を与えたいと思っています!
@tmbr、 @c01gide、@jndre、およびsepehr mirzaei。