该存储库包含我们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中找到。