接续上篇:
Adversarial ML Threat Matrix——对抗性机器学习威胁矩阵<简介>
本篇<案例研究>将一起学习探讨至发布时间更新的技术案例研究。
并且,原名称Adversarial ML Threat Matrix的对抗性机器学习威胁矩阵现已经在官网更新上线啦,ATLAS全称Adversarial Threat Landscape for Artificial-Intelligence Systems。故以后文章标题都不再采用Adversarial ML Threat Matrix会简写为ATLAS。
针对恶意软件 C&C 流量的深度学习检测器规避1:
Palo Alto Networks Security AI 研究团队测试了一个深度学习模型,用于检测 HTTP 流量中的恶意C&C流量。该模型基于论文《URLNet: Learning a URL Representation with Deep Learning for
Malicious URL Detection》,在生产模型相似的数据集上进行了训练,可以达到与之相似的性能,并构造对抗样本、通过查询模型结果相应地调整对抗样本,直到模型被绕过。
URLNet: Learning a URL Representation with Deep Learning for
Malicious URL Detection
URLNet:使用深度学习URL表征,用于恶意URL检测
传统方法会使用黑名单,但弊端是难以覆盖全面,也不能及时检测出新生成的恶意url。当前比较流行的机器学习类检测方法有:使用词袋提取URL字符串的字段特征属性,再上诸如支持向量机(SVM)这类模型,专家再设计有针对的特征来优化模型。以上方法的局限性有:
(1)简单词袋分词模型无法捕捉语义以及语序模式。
(2)需要大量人工工作进行特征工程。
(3)不能处理不可见的特征,难以泛化测试集数据。
URLNet则是一个基于DL使用非线性编码方式的检测模型,使用了CNN联合优化框架来学习URLEmbedding。该模型的优势在于可以捕获到URL中的几种语义信息,并且可以解决出现较多罕见词问题。
传统方法通过爬取专门记录钓鱼url的网站数据来构建黑名单,这类网站如PhishTank(2022-02-17现已暂时停止开放注册新用户)。传统方法优势有:速度快,误报低,数据库查询技术简单,但劣势明显:严重依赖于情报与数据的实时性,对于每天都会新产生的url,这种侦察永远处于被动状态。故使用机器学习的方法,来尝试解决上述问题。
模型提取的特征有:词汇(lexical)、主机(hostbased)、内容(content)、上下文(context)、流行度(popularity),其中词汇特征是常用、且最易获得,表现最好的,该特征包含了诸如url长度、标点数量、字符字母数字分布、出现单词类型等统计特性。基于主机名的特征,包含了IP、地理位置、WHOIS等信息。内容特征主要指需要进行访问或下载的动作后获得的内容,如HTML、JS的特征。上下文与流行度特征主要考察该url在社交媒体上共享的排名或人气分数。再使用词袋模型,用支持向量机等算法(作为基线模型),完成训练。虽然简单基于机器学习可以达到检出新url的效果,但仍有局限性:无法捕获语义及语序;需要大量专家经验特征工程(如:n-gram的n值);不能捕获“不可见”的特征;词量大时引发内存问题。
而该论文使用字母与单词级别联合优化的方法,很好的解决了以上的问题,作者们有大量的实验分析与消融实验佐证,拥有良好的泛化能力。
解决问题:二分类
输入对象:URL字符串—— u i , i = 1 , … , t u_i,i=1,\ldots, t ui,i=1,…,t
输出类别:恶意/非恶意—— y i ∈ { − 1 , + 1 } y_i \in \{-1,+1\} yi∈{−1,+1}
步骤框架:
(1)样本提取特征,转换为n维特征空间表示:
u i → x i , x i ∈ R n u_i \to x_i,x_i\in R^n ui→xi,xi∈Rn
(2)学习函数映射:(本文即CNN框架)
f : R n → R f: R^n \to R f:Rn→R
(3)定义并最小化损失函数:
∑ i = 0 T I y ^ t ≠ y t ( y ^ t = s i g n ( f ( x t ) ) ) \sum_{i=0}^T I_{\hat y_t \neq y_t}(\hat y_t =sign(f(x_t))) ∑i=0TIy^t=yt(y^t=sign(f(xt)))
为何需要语序特征及其解释?
例如:检测出“com”是出现在特定位置(顶级域名),还是路径中。
除了之前提出的诸多问题,传统模型(e.g.SVM)还存在训练集中稀有词难以被利用到;重新训练对于新词实现特征化会不断增加模型和特征维度的大小。
接续上述问题,进行建模,对于初始化可以选择随机(当然也可以使用其他词集进行预训练)。
定义符号:样本数量为t,初始输入n维特征,给定url长度L,矩阵 R t × n R^{t× n} Rt×n,卷积滤波器filter: W h × n W^{h×n} Wh×n(注意kernel和filter的区别),偏置bias: b i b_i bi,非线性激活函数 f f f,卷积输出 c c c。
数据预处理:短于L进行填充(padded),长于L进行剪裁(truncated)
T = x 1 ⊕ x 2 ⊕ … ⊕ x t T=x_1 \oplus x_2 \oplus … \oplus x_t T=x1⊕x2⊕…⊕xt
c i = f ( W ⊗ x i : i + h − 1 + b i ) c_i=f(W \otimes x_{i:i+h-1}+b_i) ci=f(W⊗xi:i+h−1+bi)
c = [ c 1 , c 2 , … , c t − h + 1 ] c=[c_1,c_2,…,c_{t-h+1}] c=[c1,c2,…,ct−h+1]
卷积后输入池化层(可选最大池化/平均池化法),用于识别重要特征并降维。多个filters的不同长度h作为超参数,可以自己设置,池化后的输出将接入全连接层进行分类,并使用随机梯度下降开始反向传播训练网络。
URLNet使用了两个CNN网络,一个是字母级(character-level)CNN,一个是单词级(word-level)CNN。
目标:学习字母出现顺序
步骤:
(1)在数据集中定义特殊字符
(2)在语料库中出现频率小于某一阈值k的字符,将用“
(3)不够长度的url样本将用“
参数设置:阈值长度设置为了200,特征维度n=32,则样本空间为; u i → x i , x i ∈ R k × n u_i \to x_i,x_i\in R^{k×n} ui→xi,xi∈Rk×n,filter-h:h=3,4,5,6,filter通道数:256。
模型特点:
(1)由于字符数量一定,模型大小不会像基于单词的模型那样随数据量一同增长。
(2)自然地字母级模型忽略单词边界,无法获取到单词维度的信息(e.g:恶意url有可能通过微调几个单词,来模仿正常url,而filters很可能对相似的拼写产生相似的输出)。
步骤:
(1)从训练数据中定义生成语料库。
(2)使用了特殊字符作为单词的分隔符。在语料库中出现频率小于某一阈值k的词,或不可读的单词,将用“
(3)不够长度的url样本将用“
(4)最后经过池化、全连接层,作为一个分支输出。
参数设置相同:阈值长度设置为了200,特征维度n=32,则样本空间为; u i → x i , x i ∈ R k × n u_i \to x_i,x_i\in R^{k×n} ui→xi,xi∈Rk×n,filter-h:h=3,4,5,6,filter通道数:256。
模型特点:
大小会随数据量增加,对内存造成压力,使用
提出原因:在恶意URL检测的场景中,比起其他NLP使用的场景,特殊字符在上下文中出现的更频繁、有关联性,且URL不是自然语言的语义语法,文章认为这部分的信息增益显著,不能过滤掉。
使用该方法可减缓丢失的信息:
(1)特殊符号的分布、类别
(2)特殊符号附近词语的时序关系
提出原因:上述未经优化的纯词嵌入模型无法有效嵌入新词、因内存问题无法使用稀有词。
字符嵌入矩阵: E M c ∈ R L 1 × k EM_c \in R^{L_1×k} EMc∈RL1×k
字符->填充/剪裁-> L 2 = 20 L_2=20 L2=20
词级嵌入矩阵: E M w ∈ R L 2 × k EM_w \in R^{L_2×k} EMw∈RL2×k
URL嵌入矩阵: U R L w ∈ R L 2 × k URL_w \in R^{L_2×k} URLw∈RL2×k、 U R L c w ∈ R L 2 × k URL_{cw} \in R^{L_2×k} URLcw∈RL2×k
详情实现见图二、图三及源码解析部分
如图三所示,原始输入数据将被两个分支(字母级、单词级)处理,并分别卷积、池化,进入全连接层(dropout+正则化)通过激活函数后,输出到分类器,最后用反向传播对模型进行优化。
数据集来源:VirusTotal
VirusTotal提供服务:包含64份黑名单(如网络犯罪、诈骗、BitDefender、谷歌安全浏览器等),输入URL后,会返回该URL在多少份黑名单中有记录。
数据集构建:如果在VirusTotal的64份黑名单中没有记录,则标记该URL为良性(Benign)。若URL被黑名单记录的数量越多,则认为该URL为恶意的置信度越高。超过于五份黑名单出现的URL被标记为恶意(Malicious);小于五份的URL会被丢弃,不纳入数据集中。文章爬取了2017.5~2017.6的所有URL记录,并进行了去重操作。最终数据集,恶意URL占比6%,良性URL占比94%。为减少偏差,各域名的占比率被控制在5%以下。数据集项根据爬虫查询的时间戳排列,以此来训练时避免前窥偏差(look-ahead bias),排序后从前60%的URL随机选取500万条进行训练,从后40%中选取1000万条进行测试。
两个模型中,仅单词级CNN需要构建字典,以词袋模型的方式提取特征,文章还根据专家经验选取了以下特征:
特征 | 描述 |
---|---|
UCT(URL Component Tokenization) | URL组成部分:包含主域名、路径、令牌、顶级域名,可以获取到语序特征。 |
PSB(Position Sensitive & Bi-grams) | 词位敏感度与二元组 :对主域名、路径使用二元组模型提取,{X}用于标识token位置,如:domain{1}、path{2}。 |
Character Tri-grams | 字母三元组 :使用长度为三个字母的滑动窗口生成,解决恶意URL的伪装问题,并根据参考文献,只提取参数名称,将参数值丢弃。 |
其他 | URL长度、主机名长度、URL的‘.’数量 |
基线 | 字母熵、字符连贯率、数字占比 |
由图五,我们可以看见特征总量非常大,并且随着数据集变大而不断增加。其中advanced BoW代表使用n-grams提取的特征,Basic BoW代表传统分词方法提取的特征。
由图六,我们可以发现,有近90%的单词在训练集语料库中只出现了一次,证明90%的词都可以定义为“罕见词”,在大规模数据集中不舍弃会引起内存问题,比如词嵌入时,k=32,嵌入矩阵参数将超过1.5亿。所以字母级就可以将这些无法存储的单词嵌入进行表示,并可以获得每个单词更细粒度的信息。
基线模型:LibLinear L1-regularized L2-loss SVM,分别对上述图五的五类特征数据集(1.Whole URL BoW 2.UCT 3.PSB 4.Character Tri-grams 5.Combined)做训练,也对比了单一字母级、传统单词级CNN模型。比较指标有:ROC-AUC、TPR、FPR。
文章使用tensorflow、kerasu框架实现,参数设置为:
(1)优化器:Adam
(2)卷积层 Dropout rate:0.5
基线模型显示了UCT特征比Whole URL BoW方式更有效,并且所有特征结合的Combined数据训练效果最好,也显示了URLNet可以比基线模型更好捕捉语义和结构信息。
我们可以看到在单词级CNN“特殊符号视作单词处理”、“基于字符嵌入优化词级嵌入”部分,总体提高了AUC值。在FPR值更小时存在一些偏差,最原始的单词级CNN模型可以达到更高的TPR,当数据集量更大时,问题暴露得更明显。文章认为这两项处理使得单词级CNN的表现向字符级靠近,从而导致了该问题,并在两者结合URLNet(FULL)模型也体现了。
总体来说,URLNet(FULL)模型还是优于单一级别的CNN。
此处使用随机采样了恶意、良性URL样本各1000条。URLNet模型采用了中间分支连接层【Concatenated Char and Word
feature vector layer】的输出(维度:1024),基线模型提取特征向量(维度:14604),绘图采用了t-SNE方法进行降维可视化。
对比图十、图十一可见,URLNet模型类间离散的效果较好,决策面清晰,而基线模型类间重叠部分较多。
为观察类内聚集簇物理解释,作者对数据进行词汇特征模式标注(黑色符号)。
作者罗列了参考文献中,有价值的几类特征(上文也叙述过了):黑名单、词汇、基于主机、内容、基于上下文、流行度。传统方法有其劣势,比如内容特征的获取需完成下载或访问动作,虽然能近乎无误进行人工分类,但速度慢、并且风险大,开销大。
关于词汇特征,除了上述说的简单统计特性,还有其他高级表征Kolmogorv复杂度、抗混淆特征、url内部自关联特征等,但这些特征需要大量专家经验和特征工程,无法应用于大规模数据集。
使用DL的优势就在于模型可以自动地从非结构化的原始数据中学习特征,故URLNet可以免去繁复的特征工程直接学习原始URL的表征。对比其他模型框架,如LSTM无法解决梯度消失、梯度爆炸的问题,所以满足恶意URL检测场景的模型较少,作者对比另一只用字母级CNN模型进行检测的工作,得出URLNet这种联合优化框架更具优势。
文章提出了字母级、单词级CNN联合优化的网络框架,以及专门针对恶意URL检测场景的词嵌入技术,使得不需要任何人工特征提取以及专家经验,就可以实现非常好的检出效果。
笔者总结:在通读介绍中,保留了原文的行文结构,摘取了重要的信息以及逻辑推导思路(原文很多翻来覆去在那讲的东西,像极了凑字数的我(大误))、演算及实验过程。模型使用了文本熵的方法,并且“缝合”了两种细粒度的CNN以达到最好的效果,其实我们看到实验数据,训练好其中一种CNN的使得工程化落地也可以有非常不错的效果。但我们也不能全然忽略传统简单的机器学习方法,适当平衡人工特征工程可以让模型的物理可解释性更强。当然文章本身也在可视化板块作出了可靠的解释,文章可以“自圆其说”。
靶环境项目指路:https://github.com/Antimalweb/URLNet
笔者由于工作原因,投入时间较少,复现简单粗糙,不严谨之处欢迎指正。
首先这个项目没有提供他们采集的数据集,大家可以使用自己的数据集进行训练。笔者用了kaggle的(45w+),网上已有非常多的开源url打标数据集,各位可自由选取。论文中写了此模型解决了大规模数据集训练的内存问题,我在这使用 1 0 5 10^5 105级别数据量来训练,希望达到一个较好的指标,则认为模型demo已实现,找出模型自身逻辑漏洞,而不是单纯数据量层面的博弈。
该项目tensorflow使用1.14版本,tf2+的各位请注意切换环境。
经过论文通读后,我们大概知道了整个模型干了什么,最终效果怎样。最后通读源码,带着问题看作者们的思路。
文件名 | 梗概 |
---|---|
utils.py | 数据预处理、文本向量化 |
train.py | 执行、训练、日志记录、断点参数设置 |
TextCNN.py | CNN实现 |
auc.py | 衡量模型性能各指标参数计算 |
test.py | 训练参数设置、测试模型训练效果 |
demo.sh | – |
我们可以先将源码中提供的五种方法,大概跑出结果,先看看各方法的表现,再去深究原因。笔者此处使用默认参数,试用了8w+数据训练train.nb_epochs=25,测试3000余条样本,初步查看各模型准确率情况。
model.emb_mode | Accuracy |
---|---|
1: charCNN | 0.7630617603409566 |
2: wordCNN | 0.9246570455496784 |
3: char + wordCNN | 0.7486728947068001 |
4: char-level wordCNN | 0.8005727006354885 |
5: char + char-level wordCNN | 0.625858575288253 |
方法五在此数据量下的准确率只有0.62挺出乎我意料的,决定在方法五上跑完45w+数据train.nb_epochs=128,再在更大的测试集(未作去重)进行验证。结果发现准确率也没有得到很大提升。
ATLAS使用URLNet架构训练http的包头数据构建出检测恶意C&C通信流量模型,最后构造样本绕过。由此也可见,该模型具有一定的泛化迁移优势。我不希望使用重型的模型去攻击对抗,此处还是针对相比之下简单一些的URL进行实验。
正所谓自己造矛又自己造盾,自己训练的URLNet确实比较好绕过的,未来有时间会把http的包头数据构建出检测恶意C&C通信流量模型的坑填一下。
由于识别准确率不高,构造出可绕过样例并不困难,大家可以自己简单尝试。若像原文一样,使用大规模的数据集训练,则需构造出训练集规则之外的,这时候,还是需要借助一些模型提取规则的方法,进行绕过。总的来说,这种识别方法个人感觉参考价值不是很高,所以就不再深入,对文本处理方法感兴趣的可以训练http的包头数据构建出检测恶意C&C通信流量模型,再来研究其中的机制。
从物理原因处分析,url自身不代表“恶意”/“非恶意”的用途,不像恶意指令/流量,往往有其实际的作用与含义。如:一个人叫张三,现在工作是产品经理,很难单从从大规模的犯罪前科的人名+职业的信息中来学习和预测出这个人是好人还是坏人。但是如果是一个工具,比如“餐刀”,“菜刀”,“锯子”,“军刀”,“手术刀”,确实可以和某些动作实体产生联系,进而评估可造成的伤害等级。所以更推荐直接对检测恶意C&C通信流量/其他领域进行深入研究。当然,如果像DGA技术,用程序大规模生成的恶意url和域名,是可以使用ML/AI方法检出的,所以此处应用场景应该更细化,该模型的价值更高。
上述材料仅供学习,请不要攻击实际生产的AI系统!
练习请自行搭建AI靶场。
最后给大家安利一个租卡平台:
autoDL:https://www.autodl.com
一个非常好上手的平台,易用性高,帮助文档也非常详细,小白也可以快速搭建起环境,然后开始快乐炼丹。
各位老板也可以填一下我的邀请码:https://www.autodl.com/register?code=4bacd9d2-d4bf-4baf-82c9-7b935986a34d,可以获得十元代金卷试用。(也可以让我薅薅AutoDL羊毛,btw:诚心非广,本菜狗还不配)
Case Studies ↩︎