hmm
登录
注册
学点算法搞安全之HMM(上篇) 兜哥2017-04-20 首发专栏:兜哥带你学安全关注
*原创作者:兜哥,本文属Freebuf原创奖励计划,未经许可禁止转载
前言
隐式马尔可夫(HMM),也称韩梅梅,广泛应用于语音识别、文本处理以及网络安全等领域,2009年I Corona ,D Ariu , G Giacinto三位大神关于HMM应用于web安全领域的研究论文,让HMM逐渐被各大安全厂商重视。
本篇重点介绍HMM最常见同时也比较基础的基于url参数异常检测的应用,后继文章将介绍HMM结合NLP技术在XSS、SQL、RCE方面的应用。”多一个公式少一半读者”,所以霍金的《时间简史》和《明朝那些事》一样畅销,我的机器学习系列文章都是尽量少讲概念,多讲例子,希望可以让机器学习被更多人了解和使用。
HMM基础原理
1.png
现实世界中有一类问题具有明显的时序性,比如路口红绿灯、连续几天的天气变化,我们说话的上下文,HMM的基础假设就是,一个连续的时间序列事件,它的状态受且仅受它前面的N个事件决定,对应的时间序列可以成为N阶马尔可夫链。
2.png
假设今天是否有雾霾只由前天和昨天决定,于是就构成了一个2阶马尔可夫链,若昨天和前天都是晴天,那么今天是晴天概率就是90%。
3.png
稍微再复杂点,假设你想知道2000公里外一个城市的雾霾情况,但是你没法直接去当地看到空气情况,手头只有当地风力情况,也就是说空气状态是隐藏的,风力情况是可观察的,需要观察序列推测隐藏序列,由于风力确实对雾霾情况有较大影响,甚至可以假设风力大的情况下90%概率是晴天,所以通过样本学习,确实可以达到从观察序列推测隐藏序列的效果,这就是隐式马尔可夫。
URL参数建模
常见的基于GET请求的XSS、SQL注入、RCE,攻击载荷主要集中在请求参数中,以XSS为例:
/0_1/include/dialog/select_media.php?userid=%3Cscript%3Ealert(1)%3C/script%3E
正常的http请求中参数的取值范围都是确定的,这里说的确定是指可以用字母数字特殊字符来表示,并非说都可以用1-200这种数值范围来确定。以下面的几条日志为例:
/0_1/include/dialog/select_media.php?userid=admin123
/0_1/include/dialog/select_media.php?userid=root
/0_1/include/dialog/select_media.php?userid=maidou0806
/0_1/include/dialog/select_media.php?userid=52maidou
/0_1/include/dialog/select_media.php?userid=wjq_2014
/0_1/include/dialog/select_media.php?userid=mzc-cxy
肉眼观察可以归纳出userid字段的由字母数字和特殊字符’-_’组成,如果你足够强大可以看完上万的正常样本,甚至都可以总结取值范围为[0-9a-zA-Z-_]{4,}。如果有上亿的日志上百万的参数,人工如何完成?这时候机器学习可以发挥作用了。
以uid字段为例,uid的取值作为观察序列,简化期间可以对uid的取值进行泛化,整个模型为3阶HMM,隐藏序列的状态只有三个S1、S2、S3:
[a-zA-Z]泛化为A
[0-9]泛化为N
[\-_]泛化为C
其他字符泛化为T
4.png
admin123泛化为AAAAANNN
root泛化为AAAA
wjq_2014泛化为AAAACNNN
5.png
隐藏序列就是S1-S4三个状态间循环转化,这个概率称为转移概率矩阵,同时四个状态都以确定的概率,以观察序列中的A、C、N、T四个状态展现,这个转换的概率称为发射概率矩阵。HMM建模过程就是通过学习样本,生成这两个矩阵的过程。生产环境中泛化需谨慎,至少域名、中文等特殊字符需要再单独泛化。
数据处理与特征提取
由于每个域名的每个url的每个参数的范围都可能不一样,有的userid可能是[0-9]{4,},有的可能是[0-9a-zA-Z-_]{3,},所以需要按照不同域名的不同url不同参数分别学习。泛化过程如下:
def etl(str):
vers=[]
for i, c in enumerate(str):
c=c.lower()
if ord(c) >= ord('a') and ord(c) <= ord('z'):
vers.append([ord('A')])
elif ord(c) >= ord('0') and ord(c) <= ord('9'):
vers.append([ord('N')])
else:
vers.append([ord('C')])
return np.array(vers)
友情提示,为了避免中文等字符的干扰,ASCII大于127或者小于32的可以不处理直接跳过。
从weblog中提取url参数,需要解决url编码、参数抽取等恶心问题,还好python有现成的接口:
with open(filename) as f:
for line in f:
#切割参数
result = urlparse.urlparse(line)
# url解码
query=urllib.unquote(result.query)
params = urlparse.parse_qsl(query, True)
for k, v in params:
#k为参数名,v为参数值
友情提示,urlparse.parse_qsl解析url请求切割参数时,遇到’;’会截断,导致获取的参数值缺失’;’后面的内容,这是个大坑,生产环境中一定要注意这个问题。
训练模型
安装hmmlearn
hmmlearn是python下的一个HMM实现,是从scikit-learn独立出来的一个项目,依赖环境如下:
Python >= 2.6
NumPy (tested to work with >=1.9.3)
SciPy (tested to work with >=0.16.0)
scikit-learn >= 0.16
安装命令如下:
pip install -U --user hmmlearn
训练模型
将泛化后的向量X以及对应的长度矩阵X_lens输入即可,需要 X_lens的原因是参数样本的长度可能不一致,所以需要单独输入。
remodel = hmm.GaussianHMM(n_components=3, covariance_type="full", n_iter=100)
remodel.fit(X,X_lens)
训练样本得分为:
score:16 query param:admin123
score:9 query param:root
score:21 query param:maidou0806
score:16 query param:52maidou
score:15 query param:wjq_2014
score:12 query param:mzc-cxy
模型验证
HMM模型完成训练后通常可以解决三大类问题,一类就是输入观察序列获取概率最大的隐藏序列,最典型的应用就是语音解码以及词性标注;一类是输入部分观察序列预测概率最大的下一个值,比如搜索词猜想补齐等;另外一类就是输入观察序列获取概率,从而判断观察序列的合法性。参数异常检测就输入第三种。
我们定义T为阈值,概率低于T的参数识别为异常,通常会把T定义比训练集最小值略大,在此例中可以取10。
with open(filename) as f:
for line in f:
# 切割参数
result = urlparse.urlparse(line)
# url解码
query = urllib.unquote(result.query)
params = urlparse.parse_qsl(query, True)
for k, v in params:
if ischeck(v) and len(v) >=N :
vers = etl(v)
pro = remodel.score(vers)
if pro <= T:
print "PRO:%d V:%s LINE:%s " % (pro,v,line)
以userid=%3Cscript%3Ealert(1)%3C/script%3E为例子,经过解码后为,范化后为TAAAAAATAAAAATNTTTAAAAAAT,score为-13945,识别为异常。
截图 (10).png
总结
本文介绍了HMM在web安全的基础应用,由于仅依赖参数的文本特征进行异常检测,虽然理论上只要白样本足够多确实可以识别几乎所有基于GET请求参数的未知攻击,但是由于缺乏语义层面异常检测,误报率比较高。另外扫描器等对结果的影响很大,如何进一步提升检测能力,请看下篇。
*原创作者:兜哥,本文属Freebuf原创奖励计划,未经许可禁止转载
专栏
10
兜哥
兜哥
37 篇文章
等级: 5级
关注
||
这些评论亮了
ychcqshan (1级)回复
认真看了兜哥撰写的学点算法搞安全之HMM(上篇)(下篇),现有以下几点问题(可能太简单):1、关于观测序列、泛化的观测序列(A,N,C,T)、隐藏的状态序列(S1,S2,S3,S4)的表述中,不是很明白,我是这样理解的——S1对应的是A,S2对应的是N,S3对应的是C,S4对应的是T——这样的话,观测状态和隐藏的状态是一 一对应的;2、在文中“隐藏序列就是S1-S4三个状态间循环转化,这个概率称为转移概率矩阵,同时四个状态都以确定的概率,以观察序列中的A、C、N、T四个状态展现,这个转换的概率称为发射概率矩阵”的表述中,隐藏状态为4个,与上面阐述的“整个模型为3阶HMM,隐藏序列的状态只有三个S1、S2、S3”是否存在矛盾;3、在调用hmmlearn时,泛化后的向量长度是不一样的,直接用fit()函数是否存在报错情况(在hmmlearn中fit函数接收的向量列表X,要求向量的长度一致,不一致会报错!)
)20(亮了
发表评论已有 22 条评论
太阳风1122 (1级) 2017-05-04回复 1楼
兜哥的机器学习文章一直跟着,学到的东西确实不少
亮了(4)
浪子_三少 专栏作者(4级) windows Cracker 2017-05-09回复 2楼
点赞不错
亮了(2)
RainieLove (1级) 2017-05-09回复 3楼
赞 正在做相关研究
亮了(1)
Robbbbbbbbbbin 2017-05-09回复 4楼
必须点赞,32个,满满的干货
亮了(1)
Stardustsky (2级) 2017-05-10回复 5楼
讲真HMM对异常请求的识别效果不如SVM
亮了(1)
花莲罗志祥 2017-05-11回复 6楼
HMM ,我看下来是对每个url的参数都进行学习预测概率如果>某个阈值,就判断为攻击。那针对不同的几百万url或post请求岂不是要建立几百万个模型。HMM看起来例如比svm消耗的资源更多啊,而且碰见新的url或post请求要重新收集样本学习,一时半会还检测不出来
亮了(4)
半路的solo (1级) 这家伙太懒了,还未填写个人描述! 2017-05-12回复 7楼
666
亮了(1)
olv (1级) 2017-05-24回复 8楼
隐藏状态S1,S2,S3代表什么了@兜哥
亮了(2)
兜哥 认证作者专栏作者(5级) 公众号:“兜哥带你学安全” 《Web安全之机器学习入门》作者... 2017-05-27回复
内部状态
亮了(1)
suiyixiaozhai (1级) 2017-06-01回复
@ 兜哥 隐藏状态是怎么定的呢?为什么只有 3个隐藏状态呢?
亮了(2)
Johnite (1级) 2017-11-06回复
@ 兜哥 T不是表示的是其他字符吗?为什么在这里算作是阈值?难道泛化之后的这A,N,C,T分别表示的不是’A',’N',’C',’T'吗?
亮了(0)
841960103@qq.com 2018-05-24回复
@ 兜哥 兜哥,三个内部状态是哪三个?我买了你的书,但是还是看不懂,内部状态为什么是三个,不是两个(xss攻击,非xss攻击)
亮了(1)
Enzo 2017-06-08回复 9楼
wjq_2014泛化为AAACNNN才对 兜哥多写了一个A
矩阵图中S3到C之间是不是缺少了一个箭头连线?
亮了(1)
Kami 2017-08-16回复 10楼
if ischeck(v) and len(v) >=N :
请问一下,这句中的ischeck起什么作用,还有他的函数代码是什么??
亮了(0)
ccc 2017-08-18回复 11楼
remodel = hmm.GaussianHMM(n_components=3, covariance_type="full", n_components=100)
remodel.fit(X,X_lens)
想问下这段里面
n_components和n_components代表啥
亮了(0)
CCkicker (1级) 2017-08-31回复 12楼
亮了(0)
bubbler (1级) 2017-09-12回复 13楼
score 不是代表的是 该序列出现概率的对数值么 为什么会出现正数0.0
亮了(0)
ychcqshan (1级) 2017-11-15回复 14楼
认真看了兜哥撰写的学点算法搞安全之HMM(上篇)(下篇),现有以下几点问题(可能太简单):1、关于观测序列、泛化的观测序列(A,N,C,T)、隐藏的状态序列(S1,S2,S3,S4)的表述中,不是很明白,我是这样理解的——S1对应的是A,S2对应的是N,S3对应的是C,S4对应的是T——这样的话,观测状态和隐藏的状态是一 一对应的;2、在文中“隐藏序列就是S1-S4三个状态间循环转化,这个概率称为转移概率矩阵,同时四个状态都以确定的概率,以观察序列中的A、C、N、T四个状态展现,这个转换的概率称为发射概率矩阵”的表述中,隐藏状态为4个,与上面阐述的“整个模型为3阶HMM,隐藏序列的状态只有三个S1、S2、S3”是否存在矛盾;3、在调用hmmlearn时,泛化后的向量长度是不一样的,直接用fit()函数是否存在报错情况(在hmmlearn中fit函数接收的向量列表X,要求向量的长度一致,不一致会报错!)
亮了(20)
haorenx (1级) 2017-12-22回复 15楼
韩梅梅模型能够解决一个问题,就是判断target出现的概率,可以应用到两类场景:正常检测和异常检测。
1、语音解码、词性标注、搜索词补齐,属于正常检测,训练样本使用正常数据,取概率值最大的
2、参数异常检测,属于异常检测,训练样本也使用正常数据,筛选概率值较小的
3、若训练样本使用攻击payload,则检测web攻击就属于“正常检测”,取概率值较大的(如HMM下篇)
HMM应用到web攻击检测,难点在于样本和特征提取
这是一点心得
亮了(1)
miyoChiang (1级) 2018-05-08回复 16楼
代码中最大似然概率阈值T的设置是-200,请问是如何得出的呀
亮了(0)
Olivia' (1级) 2018-05-23回复 17楼
问下你们代码都跑出来了吗?有错误啊,main那里
亮了(0)
841960103@qq.com 2018-05-24回复 18楼
@ ychcqshan 我买了一本书,感觉有错误,发射矩阵明显不对,而且也没说隐藏状态为什么是3个,一头雾水
亮了(1)
昵称
请输入昵称
必须您当前尚未登录。登陆?注册邮箱
请输入邮箱地址
必须(保密)表情插图
有人回复时邮件通知我
相关推荐
关于云租户安全建设的思路分享
关于云租户安全建设的思路分享
随着企业云化的深入,安全策略成为企业云上建设需要着重考虑的问题,如何安全有效的使用云计算开展自己的业务?本篇文章将简单分享云租户的安全建设思路:知己知彼,将安全风险控制在可接受范围之内。
UCloud云计算2018-11-0898191
AdvBox 0.3发布 | 支持深度学习黑盒攻击算法及防御算法、支持Keras
AdvBox 0.3发布 | 支持深度学习黑盒攻击算法及防御算法、支持Keras
AdvBox可以高效地使用最新的生成方法构造对抗样本数据集用于对抗样本的特征统计、攻击全新的AI应用,加固业务AI模型,为模型安全性研究和AI应用提供重要的支持。AdvBox今天发布0.3版本,支持常见的黑盒攻击算法以及…
兜哥2018-09-29909021
AI模型安全经典论文下载
AI模型安全经典论文下载
AI模型安全经典论文下载
兜哥2018-08-2192338
开源AI安全工具箱AdvBox
开源AI安全工具箱AdvBox
AdvBox是一款支持PaddlePaddle的针对深度学习模型生成对抗样本的工具包。
兜哥2018-08-09881261
FREEBUF免责声明协议条款关于我们加入我们广告及服务寻求报道广告合作联系我们友情链接关注我们
官方微信
新浪微博腾讯微博Twitter赞助商
Copyright © 2018 WWW.FREEBUF.COM All Rights Reserved 沪ICP备13033796号
css.php 正在加载中...0daybank
文章评论