安全领域中如何有效的使用机器学习

今天看到Gartner分析师Augusoto Barros的一个博文,感觉深有同感,借着讨论下我对于机器学习与安全结合的一些想法。

More on “AI for cybersecurity”

下面是翻译的原文:

想要了解乙方安全厂商是如何利用机器学习来进行威胁检测,有一个非常重要的观点必须了解。

一般来说,机器学习是用来区分已知的行为,但是会存在可变的参数。什么意思呢?也就是说,大多数情况下,我们知道恶意行为是什么,但不知道它具体是一个什么样的形式。

举个例子来说,我们知道数据泄漏通常是利用特定协议来产生的,比如DNS。但是利用DNS来窃取数据可以通过很多种形式。在这种情况下,我们可以让机器学习基于某些特征去拟合正常的行为,从而检测恶意行为。这些特征可能包括:每次请求的数据量、请求的频率等等。这些参数的异常值可能表示在尝试窃取数据。

在这种情况下,机器学习帮助我们来发掘我们已知的恶意行为,但是对于恶意行为的具体定义太模糊太复杂了,以致于我们无法通过制定简单的规则来进行区分。这是一个无监督学习的例子,它用来识别相对异常的行为来进行威胁检测。也有很多场景可以使用有监督学习来学习恶意行为的模糊特征。但是,如你所见,我们必须首先知道什么是恶意行为,它是怎么产生的,然后才能利用机器学习模型取检测这些行为。

如果你想要高举“深度学习”的大旗来反驳,那么请放下吧。就算是使用深度学习,你仍然需要通过特征工程来告诉哪些数据维度是需要关注的。如果你想使用深度学习来识别恶意行为的特征,你仍然需要告诉他什么是恶意的。所以和传统机器学习没太多区别。

虽然基于机器学习的恶意检测是一个相对独特的方法,整个过程和传统建立规则特征库的方法仍然十分相似。

目前为止,人工智能仍然无法发现人类未知的威胁。大多数的乙方安全厂商会使用诱导性语言来让人们认为他们能够做到这一点,但是事实上是不存在的。考虑现实水平的话,我最喜欢对这些安全厂商提的问题通常是“你是怎么来保证新的威胁能够被及时发现,并且迅速建立新的模型来识别这些新威胁?”人们买了一个所谓的“人工智能”产品,但是仍然需要安全厂商的人力支持才能使其保持有效,这不是一个很讽刺的事情嘛?

如果你正在使用这些产品,你最好了解安全厂商们做了哪些工作,来让这些工具能够识别出新的威胁。更进一步来说,面对一个成熟的产品,你也需要知道,如果你需要的话,这些工具能否让你自己来更新模型。

这些是和“人工智能”安全厂商沟通时,一个好的出发点。然后看看他们是如何快速掉入这样一个陷阱:“我们能够发现未知的新威胁”(we can find unknown unknowns)。

机器学习和安全

从我所了解的国内各家安全厂商的情况来看,不打出机器学习和人工智能的口号,都不好意思出来卖产品。然而现实情况就如上文所说,机器学习真的无所不能嘛?人工智能到底对人工依赖到什么样一个程度?下面就写一写我对机器学习和安全的一些理解。

以下观点全部基于个人理解,有错误之处,欢迎指出。

基于目前对机器学习的理解,其实根本上来说只存在两种不同的模式:无监督学习 和 有监督学习。近年来发展出来的 深度学习、半监督学习、弱监督学习等,其实都是有监督学习下的进一步研究。两者区别也很简单:无监督学习不需要标签,但是要求数据分布具有一定的特征和边界;有监督学习需要标签,而且训练出来的模型和标签本身的分布强相关。而现在流行的知识图谱、关系网络等概念,在我看来是属于特征工程的部分,用来从有限的数据中挖掘更多的隐藏信息。

如上所说,机器学习无法发现unknow unknows,但是,我们可以利用机器学习去发现unknown knows。在安全领域中,如何去定义和挖掘knows,我认为是安全人员需要思考的关键。

数据集

数据是机器学习的基础,想在零数据的基础下去做机器学习,个人认为是不可行的。也许有人会想到利用其他的公开数据去弥补数据的缺失。但我曾经做过一个统计,安全领域中,各知名的公开数据集情况如下:

数据集 引用次数 首次公布 最后更新
DARPA Intrusion Detection 2000+ 1998 2000
KDD 1999 1000+ 1999 1999
Enron email dataset 200+ 2004 2015

这些数据集,大都缺乏有效的更新。而这些数据,至今仍然在被各种论文引用,作为结果对比的参照。当下安全迅速发展,攻防手段日新月异,10年前的攻击数据和标准,在今天又能产生多大的意义呢?

也有很多厂商在鼓吹“迁移学习”的概念,即采用公开或者通用的数据,来训练好一个成熟模型。然后再引入少量的公司个性化数据,即可快速获得一个个性化的模型。这方面倒是没做过深入研究,不过从表层来看,各个公司各个业务的行为模式和数据都不尽相同,能够真正达到通用的数据字段不到一小半。那么迁移学习是只采用通用字段,还是用个性化字段迁移呢?如果是通用字段的话,在损失一大半信息的情况下,真的能达到理想的效果吗?如果是个性化字段的话,没有相关的基础模型,又何来迁移之说?

所以说,数据集只能靠时间来进行积累,没有太多捷径可走。而面对不断发展的攻防手段,数据也需要不断的更新。而在积累数据的过程中,应该花更多的精力去提高数据的质量。

无监督学习

之前已经说了,机器学习不可能发现unknow unknows。有的人可能会认为,无监督学习不就是在没有标签的情况下去找寻分类嘛,那么这是不是代表无监督学习可以发现所谓的unknown unknowns呢?其实不然。无监督学习只是不需要对个体进行打标,但是仍然需要对整体分布有一个先验假设:正常行为由正常用户产生,因此各有各的不同,恶意行为则是少数人批量产生,行为会比较相似;或者反过来说,正常行为因为业务引导,都比较相似,恶意行为则因为不遵守规则,有一定的不同

曾经和几家做业务风控的乙方厂商聊过,其中DataVisor的售前明确表示过他们主要采用无监督学习来进行业务风控的识别,他们的假设是:“正常用户比较分散,聚集的都是坏人”。很大程度上来说,这样的思路是没问题的,黑灰产们大都是通过批量的行为来获取非法利益的。那么必然会从IP、设备、行为、关联关系等各个方面露出一些马脚,从而被识别出来。

但是如果完全依赖无监督去做的话,很快就会陷入一个瓶颈中:要么抓大不抓小,要么大规模的误伤。在真实的业务场景中,黑灰产会利用代理IP、手机墙、云控设备等各种手段去减少批量的特征,来加大被识别的难度;而正常用户有时也会表现出一定的批量特征来:爱豆们批量注册小号给明星刷量、同学们通过亲友的手机号刷邀请奖金、地推人员大量推广安装注册等。这些情况的存在,导致恶意行为并不完全一致,正常行为也不完全不同,正常和恶意之间的界线变得模糊而且复杂。在这种情况下,无监督学习只能抓到一些典型的特征分布,而异常和正常的临界点就很难进行判定,所以要么就只抓典型,漏过更高级的黑产,要么一锅端,但是带来较大的误伤。为了使得无监督学习的结果更加精准,并且应对黑产的不断升级,就需要不断的挑选特征,调优权重和阈值,依靠人力来进行持续的对抗。

就目前的理解,我更倾向于将无监督学习当成对整体数据的一个评价方法。更简单来说,我无法通过无监督学习去准确的给每一个数据进行分类,但是我能够给出正常和异常的大致占比,甚至能更细分一些,给出整体数据中包含了多少种不同的异常。这样一些整体的评价指标,对准确率和召回率都没有特别严格的要求,只要合理即可。而获取到这些指标后:一方面,有利于安全人员正确的评估自己公司的安全现状,不至于陷入“能发现的异常数据都处理了,不知道不能发现的异常行为有多少”这样一种尴尬的境地;另一方面,这些指标也能够反应出当前安全机制的优劣,从而有方向的去进行改善。

有监督学习

正如之前所说的,有监督学习的基础是标签数据。而想要保持和黑灰产进行持续的对抗,就必须不断的生产标签数据。而依靠人工去生产标签数据是不可行的:

  • 时间成本较高:在图片识别等领域,打标只需要普通人花几秒钟的时间。而对于一个安全类的数据,一个安全人员可能需要花费几十分钟甚至几个小时,才能够确定这次行为到底干了什么,到底是不是恶意行为。
  • 覆盖面不全:其实也是由于时间成本导致的,无法进行大规模的打标。因此覆盖的恶意行为会相对片面,最终的结果通常是大部分的标签数据都是明显的恶意行为,而相对隐秘的行为,则无法覆盖到。
  • 标准偏差:恶意与正常往往没有明确的界线,不同的安全人员对于安全的认知和要求也是不同的。比如,一次简单的端口扫描算不算恶意行为呢?一个专刷明星的帐号算不算垃圾呢?这些歧义的存在,导致最终产生的标签数据分布不一致,对机器学习的结果将产生较大的影响。

在网络安全领域,整个攻击链路较长,各个协议层基本都可以进行一定的防护。而黑灰产的最终目的无非就是:获取数据、篡改程序、拒绝响应。所以,在网络安全的领域中,其实可以通过最终结果来进行标记,获得最终的判定标签,然后将标签进行回溯,从而获得表层的标签数据。

举个例子,WAF通常是工作在http(s)协议下的,通过获取http相关的数据(路径、参数、header、ua等),来找出恶意的http请求,从而对WEB攻击进行检测拦截。但是WAF并不知道这个请求具体会干什么,执行了什么样的逻辑,所以它的评判标准只能是“带有XXX特征的请求是恶意请求”。假如想持续不断的为WAF提供标签数据,靠人力肯定不行,那么就应该深入追踪下去,总最终结果来对数据进行自动打标。OpenRASP的检测思路就是如此,直接深入到web程序的逻辑,根据运行情况去评判是否是攻击行为,可以涵盖:数据库 SQL 注入、数据库慢查询、任意文件上传、敏感文件下载。因为是从http请求的最终行为去做的评判,OpenRASP可以实现所谓的“无规则检测”,准确率和召回率都有保证。设想一下,如果利用OpenRASP去对http请求进行打标,然后由WAF去学习这些http请求具有什么样的特征,一个完整的机器学习闭环基本就形成了。

可能也有人会疑惑,既然已经有OpenRASP了,为啥还要费功夫去弄WAF呢?的确,按上述的闭环去操作的话,WAF的覆盖范围不会超出OpenRASP,因此不存在互补的关系。但是从部署成本上来说,越底层的防护改动成本越大。OpenRASP虽然不需要改动业务代码,但是需要在Linux上安装软件,修改一些必要的配置,对于已经成型的公司或者业务,推进起来还是有难度的。那么,是不是可以尝试用几台其他机器,镜像一下web应用和http流量,部署OpenRASP来进行检测。这样一来,这几台额外机器就成了WAF稳定的训练集来源,在较少的人工干预情况下,不断学习最新的攻击行为特征。

业务安全其实也可以尝试这样一个思路来进行。比较直接的,通过对客户端请求签名、异步设备信息采集等方式,对异常的行为进行识别,但不拦截。之所以不建议根据这些信息去拦截,主要是为了避免被黑灰产探测到这些指标的存在。众所周知,安全没有银弹,而这些信息相对比较隐蔽,与其主动暴露,不如去降低黑灰产去研究破解签名算法或者仿造更真实请求信息的欲望,从而一定程度上保证这些标签的准确性。在此基础之上,就可以利用这个机制去稳定的获取标签数据,让业务风控的机器学习算法能够不断的更新迭代。也可以采用一些相对间接的方法,比如:通过用户反馈来获取异常的行为数据;标记一部分已知的恶意用户,但不处理,而是将它们产生的行为都当成恶意行为来标记等。相比于直接的判定方法,这些间接方案的可信度较低,需要对数据集进行一定的加工筛选才能够正常使用。

总而言之,想要成功的运用有监督学习,必须设计出一个合理的标签系统来。这个标签系统和机器学习必须处于不同的维度,观察角度不一样,才有意义。在这个基础之上,我们才能够运用各种高上大的算法,去挖掘安全领域中的unknow knows。

猜你喜欢

转载自blog.csdn.net/hwz2311245/article/details/88021128