2022 CCF BDCI
数字安全公开赛
赛题「Web攻击检测与分类识别」
地址:http://go.datafountain.cn/4Zj
@学渣和小白战队
获奖方案
团队简介
王文杰,就职于萨摩耶数字科技人工智能部,擅长信贷风控领域数据挖掘。获得荣誉如下:
竞赛1:DataFoutain - 光伏功率异常数据识别竞赛(国家电投主办),最终名次A榜第7、B榜第11(TOP7%)
竞赛2:DataFoutain - 企业非法集资风险预测比赛(CCF):3400支队伍参加最终名次28(<TOP1%)
竞赛3:天池 - PAKDD2021 第二届阿里云智能运维算法大赛(阿里云):1350只队伍参加排名第11(<Top1%)
胡嘉豪,就职于萨摩耶数字科技人工智能部,热爱机器学习,尤其对NLP领域相关技术感兴趣。获得荣誉如下:
竞赛1:科大讯飞蛋白质结构预测挑战赛,排名 40/1107
竞赛2 : 信也科技图算法比赛—欺诈用户风险识别,入围复赛,最终排名26
摘要
传统威胁检测手段通过分析已知攻击特征进行规则匹配,无法检测未知漏洞或攻击手法。如何快速准确地识别未知威胁攻击并且将不同攻击正确分类,对提升Web攻击检测能力至关重要。利用机器学习和深度学习技术对攻击报文进行识别和分类已经成为解决该问题的创新思路,有利于推动AI技术在威胁检测分析场景的研究与应用。
赛题解读和数据EDA
本赛题总共提供了33219条训练样本,4000条测试样本。训练样本中总共有6类数据标签,分别为0(白标签)、1(SQL注入)、2(目录遍历)、3(远程代码执行)、4(命令执行)、5(XSS跨站脚本),6类标签的分布如图1.
图1:各类别标签数量和占比
其中标签为0的数据代表正常Http报文,类别1到5为不同种类的攻击报文。赛题的目标是建立多分类模型精准识别出6个类别,评价方式为macro F1。预测使用的信息为Http信息中的信息段,其中包含method、user_agent、url、body和refer等特征,具体格式如图2
图2:训练样本数据格式
由于该赛题是一个多分类问题,所以围绕攻击类别标签数据进行了相关分析,web攻击的核心思想是通过输入特定的可执行语句,让后台系统执行达到攻击意图的本质。例如SQL注入攻击,攻击者在提交表单的时候,在用户输入的字符串中加入 SQL 语句,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据。SQL攻击比较显著的特点是脚本语句中会出现SQL的命令关键字、例如报文中会出现“select” 、”from”等sql关键字。目录遍历攻击的特点是被攻击的消息中含有多级目录,例如
“/static/css//../../../../../../../../windows/win.ini”,识别的核心要点是对目录的判断,类别3攻击模式是远程代码执行,由于含有远程两字,所以攻击数据中会出现request、servlet、response这类包含远程交互的关键字。
图3:远程代码执行攻击url数据示例
类别4是命令执行攻击,主要特点是系统url中含有各种操作系统指令、例如shell 、linux命令等。
图4:命令执行工具url数据示例
XSS攻击是指跨站脚本攻击,例如在表单中提交含有可执行的javascript的内容文本,如果服务器端没有过滤或转义这些脚本,而这些脚本由通过内容的形式发布到了页面上,这个时候如果有其他用户访问这个网页,那么浏览器就会执行这些脚本,从而被攻击,从而获取用户的cookie等信息。比较常见的特点是消息报文中出现alert、onmouseover等JavaScript的语法关键字。
解题思路
本题目的数据中主要以http报文中的url、body、user_agent为主,基本上全是偏长的字符串,字符串中涵盖各种HTTP信息标识、特殊符号、浏览器信息、域名以及传输数据等信息,如何从长字符串中提炼信息成为了解题关键,为了更全面的提取特征信息,本方案一共使用了以下3种特征提取方式。
特征提取
2.1 TFIDF信息提取和SVD降维
第一种是分别对HTTP中url、body、user_agent以及refer的内容计算TFIDF值,TFIDF的ngram选择范围为2到5(经过调参以及计算速度的综合考量确定)。即使是2到5的范围,提取出的url和body的tfidf特征维度依然非常庞大,光url的TFIDF的维度就有70多万,庞大的特征数量无法支持后续模型的训练,因此,再提取的TFIDF的基础上通过SVD算法(奇异值分解)分别对url、user_agent、body和refer进行降维,降维每个信息段只留存16维特征,4个信息段合集64维特征。
2.2 数据切割后的词频衍生
由于TFIDF的计算的ngram最大值为5,一些较长的单词无法被提取,且降维会造成一定的信息损失。为了最大化数据信息价值,对每个信息段进行了数据切割,将特殊符号作为分割符切词,对切出的词计算词频,以/livemsg?ad_type=WL_WK&ty=WL_WK为例,?和&符号作为分隔符切割为“/livemsg”、“ad_type”、“WL_WK”、“ty”、“WL_WK”等单词,然后根据样本中出现的单词数量衍生词频特征。
url_livemsg |
url_ad_type |
url_wl_wk |
url_ty |
1 |
1 |
2 |
1 |
词频提取的数据格式示例
考虑到有些单词出现的次数很少、例如特定的IP、用户信息,所以设置了一定的词频数量门槛,这样做有两点好处,一是可以将一些无关紧要的信息剔除,减少个别噪声对模型的影响,同时又可以减少数据维度降低模型训练难度,经过该步骤处理后可以得到1000维左右的词频特征。
2.3 业务知识特征衍生
由于本赛题中各个攻击模式存在一些特点,所以围绕各标签的特点衍生了一些业务特征,大部分为各个攻击类别的关键字。例如SQL注入的“select”、”where”、”database”、目录遍历的路径符号”../”、“..%2f”,远程代码执行的”jndi”、“servlet”等。除了特点关键字以外,还会通过正则表达式提取ip地址数量、email地址数量等信息。算上TFIDF和词频衍生特征后总提取出1200维左右的特征。
样本优化处理
3.1 ClassWeight修正
提取出的特征建立基线模型跑出的测试集结果在0.96左右,有意思的是,测试集中的分类结果分布和训练集有着明显的差异,测试集中白样本、sql注入、目录遍历和远程代码执行4个类别分别占了总样本中的20%左右,剩下的命令执行和XSS跨站脚本分别占了10%,和图1展示的额训练集类别分布差异较大。为了使模型重视测试集中分类变多的样本,对训练样本的分类权重采取了一定的修正,每个类别的权重设定成测试集样本占比/训练集样本占比,具体修正表如下:
class_weight_dic = {
0: 0.204/0.422,
1: 0.201/0.299,
2: 0.199/0.195,
3: 0.176/0.042,
4: 0.116/0.020,
5: 0.101/0.019,
}
经过Classweight修正后的类别权重后的排行榜评分有着比较明显的效果提升。
3.2 SampleWeight修正
另一方面,数据中存在有一些攻击模式的数据样本过少,有些攻击类别甚至只有1、2条,针对此类样本对进行了加权,同样对分类标签存疑的样本进行了样本降权。另外,如果训练集和测试集的Http报文基本一致,但是训练集的标签和测试集推理结果却不一致也能说明模型的问题。为了搜素出此类样本,我们使用了auto-encoder提取每条复杂多样的攻击URL中的核心信息,将每条URL序列都转化为一个128维的向量。通过该向量,我们可以去计算两两样本的相似度(i.e.基于余弦相似度),寻找与测试集中的每条样本最相似的训练样本。从而针对性分析差异样本修正权重。
图6:AutoEncoder自编码器示意图
模型建立和评测
4.1 模型建立
模型最终选择8折lightgbm,基于8个模型的推理结果求平均得到最终模型效果,模型具体参数如下:
parameters = {
'learning_rate': 0.03,
'objective': 'multiclass',
'metric': METRIC,
'num_class': 6,
'num_leaves': 31,
'feature_fraction': 0.6,
'bagging_fraction': 0.8,
'min_data_in_leaf': 50,
'verbose': -1,
'nthread': -1,
'max_depth': 7
}
4.2 模型效果
最终模型线上成绩为0.97,以下是准确率混淆矩阵:
图7:含权重混淆矩阵
图8:不含权重混淆矩阵
4.3 方案优势
1、信息使用充分:原始信息tfidf的信息提炼、分词后的词频统计以及业务特征的提炼。
2、样本权重的优化,基于数据特点进行了标签权重的优化、样本权重的优化,通过这些优化切实提高了模型效果。
3、模型训练速度快,结构简单,最终入模特征在550维左右,整个训练从数据到结果15分钟左右(电脑配置:CPU:i7-1165G7 @ 2.80GHz 内存:40G)。
致谢
非常感谢CCF、DataFoutain以及360安全中心为我们提供的赛题,这次的赛题长不仅非常有趣,还非常有挑战,涉及到非常广的计算机技术,例如css、html、http、sql、java、JavaScript以及shell等,整个竞赛过程收获颇丰,同时,也要感谢队友胡嘉豪提供的思路和帮助,期待下次比赛有所突破,取得更好的成绩!