业界新突破 | 揭示自动化筛选关键告警实现路径之一

发布者:绿盟科技
发布于:2021-02-23 18:44

一、 背景概述

目前安全运维中告警过多,告警原始指标难以直接区分实际重要性。结合安全运维值守工作的现场调查情况,我们曾提出两个猜想:

1、人类专家在分析防护告警时,是在关注某种与攻击相关的、抽象层次很高的概念;

2、最能够反映这个抽象概念的信息,位于告警载荷或原始网络流量中。


如果猜想属实,我们只要做出一个能够从告警载荷中提取出这种抽象概念的自动系统,即可实现自动化的高价值告警筛选。本文将以此为目标,对以上两个猜想进行验证。

二、 关键在于攻击意图

在第一个猜想中,我们需要先弄清楚最核心的问题:这种“与攻击相关的、抽象层次很高的概念”到底是什么?

笔者整理了一些以往的告警和人工研判记录。受限于篇幅,这里只给出两个比较典型的案例供读者参考:


上面属于被判定为误报的告警。下面则是一个真实入侵事件中的告警记录:


稍加品味,细心的读者可能会注意到,人工分析告警的过程,其实是在试图解释“为什么会出现告警所描述的网络活动?”

即,首先假定所有网络活动都存在某种内在意图,包括业务意图和攻击意图。如果告警所指示的网络活动能够基于某种攻击意图做出合理解释,即可据此判定告警危害程度。反之,如果找不到合理的攻击意图来解释网络活动,或者基于某种业务意图解释起来更加合理,就可以将告警认定为误报。

网络活动并非自然发生的,而是人为设计才会产生的。实战中,决心坚定的攻击者即使遭遇挫折也不会轻易停手,此时具体攻击行为是否成功已不那么重要。关注网络活动背后的内在意图,其实是一个非常高效的思路。

因此,自动化告警筛选应当对告警所指示的网络行为的内在意图进行评估。相比于业务意图,我们暂时先着重于攻击意图评估的实现。

三、 攻击意图的表示

想要实现告警筛选过程的自动化,仅仅知道攻击意图能够反映告警危害程度是不够的。我们必须用一种具体的、整齐的结构去表示攻击意图。

但这确实是一个难题。攻击意图这个概念太抽象了,其种类数量相当于所有网络攻击可能达到的结果的数量总和。复杂的信息系统中自然会有同样复杂的网络攻击,因此,攻击意图的可能性空间很大,以有限集合对攻击意图进行枚举并非易事。

此外,攻击意图的评价维度也并不单一。假设一个场景,攻击者在已经确定网站存在RCE漏洞的情况下,利用该漏洞向网站上传了一个WebShell:

  • 从攻击对象的角度看,其攻击意图应为“控制WEB应用服务器”

  • 从CIA三要素的角度看,其攻击意图应为“破坏系统完整性”

  • 从攻击收益的角度看,其攻击意图尚无法定论,攻击者可能只是一个愉快犯,也可能是窃取敏感数据的黑产分子

幸运的是,经过长期摸索和实践,我们最终找到了一种通过二维向量表示攻击意图的方法。

具体而言,我们通过“试探性程度”和“利用性程度”两个量化的连续值来表示一个攻击意图。其中,试探性程度表示攻击行为有多么想要确定漏洞是否存在,利用性程度表示攻击行为有多么想要构成实际危害:


不难发现,这种表示方法几乎完全限定在漏洞利用的场景中,连C&C后门、用户对钓鱼邮件的点击等,都被视为特殊的代码执行漏洞。由于只关注攻击链中的单一阶段,攻击意图的可能性空间显著缩小,最终找到了两个普遍可以被衡量的维度。

实验表明,限定在告警筛选问题中,这种表示方法确实能够发挥一定作用。将攻击意图划分为四个象限,其中第二象限(低试探性&高利用性)的告警往往实际危害最大,其次是第一象限(高试探性&高利用性)的告警。

四、 告警载荷的特征提取

接下来,我们需要验证前述的第二个猜想,试试看能否根据告警载荷来确定攻击意图。专家似乎很容易就能做到这一点,所以原理上多半是可行的。

但自动化实现只能接受统一格式的输入数据,而对告警载荷的结构化表示也是一个难题。告警载荷通常是一组二进制流数据,各种网络协议混杂其间,内容结构千奇百怪,根本找不到统一规律。

这导致现有的数据分析方法用于告警筛选时,普遍只关注告警的规则类型、源、目的、时间等结构化属性,最多只是将告警载荷的一些统计特征(长度、熵值等)纳入特征提取,而对告警载荷的原始数据内容避之唯恐不及。

针对这一点,我们进行了大量尝试,但至今也未能找到非常好的特征提取方法。目前实验中效果“还算凑合”的告警载荷特征,是一种针对已知模式的词频向量。

具体来说,就是对告警载荷内容中的各种常见模式进行计数统计,将每种模式在告警载荷中出现的次数作为特征向量。这些常见模式包括但不限于:文件路径、IP地址、域名、URL、操作系统命令、脚本函数名、SQL系统表名、以及一些常见的混淆方法等。

在大多数情况下,一个告警载荷只会出现少数几种模式,因此特征向量普遍比较稀疏:


对于没有加密或压缩的网络协议,这种统计方法效果尚可,尤其是对文本字段较多的协议(如HTTP)效果基本达标。此外,这些常见模式都不针对特定的漏洞利用方法,理论上是不需要经常更新的。实验表明,这种词频向量确实与攻击意图存在强关联。

不过这种方法的弊端也很明显,即需要大量人力投入去反复优化正则表达式。由于告警载荷中内容混杂,表达式既不能过于严格,也不能过于松散,编写起来颇有难度。

举例来说,现有模型中仅“文件路径”一项就包含4个特征维度,用到13个正则表达式,其中最长的一个如下:


即使是如此复杂的表达式组合,仍然时常会出现误识别和漏识别,想要用数据分析方法自动形成特征提取就更加困难了。我们也尝试过在告警载荷二进制序列上运行一些NLP中的新词发现方法,但效果普遍较差。

五、 特征提取中的注意事项

  • 自动解码实现

直接对原始告警载荷进行模式匹配的话,很容易漏掉关键信息。在统计过程中,需要识别并递归解析告警载荷中的特殊编码。常见的编码包括多重URL编码、XML编码、十六进制编码、Base64编码、“\”字符串转义编码、CHR/CHAR编码等。

万幸的是,大部分编码数据块都有明显的特殊结构,进行匹配之后有针对性地递归解析即可。原始告警载荷和所有解码结果都需要进行模式匹配,为防止同一内容被重复计数,模型内需要实现一个去重机制,确保模式匹配到多个相同值时只计一次词频。

  • 特征删减

实验表明,特征选取并非越多越好,多余特征的加入反而会导致模型效果下降。虽然不能排除这个情况也与具体模型选取有关,但在多次实验中,删除多余特征维度都能提高模型表现。

目前大致可以确定的“多余特征”主要包括:HTTP请求方法、HTTP响应码、Content-Type、SQL关键字。与之相对,也有一些特征维度似乎起到了较大的作用,它们主要包括:文件路径、操作系统执行类命令、非源非目的外网IP。然而,其中的具体关联关系目前尚不明确。

  • 特征组合

进一步实验表明,一些已知存在关联的特征维度,可以组合之后添加新维度,能够在一定程度上提高模型表现。例如,文件路径和文件操作类命令应当是存在内在联系的,IP地址/域名和网络操作类的脚本函数也应当是存在内在联系的。

组合的新维度并不需要非常复杂,通常只要对相关原始特征维度求取一个最小值即可。虽然从实际观察来看,组合特征的误识别很多(告警载荷中同时出现文件操作命令和文件路径,并不代表命令的操作对象就一定是这个路径),但模型效果确实有所提高,而其中原理目前尚不明确。

六、 结语

至此,我们已经确定了输入数据(告警载荷)和输出数据(攻击意图)的结构化表示法,已经具备了应用数据分析方法的基础,可以认为告警筛选的自动化实现确实是可行的。

目前在暂不考虑模型迁移的情况下,在特定生产网络环境中采集一周约2300万条告警,执行采样并人工标注约500条后,Top10高评分告警中涉及真实关键攻击的比例能够达到80%以上。

虽然仍然无法完全消除低价值告警,但相比于目前的大多数告警筛选方法已有很大提高。



声明:该文观点仅代表作者本人,转载请注明来自看雪