該存儲庫包含我們CCS'19論文的大部分代碼:“ Hidenoseek:偽裝在良性asts中的惡意javascript”,即:
請注意,在當前狀態下,該代碼是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文件夾之間的克隆,您應該事先生成PDG(參見PDGS生成),並將其作為輸入src/samples_generation.replace_ast_df_folder函數。
要檢測2個JavaScript樣本之間的克隆,您應該直接將文件路徑作為src/samples_generation.replace_ast函數的輸入。
要從文件夾文件夾_NAME生成JS文件的PDG,請從src文件夾位置啟動以下shell命令:
$ python3 -c "from pdgs_generation import store_pdg_folder; store_pdg_folder('FOLDER_NAME')"
相應的PDG將存儲在folder_name/pdg中。
要生成一個給定的JS文件Input_file的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行)。
要從文件夾文件夾_benign_pdgs和來自folder_malicious_pdgs的惡意中的pdg之間找到克隆,請從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-analysis。對於分析的每個良性PDG,它將包含一個JSON文件(名稱格式:benign_malicious.json),該文件總結了主要發現,例如相同的節點,相同的節點,不同的標記,不同的基準測試...不同的基準...
此外,我們在報告中顯示了報告克隆的良性和惡意代碼。可以通過評論src/samples_generation.py的print_clones行153的呼叫來禁用,例如,用於多處理。
要在良性JS文件benign_js和惡意的一個惡意_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_worker來更改它。如果使用超過1個CPU,則應將呼叫撥打print_clones Line 153的src/samples_generation.py 。
文件夾example/Benign-example包含example.js從我們的論文中的良性示例,而example/Malicious-seed/seed.js是我們紙上的惡意種子。
要在這兩個文件之間檢測克隆,請從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個語句組成)。這意味著在良性示例中,可以以兩種不同的方式重寫整個惡意種子。
此外,創建了包含其他克隆信息的文件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輸入的抽象語法樹(ASTS)自動重寫為現有的良性良性。特別是,Hidenoseek使用惡意種子並尋找種子和傳統良性腳本之間的同構子圖。具體而言,它用其惡意等效物(相同的句法結構)代替了良性子播種,並調整了良性數據依賴性(沒有更改AST),以便保留惡意語義。在實踐中,我們利用23種惡意種子生成91,020個惡意腳本,這些腳本完美地複制了Alexa前10,000個網頁的AST。此外,我們平均可以生產與每個Alexa Top 10的AST相同的14個不同的惡意樣本。
總體而言,經過訓練的分類器具有99.98%的假否定性,並帶有Hidenoseek輸入,而在此類樣本上訓練的分類器具有超過88.74%的假陽性,使目標靜態探測器不可靠。
該項目是根據AGPL3許可條款獲得許可的,您可以在LICENSE中找到。