深度长文,看完的我敬你是条汉子。
人工智能技术下的分支有很多,有机器学习、深度学习、强化学习、联邦学习等。笔者直观的理解,强化学习较其他人工智能技术而言,擅长决策和多步决策,大名鼎鼎的AlphaGo就是用强化学习做决策的,而“决策”二字才更能体现人的智能,也即强化学习更可能接近人的智能。
纵观强化学习发展史和应用史,在应用于网络空间安全领域方面,笔者找到为数不多的一些资料。这里挑选出三个有代表性的例子来实践,分别是强化渗透测试、强化入侵检测、强化攻击绕过和反绕过策略,其中有强用强化学习疑似灌水的例子,也有有实际意义的强化学习的安全应用。
先来看看第一例,记得今年三月份面试头条的时候,向面试官提到过Black Hat上有一款基于深度强化学习的自动化渗透工具,当时没有仔细研究,只是觉得这种应用属实新颖,如今深入分析后,发现pr的意义大于实践的意义。
关于这款名为DeepExploit的工具,在网上找到几篇分析,但大多是翻译了这款工具的readme.md,又或是没有强化学习领域的背景知识,没有分析到核心算法,即深度强化学习到底怎么被使用来打造自动化渗透工具。
先看看这款工具公开的Presentation:
初次看到这里,笔者的内心是激动的,终于看到强化学习被成功用来强化渗透测试了。但是仔细一看介绍,是要配合metasploit来渗透,可以说是基于深度强化学习的metasploit渗透工具,更具体的说,这款工具只是帮助使用者使用metasploit渗透时,根据目标机器状态快速决策出大概率能执行成功的payload。那么这里就有个比较明显的问题是:这款工具的天花板受限于metasploit本身的能力。
当掌握DeepExploit的基本描述后,接着(不分析源码)来试用一下。先在kali中按readme安装好DeepExploit,再利用metasploitable2安装了一个靶机,接着使用DeepExploit来做攻击训练,观察其工作流程。
先通过Nmap扫描端口和服务信息
再载入metasploit的exploit模块和payloads,并基于这两者构造exploit_tree,exploit_tree可以看成是json格式的metasploit漏洞库
接着对Web端口及服务做精细化分析,通过爬虫和分析HTTP响应包,规则匹配,提取Web服务信息,这其中包括了对CMS进行指纹识别
然后根据端口选择metasploit中可以利用的exploit模块
最后开始训练,找到了靶机的漏洞
到这里为止,训练结束,测试的时候一击即中。看上去可以完美地结束了,然而到这里还是没法回答笔者心中的疑惑:深度强化学习到底是怎么被用来帮助metasploit做决策的。我们的分析才刚开始。
在开始之前,首先得补习一下强化学习的基本知识。强化学习的学习思路和人类似,是在实践中学习,比如学习走路,如果跌倒了,大脑就会给出一个负反馈和负奖励值,说明走路的姿势不对,然后我们从跌倒的状态中爬起来,继续行走,如果正常走了一步没有跌倒,大脑就会给出一个正反馈和正奖励值,我们就会知道这是一个好的走路姿势,不断重复此过程。
强化学习大概有8个基本要素:环境的状态S、个体的动作A、环境的奖励R、个体的策略π、个体在策略π和状态S时,采取行动后的价值V、奖励衰减因子γ、环境的状态转换模型P、探索率ϵ。这其中环境的状态S、个体的动作A和环境的奖励R是比较简单且基本的三要素。总的来说,强化学习就是个体agent和环境的不断交互不断进化的过程。基于环境此时的状态S,个体agent根据策略π和价值V选取一个动作A并执行,得到下一个状态S'和奖励值R,不断循环,直到满足特定条件退出。
强化学习和监督学习最大的区别是它没有监督学习准备好的训练数据和输出值,强化学习只有奖励值。同时强化学习的每一步与时间顺序前后关系紧密,而监督学习的训练数据之间一般是独立的,没有这种前后的依赖关系。
有了强化学习的基本知识后,结合源码继续来分析DeepExploit。笔者分析完自问自答列出了9个问题,搞清楚这些问题,基本上就可以真正掌握这款工具了。
针对一些疑惑,笔者给DeepExploit的作者发了封邮件,希望能得到作者的解惑。
再来看看第二例,国外有研究者使用强化学习来做入侵检测。作者使用NSL-KDD数据集,得到特征数据和标签数据。把特征定义为状态,标签定义为动作,也即把入侵检测问题抽象成强化学习问题:对某一条流量的状态(特征数据)做出是否告警的动作(标签0代表不告警,标签1代表告警),整个算法流程能跑的通,性能也还可以。但是这里笔者觉得可能有两个问题,其一是问题的抽象,直观来说流量应该定义为动作action,机器本身的状态定义为状态,不过作者这种定义一定程度上也能说得通。其二是状态的问题,作者直接选取下一条数据的特征作为下一个状态,也就是说无论对上一条数据做出的动作action是0还是1,都不影响下一个状态,每时每刻的状态不受动作影响,都是固定的。笔者认为这种把入侵检测问题抽象成强化学习的建模方式不太合适,仿佛又回到了有监督学习。如果把是否告警改成是否拦截,选择拦截动作的话,那么下一个状态数据可能就会变化了,这也许更契合强化学习的问题抽象,但是这种建模方式可能会导致业务问题,同样也不是最理想的强化学习建模。
最后看强化学习安全应用比较成功的第三例,国内外有研究者使用强化学习来做攻击绕过和反绕过的策略选择。比如兜哥的书《Web安全之强化学习与GAN》中,有三个相关的例子,分别是智能提升恶意程序检测能力、智能提升WAF的防护能力和智能提升垃圾邮件检测能力。这三个例子核心思想大体相同,定义payload的特征数据为状态,定义常见攻击绕过方式为动作,比如waf中的16进制编码,大小写混淆,插入注释等。原始状态连续经过几个动作,比如原始状态->动作a->状态a(原始状态执行动作a)->动作b->状态b(状态a执行动作b)->动作c->状态c(状态b执行动作c)->每一个状态都会被传统机器学习模型检测,如果检测到的话,继续执行绕过动作得到下一个状态,直到绕过成功。如果绕过成功的话,每一步执行的动作ation组合起来,就是一条可以绕过传统机器学习模型检测的一环扣一环的bypass链路。强化学习在安全方面的这种应用就比较有意义,相较于传统的爆破,这种是“聪明的爆破”。同时可以将最后传统机器学习模型不能成功检测的状态数据(特征数据),作为训练数据,对机器学习模型重新训练,以提升模型防御bypass的能力。
尽管强化学习更可能接近于人的智能,理论上来说强化学习的天花板远高于机器学习、深度学习等技术,但是因为各种各样的原因,导致强化学习在安全领域的应用还很局限,这其中的原因和解决方法需要大家一起来挖掘。
本文分享自 404 Not F0und 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!