UNICORN: Runtime Provenance-Based Detector for Advanced Persistent Threats
NDSS-2020
哈佛大学
Han X, Pasquier T, Bates A, et al. Unicorn: Runtime provenance-based detector for advanced persistent threats[J]. arXiv preprint arXiv:2001.01525, 2020.
源码:UNICORN https://github.com/crimson-unicorn
目录
- 0. 摘要
- 1. 引言
- 2. 背景
- A. 系统调用跟踪的挑战
- B. 全系统来源(Whole-System Provenance)
- C. 总结和问题陈述
- 3. 威胁模型
- 4. 设计
- A. 溯源图(Provenance Graph)
- B. 构建直方图
- C. 生成图摘要(graph sketch)
- D. 学习进化模型
- E. 异常检测
- 5. 实现
- 6. 评估
0. 摘要
高级持续性威胁 (APT) 由于其 “低速” 攻击模式和频繁使用零日漏洞利用而难以检测。介绍了UNICORN,一种基于异常的 APT 检测器,可有效利用数据来源进行分析。
- 通过广泛而高效的图分析,探索提供丰富上下文和历史信息的溯源图(provenance graphs),以识别没有预定义攻击签名的隐秘异常活动。
- 使用图摘要(graph sketch)技术,它总结了长时间运行的系统执行和空间效率,以对抗发生在很长一段时间内的慢动作攻击。
- 使用一种新颖的建模方法来进一步提高其检测能力,以了解系统演进时的长期行为。
评估表明,UNICORN 优于现有的最先进的 APT 检测系统,并且可以高精度检测现实生活中的 APT 场景。
1. 引言
传统的检测系统不太适合 APT。依赖于恶意软件签名的检测器对利用新漏洞的攻击视而不见;基于异常的系统通常分析一系列系统调用和日志相邻的系统事件,但其中大多数难以对长期行为模式进行建模。此外,它们容易受到规避技术的影响,因为它们通常只检查短序列的系统调用和事件。因此,他们在检测 APT 方面收效甚微。试图捕获长期程序行为的系统将其分析限制为事件共现(event co-occurrence ),以避免高计算和内存开销。
这个 “事件共现” 没太理解,应该是指:这些系统将分析行为限制在在事件高发时,以避免高开销。
最近的工作表明数据来源可能是 APT 检测的更好数据源。
数据来源将系统执行表示为有向无环图 (DAG),它描述了系统主体( subjects,例如进程)和对象(objects,例如文件和套接字)之间的信息流。它连接图中因果相关的事件,即使这些事件相隔很长时间。因此,即使受到 APT 攻击的系统通常表现得与未受攻击的系统相似,但溯源图中更丰富的上下文信息可以更好地区分良性和恶意事件。
我们介绍了 UNICORN,一种基于来源的异常检测器。UNICORN 使用图摘要来构建可增量更新、固定大小的纵向图形数据结构,从而实现图形统计数据的高效计算。固定大小和可增量更新的图数据结构消除了溯源图对内存的依赖,它可以简洁地跟踪机器从启动到关机的整个来源历史(provenance history)。 UNICORN 在训练期间直接对系统的演化行为进行建模,但之后不会更新模型,从而防止攻击者毒化模型。
之前的基于溯源图的方案为了支持快速的图匹配,将溯源图放在内存。而溯源图是会随着系统行为而增长的,所以作者说固定的数据结构解决了溯源图对内存的依赖。
主要贡献如下:
- 提出了一个针对 APT 攻击的基于起源的异常检测系统。
- 引入了一种新颖的基于草图的时间加权起源编码,它紧凑并且能够有用地总结长期的起源图。
- 根据模拟和真实的 APT 攻击场景评估 UNICORN。与之前的工作相比,UNICORN 将精确度和准确度分别显着提高了 24% 和 30%。
2. 背景
传统的基于异常的入侵检测系统 (IDS) 分析来自审计系统的系统调用跟踪。然而,对于 APT 检测,全系统 provenance 是一个更好的数据源。
A. 系统调用跟踪的挑战
系统调用抽象提供了一个简单的接口,用户级应用程序通过该接口请求操作系统的服务。作为调用系统服务的机制,系统调用接口通常也是攻击者试图破坏系统的切入点。因此,系统调用痕迹长期以来一直被视为入侵检测的事实上的信息来源。但是,现有系统捕获的系统调用审计日志的非结构化数据,需要进行分析才能理解。鉴于 APT 的低速和慢速特性,分析单个系统调用日志以检测逐点异常值通常是徒劳的,检查短系统调用序列也是如此。这种分析不反映每个系统调用事件的历史背景,导致高误报率和逃避检测的模仿攻击。相比之下, data provenance将历史背景编码为因果关系图。
Data provenance可用于对计算中的各种事件序列建模,包括系统调用审计日志。事实上,存在从审计数据流中重建起源图结构的框架,以便更好地推理系统执行。然而,这种事后方法很难确保图的正确性;很难证明构建图形的系统调用跟踪的完整性、可信度或可靠性,因为许多系统调用插入技术都存在并发问题。此外,基于系统调用的起源框架生成的不是单一的系统执行图,而是许多断开连接的图,因为它们无法追踪不使用系统调用接口的内核线程之间的相互关系。因此,此类框架很少能检测到 APT 中发现的隐蔽恶意事件。
B. 全系统来源(Whole-System Provenance)
全系统来源的收集在操作系统级别运行,捕获所有系统活动以及它们之间的交互。诸如 Hi-Fi、LPM和 CamFlow之类的操作系统级来源系统在信息流捕获方面提供了强大的安全性和完整性保证。这种完整性在 APT 场景中尤为可取,因为它可以捕获远距离因果关系,从而实现情境化分析,即使恶意代理操纵对安全敏感的内核对象以隐藏其存在也是如此。
我们在整篇论文中使用 CamFlow 作为参考实现,并展示了 UNICORN 也可以与其他捕获机制无缝协作。
C. 总结和问题陈述
先前的研究探讨了使用数据来源进行 APT 检测。然而,这些方法都受到以下限制的某些组合的影响:
- 预定义的边缘匹配规则过于敏感,难以检测 APT 中常见的零日攻击
- 溯源图仅提供对检测低调异常至关重要的信息上下文的有限理解
- 系统行为模型无法迎合APT攻击的独特特征。静态模型无法捕获长期运行系统的动态行为,而运行时的动态建模有被攻击者中毒的风险
- 溯源图仅在内存中存储和分析,从而牺牲了长期可扩展性
UNICORN 解决了这些问题。我们将 APT 活动中的全系统入侵检测问题形式化为大型、属性、流式全系统溯源图上基于实时图的异常检测问题。在任何时间点,将从系统启动到当前状态捕获的整个溯源图与由已知良好溯源图组成的行为模型进行比较。如果系统的溯源图明显偏离模型,则系统被认为受到攻击。
3. 威胁模型
我们假设用于主机入侵检测的 APT 场景:攻击者非法获得对系统的访问权限,并计划在不被发现的情况下长时间停留在那里。攻击者可以分几个阶段进行攻击,并在每个阶段使用各种技术。 UNICORN 的目标是通过解释主机生成的来源来检测任何阶段的此类攻击。
我们假设,在攻击之前,UNICORN 在正常操作期间彻底观察了主机系统,并且在此初始建模期间没有攻击发生。
数据收集框架的完整性是 UNICORN 正确性的核心。我们假设 LSM 完整性是通过经过验证的启动序列提供的。我们对其他数据收集框架做出类似的完整性假设。
对于本文的其余部分,我们假设内核、出处数据和分析引擎的正确性。
4. 设计
UNICORN 是一种基于主机的入侵检测系统,能够同时检测对一组联网主机的入侵。图 1 说明了 UNICORN 的通用流程(general pipeline)。
- 获取流式溯源图
- 定期将图形特征汇总成直方图
- 创建固定大小的图摘要(graph sketches)
- 捕获系统执行的动态
部署期间利用1、2、3创建模型,利用4检测
(1)将标记的流式溯源图作为输入
UNICORN 接受由在一个或多个网络主机上运行的起源捕获系统产生的属性边缘流。起源系统构建了一个单一的、完整的系统起源 DAG,具有部分顺序保证,它允许高效的流计算和完全上下文化的分析。
(2)在运行时构建内存直方图(Builds at runtime an in-memory histogram)
UNICORN 有效地构建一个流图的直方图,表示系统执行的整个历史。当新边到达图数据流时更新直方图元素的计数。通过迭代探索更大的图形邻域,以发现提供执行上下文的系统实体之间的因果关系。具体来说,直方图中的每个元素都描述了图的一个独特的子结构,同时包含了附加到子结构内的顶点和边的异构标签,以及这些边的时间顺序等信息。
为了适应正常系统执行过程中预期的行为变化,UNICORN 会定期对与近期事件没有因果关系的直方图元素的影响进行衰减,并使用图中的信息流依赖关系来保持最新的重要相关上下文信息。慢慢地“忘记”不相关的过去事件使我们能够在整个系统正常运行期间(例如,系统启动、初始化、服务请求、故障模式等)有效地建模元状态。
(3)定期计算固定大小的图摘要(graph sketch)
在纯的流式传输环境中,随着 UNICORN 汇总整个溯源图,唯一直方图元素的数量可以任意增长。这种大小的变化使得有效计算两个直方图之间的相似性变得具有挑战性。UNICORN 采用相似性保留散列技术将直方图转换为摘要。图摘要是可增量维护的且大小是恒定的,这意味着 UNICORN 不需要将整个溯源图保存在内存中。此外,图摘要保留了两个直方图之间的归一化 Jaccard 相似性,用于后面的聚类。
(4)将摘要聚类到模型中
UNICORN 构建一个正常的系统执行模型,并在没有攻击知识的情况下识别异常活动 。与传统的聚类方法不同,UNICORN 利用其流式处理能力来生成进化模型。该模型通过在执行的各个阶段对系统活动进行聚类来捕获单次执行中的行为变化,并且不会在运行期间动态修改模型,更适合在APT攻击风险下长期运行的系统。
A. 溯源图(Provenance Graph)
审计日志分析通常依赖于时间关系,而来源分析则利用因果关系。起源图能够捕捉事件之间的因果关系,而因果连接有助于对时间上相距遥远的事件进行推理,因此有助于在 APT 的低速和缓慢攻击模式中导航,生成更有意义的系统行为模型。
UNICORN 始终考虑整个溯源图来检测长期运行的攻击。存在许多图相似性度量,但许多方法(例如,图同构)限制性太强(即,要求两个图完全或大部分相同),因为即使是正常执行也经常会产生略有不同的溯源图。UNICORN 的图形相似性算法不会出现这些问题。
B. 构建直方图
我们的目标是有效地比较起源图,同时容忍正常执行中的微小变化。我们对算法的两个标准是:1) 表示方法应考虑长期因果关系; 2) 我们必须能够在实时流图数据上实施该算法,以便我们可以在入侵发生时阻止它们(不仅仅是检测它们)。
我们采用基于同构的一维 WL 测试的线性时间、快速 Weisfeiler-Lehman (WL) 子树图核算法。我们对 WL 子树图形内核的使用取决于我们构建顶点直方图的能力,该直方图捕获每个顶点周围的图形结构。我们根据完全描述顶点 R-hop 邻域的增强顶点标签对顶点进行分类。我们通过迭代标签传播来构建这些增强的顶点标签。
假设我们有一个完整的静态图。在单个重新标记步骤中,首先我们将节点标签、其入边的标签以及所有这些边的源节点的标签作为输入,然后输出一个由所有输入标签聚合而成的该节点的新标签。我们对每个节点重复这个过程,然后将整个过程重复 R 次以构建描述 R-hop 邻域的标签。一旦我们为图中的每个节点构造了增强节点标签,我们就创建了一个直方图,直方图的每个柱对应于这些标签。同构的 WL 测试基于这些增强的顶点标签比较两个图;如果两个图在相似的标签集上具有相似的分布,则它们是相似的。
其实这个算法类似于标签传播策略,简单来说就是对于每一个节点,考虑其入边和入边的源节点,据此为该节点计算一个增强的标签,这个标签加入了其父亲节点的信息。重复执行R次之后,每个节点的增强标签就会携带其R代祖先的信息,以实现结合上下文的目的。
我们将静态图 G G G 定义为一个 5 元组 ( V , E , F v , F e , C ) , (V,E,{\mathcal{F}}^{v},{\mathcal{F}}^{e},{\mathcal{C}}), (V,E,Fv,Fe,C),,其中 V V V 是节点集, E E E 是有向边集,即 e = ( u , v ) ∈ E e=(u,v)\in E e=(u,v)∈E 和 ( u , v ) ≠ ( v , u ) ∀ u , v ∈ V \mathbf(u,v)\neq(v,u)\forall u,v\in V (u,v)=(v,u)∀u,v∈V。 F v : V → Σ \mathcal{F}^v:V\to\Sigma Fv:V→Σ 是一个函数,它将字母 Σ \Sigma Σ 中的标签分配给图中的每个节点,类似地, F e : E → Ψ {\mathcal{F}}^e : E → Ψ Fe:E→Ψ 将字母表 Ψ Ψ Ψ 中的标签分配给每条边。 C {\mathcal{C}} C 是记录每条边的时间戳的函数。在第 1 行中, R R R 是每个节点探索生成直方图元素的邻域跳数。 UNICORN 通过检查图中每个节点周围的有根子树来创建整个图的直方图。通过考虑这种非线性子结构,除了每个节点/边的属性之外,UNICORN 还保留了起源图的结构等价性,这已被证明优于随机游走等线性方法。 M M M 是节点 v v v 的相邻节点和/或边标签的列表,而 l i ( v ) l_i(v) li(v) 是节点 v v v 在第 i i i 次迭代(或 ( i − 1 ) (i-1) (i−1) 跳邻域,其中 0-hop 邻域是顶点本身)。 T S TS TS 是相邻顶点的时间戳列表。在第 8 行中,函数 I n ( v ) In(v) In(v) 返回顶点 v v v 的所有入边,第 9 行中的函数 S o u r c e ( e ) Source(e) Source(e) 返回边 e e e 的源顶点。 T T T 记录每一个节点 v v v 的时间戳。在第 16 行中, N ( v ) = { w ∣ ( w , v ) ∈ E } \mathcal{N}(v)=\{w\mid(w,v)\in E\} N(v)={w∣(w,v)∈E} 是节点集, v v v 通过入边连接到这些节点。
直方图的每个元素都对应一个唯一的顶点标签,该标签捕获顶点的 R-step 传入邻域。标签捕获有关邻域中的边和该邻域中顶点的身份的信息,包括揭示对象、主题和活动之间因果关系的复杂上下文信息。
初始情况下,每个顶点都以其自己的初始标签为增强标签。然后,我们通过添加传入边的标签和这些边的源节点的初始顶点标签来合并 1-hop 邻居。在这个构建过程之后,每个顶点标签现在都代表顶点和边标签,这样当我们扩展到越来越大的邻域时,我们只需要为所有入边的源节点添加标签(因为这些标签已经包含了来自其传入边的边标签)。我们按照相应边的时间戳对所有标签进行排序,尊重系统中事件的顺序,然后对标签列表进行哈希处理,以方便快速查找和记录。一些顶点/边可能有多个标签,但相同的散列技巧允许以可忽略的成本进行多标签计算。
流的可变性和算法复杂度。在流式传输环境中,我们仅在新到达的顶点和其传入邻域受新边影响的顶点上运行算法1。在每个溯源图实体或进程使用多个顶点来表示相应对象的不同版本或状态的起源图中,我们只需要计算/更新每个新边的目标顶点的邻域,因为所有传入边到一个顶点的时间在其到达任何传出边的顶点之前。 UNICORN 利用这种偏序来最小化计算开销(图 2)。因此,实际运行时复杂度大约等同于原始的一维 Weisfeiler-Lehman 算法:使用 R-hop 邻域,复杂度为 O ( R ∣ E ∣ ) O(R|E|) O(R∣E∣)。
虚线边在处理完所有实边后到达,虚线顶点是新到达的。如果起源图遵守偏序,则边 1 必须先于边 2 到达,并且只需要计算顶点 E 和 F 的局部结构。然而,在未观察到偏序的起源图中,我们可以在实边之后遇到边 3 和 4 以及新到达的顶点 G(红色虚线)。在这种情况下,R = 2,我们需要更新边 3 的顶点 C 和 E(D 的后代)以及边 4 的顶点 C、D 和 E(G 的后代)。
这里没太懂这个偏序关系。
概念漂移的削减。系统行为通常会随着时间的推移而发生变化,这会导致流式溯源图的底层统计属性发生变化。这种现象被称为概念漂移。
UNICORN 根据年龄对现有数据的影响进行削减,通过在直方图元素计数上使用指数权重衰减来逐渐忘记过时的数据,从而解释系统行为的此类变化。分配的权重与数据的年龄成反比。对于直方图 H H H 中的每个元素 h h h,作为新数据项 x t x_t xt(即算法 1 第 23 行的散列标签 l i ( v ) l_i(v) li(v))在时间 t t t 流入,将 H h H_h Hh 计数为: H h = ∑ t w t 1 x t = h H_h=\sum_t w_t1_{x_t=h} Hh=t∑wt1xt=h其中, w t = e − λ ∆ t w_t = e^{−λ∆t} wt=e−λ∆t。 UNICORN 随着添加到图中的边数单调递增 t t t。
在入侵检测场景中的适用性。逐渐遗忘的方法帮助 UNICORN 专注于系统执行的当前动态(即溯源图的最新部分),以及与当前执行有因果关系的图的部分(即R邻居) ,同时保持过去的“记忆”衰减,其速率由权重衰减因子 λ λ λ 控制。无论事件发生与系统执行的当前状态在时间上有多远,如果它与当前对象或活动有因果关系,则该事件及其周围的邻域将毫无折扣地对直方图做出贡献。因此,溯源图确保相关的上下文信息无论时间如何都保留在分析中。
C. 生成图摘要(graph sketch)
与传统的基于直方图的相似性分析不同,UNICORN 在新边到达时不断更新直方图。测量流式直方图之间的相似性具有挑战性,因为直方图元素的数量不是先验的并且不断变化。此外,我们应该根据图特征的基本分布而不是绝对计数来衡量相似性。
UNICORN 采用 HistoSketch ,一种基于一致加权采样的方法,可以有效地为流式直方图保持紧凑和固定大小的草图(sketch)。 HistoSketch 是一种恒定时间算法,因此它的速度足以支持对快速增长的起源图进行实时流分析。它还根据直方图的归一化、广义最小-最大 (Jaccard) 相似性无偏地近似直方图。
D. 学习进化模型
UNICORN 在训练期间创建了一系列按时间顺序排列的草图。然后,它使用众所周知的 K-medoids 算法对来自单个服务器的草图序列进行聚类,使用轮廓系数来确定 K 的最佳值。簇代表系统执行的“元状态”,例如,启动、初始化、稳态行为。然后使用所有集群中草图的时间顺序和每个集群的统计数据(例如,直径、中心点)来生成系统演化的模型。
算法2描述了进化模型的构建。每个草图 S ( t ) S(t) S(t) 属于索引为 k k k 的单个簇。演化 E E E 是集群索引的有序列表,其顺序由时间排序的草图 S ( t ) S(t) S(t) 确定。
对于每个训练实例,UNICORN 创建一个模型,在其运行期间捕获系统执行状态的变化。直观上,这类似于跟踪系统执行状态的自动机。最终模型由来自训练数据中所有溯源图的许多子模型组成。通过进化建模,UNICORN 可以在多个时间点学习系统行为;使用逐渐遗忘方案,在任何时间点,UNICORN 都能够专注于最相关的活动。
其实这个进化建模是指会根据系统一段时间的行为而不是某一时刻的行为来建模,并不是说在运行过程中会不断演化。作者为了避免中毒,假设训练阶段是安全的。模型一经训练好便不再在运行中更改。
E. 异常检测
随着直方图从流溯源图演变而来,UNICORN 会定期创建草图。给定一个溯源图的草图,UNICORN 将草图与建模期间学习的所有子模型进行比较,将其拟合到每个子模型中的一个簇。UNICORN 假设监控从系统启动开始,并跟踪每个子模型内的系统状态转换。要在任何子模型中被视为有效,草图必须适合当前状态或(其中之一)下一个状态(即,在草图捕获系统执行中的状态转换的情况下);否则,它被认为是异常的。因此,我们检测到两种形式的异常行为:不适合现有簇的草图和簇之间的无效转换。
简单来说,就是将建模期间的草图按时间排列,然后聚类成一个个簇,每个簇代表了一个元状态。由这些簇构成一个类似自动机的数据结构。检测期间的草图如果不属于任何一个簇或由当前状态进入了一个不可达状态,视为异常。
5. 实现
GraphChi [75] 是一个基于磁盘的系统,可以在一台计算机上高效地计算具有数十亿条边的大型图。使用 GraphChi,UNICORN 无需将整个溯源图存储在内存中即可实现高效的分析性能。 UNICORN 依赖于 GraphChi 的两个重要特性:
- GraphChi 使用并行滑动窗口(PSW)算法将图拆分为碎片,每个碎片中的边数大致相同;它并行计算每个分片。该算法允许通过少量非顺序磁盘访问快速更新磁盘中的顶点和边。
- UNICORN 利用 GraphChi 对流图的高效计算。UNICORN 的保证偏序最小化了它访问的顶点数量,即使邻域跳跃参数 R 很大。批量添加边,而不是一次处理一条边,可以使处理速度更快。
[75] A. Kyrola, G. E. Blelloch, and C. Guestrin, “GraphChi: Large-scale graph computation on just a pc,” in Symposium on Operating Systems Design and Implementation. USENIX, 2012.
6. 评估
将UNICORN与StreamSpot进行了比较
三个真实的APT攻击数据集(CADETS、ClearScope、THEIA)来探索UNICORN的有效性
在受控的实验室环境中使用CamFlow创建了我们自己的模拟APT供应链攻击数据集(SC-1和SC-2)