このリポジトリには、CCS'19論文のほとんどのコードが含まれています。「Hidenoseek:悪意のあるJavaScriptを良性ASTSでカモフラージュ」、つまり:
現在の状態では、コードはPOCであり、本格的な生産対応APIではないことに注意してください。
Hidenoseekは、斬新で一般的なカモフラージュ攻撃であり、悪意のあるJavaScriptサンプルの構造を変更して、既存の良性構文を正確に再現します。この目的のために、コントロールおよびデータフロー情報を使用した有効なJavaScript入力の抽象的構文ツリー(AST)を静的に強化します。結果のデータ構造をプログラム依存性グラフ(PDG)と呼びます。特に、Hidenoseekは悪意のあるファイルと良性ファイルの間に同型サブグラフを探します。具体的には、良性のサブアストを悪意のある同等物(同じ構文構造)に置き換え、悪意のあるセマンティクスが維持されるように、ASTを変更することなく、良性のデータ依存関係を調整します。
倫理的な理由で、クローン選択モジュールの完全なコードもクローン置換モジュールも公開しないことにしました。したがって、このHidenoseekバージョンは、構文クローンを検出するために使用できますが、書き換えません。
install python3 # (tested with 3.6.7)
install nodejs # (tested with 8.10.0)
install npm # (tested with 3.5.2)
cd src
npm install escodegen # (tested with 1.9.1)
cd ..
HidenoseekはPDGレベルで直接動作します。 2つのJavaScriptフォルダー間でクローンを検出するには、PDGSを事前に生成し(PDGS生成を参照)、 src/samples_generation.replace_ast_df_folder関数への入力としてそれらを提供する必要があります。
2つのJavaScriptサンプル間でクローンを検出するには、 src/samples_generation.replace_ast関数への入力としてファイルのパスを直接指定する必要があります。
Folder folder_nameからJSファイルのPDGSを生成するには、 srcフォルダーの場所から次のシェルコマンドを起動します。
$ python3 -c "from pdgs_generation import store_pdg_folder; store_pdg_folder('FOLDER_NAME')"
対応するPDGは、Folder_Name/PDGに保存されます。
JSファイルinput_fileの1つのPDGを生成するには、 srcフォルダーの場所から次のPython3コマンドを起動します。
>>> from pdgs_generation import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict())
デフォルトごとに、対応するPDGは保存されません。既存のPDG_PATHフォルダーに保存するには、次のことを呼び出します。
>>> from pdgs_generation import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')
このHidenoseekバージョンでは、PDG生成プロセスに60秒のタイムアウトを追加したことに注意してください( src/pdgs_generation.pyの行83を参照)。
Folder folder_benign_pdgsから良性のpdgsとfolder_malicious_pdgsから悪意のあるものの間のクローンを見つけるには、 srcフォルダーの場所から次のpython3コマンドを起動します。
$ python3 -c "from samples_generation import replace_ast_df_folder; replace_ast_df_folder('FOLDER_BENIGN_PDGS', 'FOLDER_MALICIOUS_PDGS')"
悪意のあるPDGごとに、フォルダーPDG_NAME-ANALASISがFolder_Malicious_PDGSで作成されます。分析された良性PDGごとに、JSONファイル(名前形式:benign_malicious.json)が含まれます。これは、同一のノード、同一のノードの割合、異なるトークン、異なるベンチマークなどの主要な調査結果をまとめます...
さらに、報告されたクローンの良性で悪意のあるコードをstdoutに表示します。これはsrc/samples_generation.pyのprint_clones行153への呼び出しにコメントすることにより、マルチプロセッシングの場合、無効にすることができます。
良性JSファイルbenign_jsと悪意のある1つのMalious_jsの間のクローンを見つけるには、 srcフォルダーの場所から次のPython3コマンドを起動します。
>>> from samples_generation import replace_ast
>>> replace_ast('BENIGN_JS', 'MALICIOUS_JS')
JSONファイルとstdoutの観点からの出力は、以前と同じです。
src/pdgs_generation.store_pdg_folderおよびsrc/samples_generation.replace_ast_df_folder関数は完全に並行しています。どちらの場合も、現在1つのCPUを使用していますが、 src/utility_df.pyから変数num_workersを変更することでそれを変更できます。 1つ以上のCPUを使用する場合は、 src/samples_generation.pyのprint_clones行153への呼び出しをコメントしてください。
フォルダーのexample/Benign-exampleにはexample.js私たちの論文の良性の例が含まれていますが、 example/Malicious-seed/seed.jsは私たちの論文の悪意のある種です。
これら2つのファイル間でクローンを検出するには、 srcフォルダーの場所から次のPython3コマンドを起動します。
>>> from samples_generation import replace_ast
>>> replace_ast('../example/Benign-example/example.js', '../example/Malicious-seed/seed.js')
stdoutで次の出力を取得します。
INFO:Successfully selected 2 clones in XXXs
==============
[<node.Node object at XXX>, <node.Node object at XXX>]
obj.setAttribute('type', 'application/x-shockwave-flash');
obj = document.createElement('object');
[<node.Node object at XXX>, <node.Node object at XXX>]
wscript.run('cmd.exe /c "<malicious powershell>;"', '0');
wscript = WScript.CreateObject('WScript.Shell');
--
[<node.Node object at XXX>, <node.Node object at XXX>]
obj.setAttribute('tabindex', '-1');
obj = document.createElement('object');
[<node.Node object at XXX>, <node.Node object at XXX>]
wscript.run('cmd.exe /c "<malicious powershell>;"', '0');
wscript = WScript.CreateObject('WScript.Shell');
--
==============
INFO:Could find 100.0% of the malicious nodes in the benign AST
私たちのツールは2つのクローンを見つけました(毎回2つのステートメントで構成されています)。これは、悪意のある種子全体が、良性の例で2つの異なる方法で書き直される可能性があることを意味します。
さらに、追加のクローン情報を含むファイルのexample/Malicious-seed/seed-analysis/example_seed.json作成されました。
Hidenoseekを学術研究に使用する場合は、次の論文を引用することを強くお勧めします。
@inproceedings{fass2019hidenoseek,
author="Fass, Aurore and Backes, Michael and Stock, Ben",
title="{textsc{HideNoSeek}: Camouflaging Malicious JavaScript in Benign ASTs}",
booktitle="ACM CCS",
year="2019"
}
マルウェア分野では、学習ベースのシステムが新しい悪意のあるバリエーションを検出するために人気が高まっています。それにもかかわらず、ターゲットシステムの特定の内部知識を持つ攻撃者は、誤分類される入力サンプルを生成できる場合があります。実際には、強力な攻撃者の仮定は、インサイダー情報へのアクセスを意味するため、現実的ではありません。代わりに、斬新で一般的なカモフラージュ攻撃であるHidenoseekを提案します。これは、回避しようとしているシステムに関する情報を必要とせずに、構文機能に基づいて検出器のクラス全体を回避します。私たちの攻撃は、悪意のあるJavaScriptサンプルの構造を変更して、良性構文を再現することで構成されています。
この目的のために、悪意のあるJavaScript入力の抽象的な構文ツリー(AST)を既存の良性のものに自動的に書き換えます。特に、Hidenoseekは悪意のある種子を使用し、種子と伝統的な良性スクリプトの間の同型サブグラフを検索します。具体的には、良性のサブアストを悪意のある同等物(同じ構文構造)に置き換え、良性のデータ依存関係を調整します - ASTを変更することで - 悪意のあるセマンティクスが保持されます。実際には、23の悪意のある種子を活用して、91,020の悪意のあるスクリプトを生成しました。これは、ALEXAのトップ10,000 WebページのASTを完全に再現しています。また、各ALEXAトップ10と同じASTを持つ平均14種類の悪意のあるサンプルを生成できます。
全体として、標準の訓練された分類器には、Hidenoseek入力を伴う99.98%の偽陰性がありますが、そのようなサンプルで訓練された分類器には88.74%以上の誤検知があり、ターゲットを絞った静的検出器を信頼できません。
このプロジェクトは、 LICENSEで見つけることができるAGPL3ライセンスの条件に基づいてライセンスされています。