本文主要是介绍机器学习在信息安全领域的应用现状和畅想,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
机器学习在信息安全领域的应用现状和畅想
写在前面
从2013年开始工作到现在,混迹信息安全领域已经五年多了。这么长时间,我学习技术只有输入,近于零输出。比如学Web渗透,都是在乌云、Freebuf、安全客之类的网站还有各路大佬的博客上潜水,但除了在漏洞平台上报过几个漏洞之外,基本没留下成文的知识总结。这是我个人的学习坏习惯,不爱记笔记,更不喜欢总结什么,究其原因,无非是懒癌和完美主义作祟。现在终于有动力开始做一些技术学习笔记了,想用文字记录一些学习过程、对技术的个人理解、对算法的认识和应用。希望自己以后能养成写作习惯吧。
从17年年中开始,在独立开发公司反爬虫系统过程中,我开始接触机器学习,训练模型用于爬虫识别。尝到甜头后,发现自己的机器学习相关基础知识非常贫瘠,才开始从线性代数、概率论等基础开始,到西瓜书、斯坦福CS229、deeplearning.ai等系统地学习机器学习,现在也就是刚刚入门(也许在大佬眼里还不算入门)。学无止境嘛,希望在今后的学习过程中,能和业界各位同学一起探讨,共同提高。
本文旨在记录一些机器学习已经在信息安全领域应用的场景,同时展望一下在深度学习日新月异的如今,还会有哪些应用的场景和思路。后面打算从这些思路中比较感兴趣的领域出发,具体写一些自己的实现方式和新技术、算法的应用尝试。
机器学习应用的特点
首先,我想撇开算法,通过和机器学习短短一年左右的接触和实践,谈谈个人理解的机器学习(深度学习)实际应用的特点。
依赖于可用于训练的数据量的规模
模型训练时如果样本量不够,就没法完整反映现实的分布情况,这时经常会遭遇过拟合,也就是训练出来的模型可以很好地反映训练集的分布,可实际在测试集上的表现很差;而当应用正则化、降维、特征筛选等手段解决过拟合时,又很容易丢弃掉了很重要的特征隐藏的信息。说白了,样本提供的信息量太小,不足以训练出可以描述现实情况的模型,泛化能力不够。而深度学习更加依赖于数据量,不用足够的数据“喂饱”深度网络那比其他模型多几十倍甚至几百倍的参数的话,可能模型的效果还不如K近邻、随机森林、朴素贝叶斯这些传统机器学习算法效果好。
对于有监督学习场景,标记样本量还不能少,不然就算祭出各路半监督学习算法或者自学习(self-taught learning)这种大招,也很难保证训练效果(需要保证采样的均衡,如果样本集在整个样本空间中覆盖不到所有的情况,标签传播就会出现大量错误或隐藏特征向量提取不准确)。
因此,比较成功的机器学习应用通常是建立在足够大量的样本之上的(包括人工生成的样本)。
落地应用需要一定的领域知识
机器学习项目前期需要大量的准备工作,包括数据集的收集和预处理、特征提取/生成/选择、人工标记(如果要做有监督学习的话)等等,这其中有很多工作是需要由有领域知识的人来做的。拿特征选择来说吧,为了区分样本是不是Web扫描器发出的,可能需要重点提取GET/POST参数、User-Agent之类的字段作为特征来源,一个不懂Web安全的人就很难直接筛选出来,不同的特征选择最后训练出来的模型效果就会有很大差距。有人会说,现在有降维的方法如PCA、LDA、t-SNE、自编码器,或者L1正则化的方法可以自动选择特征嘛,但那是在输入算法的特征为前提下选择的,如果你一开始就没提取出有用的特征,那么那些方法也只是在一堆不是很有区分能力的特征中勉强总结出比较能用的特征而已。
再说人工标记这个事儿,压根就只有懂行的人才能做。一群外星人,来到地球某郊区的西瓜地里,怎么能看出来哪些瓜是好瓜,哪些瓜不好(原谅我看西瓜书看得多,就爱拿西瓜举例子)?
机器学习应用不光是搞算法这点事
任何商业应用的技术,一定要有给力的基础设施的支持才能发挥作用。假设你历经千辛万苦训练出来了一个测试集上准确率99.9999%的牛X烘烘的模型,这时你可能觉得大功告成了。事实呢?线上流量巨大,而你的模型又需要在线实时执行决策。数据源怎么接入?这么大的流量数据怎么缓存起来?怎么部署你的数据预处理逻辑才能保证从样本提取到进入模型进行预测的过程时延在可控范围内?模型的决策结果怎么反映到线上逻辑中?还有你怎么可视化你的模型决策结果,方便监控和调试?这些都是必不可少的落地应用AI所需要的基础设施。
这些道理我本来也都明白,但我在反爬系统项目里还是低估了这部分工作的占比。事实上,我在基础架构选型、数据采集、数据规范化、数据预处理、特征提取和计算、标记样本、爬虫处理逻辑、可视化这些方面花费了近95%的时间,也就用了不到半个月时间就根据测试结果完成了模型的选择、训练和参数调优。
成功的安全AI实践
机器学习在安全领域应用有什么天生的优势呢?个人认为有三点。
一是在互联网普及如斯的今天,流量数据的收集成本是越来越低的,可以用于分析和建模的场景越来越多,这是大背景。
二是实现自动化,降低在重复、简单的决策工作中浪费宝贵的人力成本。海量数据的安全分析是需要自动化的,不然靠安全专家人工去分析,只会浪费掉绝大多数的数据和特征维度。
三是安全攻防是一个长期动态的过程,传统基于规则和黑名单的安全防御机制难免出现滞后的情况,所以0Day才会这么让圈内人闻风丧胆。通过人工智能的应用,在某些场景反而很容易发现和阻断从未遇到的攻击行为,毕竟机器学习的本质目的,就是对未知样本进行决策和判断。
个人见识有限,只说一些我接触过或者有耳闻的机器学习在安全领域的实践案例。当然实际上安全业界会有很多其他成功的实践,但我不想妄议自己不熟悉的方面。CB Insights对利用AI技术进行信息安全创新的公司进行的盘点,发布了行研报告。
行为验证码:极验是我接触过的第一个行为验证码产品,之前还请他们的技术人员来公司做过交流。极验验证码产品据说是基于深度学习对人类的验证码行为和机器的行为进行建模,此外还用了聚类等无监督算法对样本进行分析。之前网传的破解极验教程,据极验技术同学说其实就是利用了模型还没有对这一小撮行为进行标记确定的时间窗口,极验数据分析人员进行标记之后,自然这类绕过行为就被限制住了。网易也做了类似的验证码产品,原理应该也类似。
恶意代码检测:传统的杀软是基于文件签名和特征码来确定恶意文件的,这会导致大量漏报,因为恶意代码稍变形就可以绕过。后来出现了沙盒和虚拟机技术,可以对病毒的动态行为进行检测。这是从静态检测到动态分析的进步,对未知的恶意代码检测能力有了很大提升。但从本质上还是基于规则的检测。机器学习应用于恶意代码检测是大势所趋,大量论文如[1][2]都提出了自己的机器学习应用于恶意代码行为分析检测上的思路。ESET、Cylance、CrowdStrike等厂商也推出了基于机器学习的恶意代码检测产品。
入侵检测:传统的入侵检测系统多是基于误用入侵检测技术,也就是说提取入侵行为的特征/规则,也就是黑名单方式。前几年我在项目上做IDS选型时,大多数国内厂商的竞争点还是入侵行为库的多寡。这跟恶意代码检测一开始的思路都是一样的。后来出现了异常行为检测技术,也就是基于统计的方法对正常行为进行概率统计建模,再对与正常模型偏差较大的异常行为进行分析和报警。深度学习也应用到了入侵检测,对网络包进行统计、分布、序列维度上的特征提取和模型训练。现在入侵检测的主流思路已经从黑名单转为白模型方式。正如安全圈盛行的那句话:“正常的总是相似的,异常各有各的异常”。
WebShell检测:利用机器学习进行WebShell检测,主要思路分为静态检测、动态检测和流量检测。静态检测是把WebShell文件当作普通文本序列,使用词袋模型(BOW)、TD-IDF进行特征提取;动态检测是对opcode或系统调用序列进行建模;流量检测的思路是基于Web流量,根据一系列参数特征、信息熵、时间分布特征等对正常流量和WebShell访问流量样本训练分类模型,从而发现WebShell的访问行为。
类似的应用还有很多,如基于机器学习的WAF、僵尸网络流量发现等等,包罗万象,不一一描述了。
AI在信息安全领域应用的思路和展望
写这个内容其实我心里是没底的,为啥?极有可能我的这些思路早有大神已经实现过了;而且很多思路都是纯属YY,怎么实现我也没有实际尝试过。但方向应该是差不多的。
异常检测方向
异常检测一般应用于白样本黑样本数量极不均衡(有监督的异常检测),或者没有标记信息(无监督的异常检测)的情况。常用的算法包括单分类SVM、周志华教授提出的孤立森林(Isolation Forest)、局部异常因子算法(Local Outlier Factor、LOF),对于序列样本有隐马尔可夫模型(HMM)、循环神经网络(RNN)、LSTM、Encoder-Decoder等算法可以用于异常检测。
异常检测算法的结果可靠性有待验证,个人觉得不应该直接根据异常检测结果直接做出处理动作。不过异常检测决策结果有助于标记工作,积攒到一定标记样本量之后可以尝试转用其它的分类算法。
(1) 主动外联检测
现在的病毒大多采用分体形式进行感染,为了逃避安全域边界上的恶意代码检测机制,常先感染病毒母体,再释放自身在互联网上下载子体。还有基于隐蔽通道的SQL注入攻击、SSRF攻击、RFI攻击、反弹Shell等,也会出现由内网服务器主动对外发出请求的情况。针对此类攻击,可以在网络边界处进行流量收集,提取包括对端地址、域名、协议、端口等维度的频次、时间段、数据包特征,对每个内网服务器的外联情况进行建模。
(2) 内网流量异常检测
在APT或渗透攻击过程中,当黑客通过一定手段获取了某一台服务器权限,会利用这台服务器进行一定内网嗅探和漏洞利用尝试,因此安全防御机制需要考虑到来自内网服务器的攻击识别。当然可以用WAF或IDS之类的传统安全设备来做,但可能会丢弃掉很多有用的信息。比如在内网正常时的网络流量信息和Socket建立情况,其实可以利用这部分数据进行建模,当某个服务器突然出现了大量的对内网其它服务器的请求,这时就可以用模型来进行异常检测,从而进行报警。
(3) Web异常访问检测
一个特定的线上网站,对于每个访问主体,访问序列和访问参数应该是有一定规律的。通常一个特定的访问序列对应着访问主体的某一个特定的访问目的,就拿修改网站个人信息这个操作举例吧。一般的访问页面序列应该是登录-首页-个人信息页-修改个人信息,而如果出现了登录-个人信息页*500,这样的访问序列自然是不正常的,很有可能出现了水平越权查看其他用户信息的攻击。再拿搜索接口举例,正常的搜索参数可能有3个,A是int,B和C是str,如果某个请求中A、B、C顺序不对、全都是str而且长度比同接口其它请求大很多,一定也是有问题的。
可以提取大量正常样本作为训练集,对参数key、value(包括请求参数和请求头等)进行分别建模,还可以提取其它必要的统计、分布特征,作为每个请求的特征向量。再对请求序列的URL路径进行词向量训练,这样就获得了访问序列的二维特征矩阵,和每个请求的特征向量合并在一起,作为模型训练集,得到异常检测模型。个人对这个方向比较感兴趣,而且感觉比较有戏,这种方式理论上是可以识别出任何与正常请求不同的攻击行为的,包括各种业务逻辑攻击和0Day攻击。个人已经在HTTP CSIC 2010数据集上有过一些尝试,后续会尝试深入和实现,把研究过程记录在这里。
强化学习应用方向
强化学习(Reinforcement Learning,RL)也是我个人认为可以应用在信息安全领域的。强化学习有其天生的优势,可以解决传统机器学习和深度学习难以解决的序贯决策问题,在与环境进行交互的过程中训练模型。这与安全攻防的场景很相似,也是有来有回的。
(1) 代码动态审计
目前常见的代码审计工具还都是基于规则的,把一些危险函数、SQL拼接语句等作为目标进行正则匹配,如果匹配到就报漏洞。而且基本上都是静态审计,也即没有运行代码,只是通过解析代码查找漏洞。
也许强化学习和深度学习可以结合起来,应用在代码审计工作中。首先将正常调用代码和漏洞利用时的系统调用序列作为训练集进行深度学习。再将特定的代码静态解析结果作为状态(state)向量,根据某种搜索策略选择期望回报最大的Payload,也即强化学习的动作(action),运行代码,监控运行过程中的系统调用序列,如果出现与漏洞利用时相似的系统调用序列则返回较高的回报(reward)。这样不断地训练后,再遇到新的代码,就可以更快速高效地进行代码动态审计了。
(2) 自动化渗透测试
目前的渗透测试基本上是手动的,当然有一些扫描工具,如AVWS、Nessus、APPScan等,虽然很省力,但测试覆盖面和深度上肯定是不如手动测试的。我自己也做了几年渗透测试,之前一直以为只能手动测试的,直到接触了强化学习。其实渗透测试也是有一套成熟框架的,信息收集、网络嗅探、攻击面分析这些按住不表,单说漏洞挖掘和利用这个环节。一般都是渗透测试人员1)看到一个页面(或截包看到接口返回结果) 2)分析页面内容 3)找到可尝试的参数 4)设计Payload 5)发送攻击请求 1)查看返回结果,这样一个循环。
这个循环流程个人感觉是可以利用强化学习模型来模拟的。首先使用深度学习算法对正常页面进行建模。实际进行渗透测试时,将当前页面抽象为状态(state)特征向量,按某种搜索策略选择Payload或者生成新的Payload,作为动作(action)向Web系统发送请求,根据已经训练好的深度网络模型判断返回页面的正常程度,返回Agent与正常程度成反比的回报(reward)。训练后,可以得到一个高效率的使页面返回不正常的渗透测试智能体。
这里我忽略了一个问题,就是Payload从何得来?后面生成式对抗网络里我会提出一些自动生成有效Payload的思路。
已出现了号称基于机器学习的渗透测试工具GyoiThon,但仔细看了其源码和原理说明,发现其应用机器学习只是做了系统识别这一方面的工作,比如根据一些字段和页面内容的特征确定是哪个Web容器、CMS系统等,而实际的渗透测试还是调用了Metasploit框架进行的。这个跟我的想法还是有很大区别的。
生成式对抗网络的应用
生成式对抗网络(Generative Advertorial Networks,GAN)是一项无监督学习技术,可以通过训练两个模型:生成模型(Generative Model)和判别模型(Discriminative Model)来用于无中生有。生成模型随机生成样本,判别模型对生成的样本进行判断真伪,如果与真实样本很像则返回接近1,一点都不像则返回接近0。当生成模型生成的样本判别模型看不出真假来了(返回接近0.5),则我们的生成模型就可以拿来用于生成以假乱真的新样本了。GAN能用在信息安全哪些方面呢?
(1) 生成蜜罐响应内容
蜜罐用来迷惑入侵攻击者,给安全管理人员宝贵的应急响应时间窗口和取证机会。如果蜜罐的返回结果不够真实(不像是正常系统被入侵后返回的结果),入侵者就会反应过来,不会再访问蜜罐,这个蜜罐的效果就不够好。GAN可以用来训练模型生成与正常系统很相似的响应内容,使蜜罐更具有迷惑性。
(2) 生成训练集
信息安全机器学习应用时常常遇到的最大困难就是黑白样本不均衡问题,黑样本获取难度大,导致绝大多数的训练样本都是白样本。此时可以在原黑样本集上增加一些随机少量扰动的方式生成黑样本,也可以尝试使用GAN自动生成一些黑样本。 例如在已经收集的攻击Payload基础上,自动生成一些其他的Payload,其相似度很高,可以起到类似Fuzzing的效果。
——————
参考资料:
[1] Firdausi I, Lim C, Erwin A, et al. Analysis of Machine learning Techniques Used in Behavior-Based Malware Detection[C] Second International Conference on Advances in Computing, Control and Telecommunication Technologies. 2010:201-203.
[2] Saxe J, Berlin K. Deep neural network based malware detection using two dimensional binary program features[J]. 2015:11-20.
[3] http://www.freebuf.com/articles/network/139532.html
[4] http://www.freebuf.com/articles/web/181169.html
这篇关于机器学习在信息安全领域的应用现状和畅想的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!