下载本文的 PDF 版本 PDF

深入大数据溯源
(使用 SPADE)

用于查询溯源的用户界面

Ashish Gehani, Raza Ahmad, Hassaan Irshad, Jianqiao Zhu, 和 Jignesh Patel

数据溯源描述了数字制品的来源。它解释了对象的创建,以及在其生命周期中发生的所有修改和转换。当历史记录详细、跨越较长时间或两者兼有时,收集的信息可能会变得非常庞大。溯源分析通常在溯源信息不断通过一系列计算扩展时使用。这就需要一个框架,该框架支持高性能地流式摄取新元素,并支持并发查询,从而产生包含可用数据的响应。

操作系统和区块链是许多大数据溯源9已获得有用应用的领域中的两个。在操作系统的情况下,内核审计框架收集的系统调用信息可以构成可信溯源元数据的基础。这有助于跟踪跨机器甚至联邦系统发生的所有活动。这种全网络溯源1 对于恶意软件检测和确保计算的可重复性等应用尤其有用。

比特币是一种基于区块链的加密货币,个人可以在彼此之间进行交易。两个或多个用户之间的每笔交易都包含应存储在区块链中的支付信息。这些记录构成了跟踪区块链中任何给定数字对象溯源的基础。除了跟踪货币所有权的主要目的外,溯源还有其他应用,例如检测异常行为以识别非法活动。

溯源元数据可以存储在数据库中,以方便高效查询。询问系统的过程必须直观且方便使用,因为在大数据溯源中找到相关片段就像在干草堆中寻找针。特别是,尽管系统应用于各种领域,从分析复杂的应用程序工作流程到在系统遭到攻击后执行取证和影响分析,都需要满足这些目标。

存在几种用于查询溯源的界面。其中许多界面在允许用户选择他们选择的数据库类型方面不够灵活。一些界面以与面向图的数据模型不同的数据模型中提供查询功能,而面向图的数据模型对于溯源来说是很自然的。其他界面具有用于查找结果的直观构造,但对有效链接响应的支持有限,而分面搜索需要这种支持。本文介绍了一种用于查询溯源的用户界面,该界面解决了这些问题,并且与所使用的底层数据库无关。

首先,提供了有关数据溯源的相关背景知识,以及如何对其进行建模以及如何在开源实现中实现表示。然后介绍了查询表面的设计、概述了其核心功能、描述了说明性用例,并重点介绍了系统的突出方面。

 

计算历史建模

报告数据溯源的常用方法是将其建模为图结构,其中顶点表示历史记录中的元素,边表示与元素相关并对元素进行排序的事件。溯源图 G(V,E) 随后包含一组顶点 V 和边 E。集合 V 的成员 v 可以是事件中涉及的代理进程制品。属于集合 E 的每条边 e 表示发生的操作,并将两个顶点 vivj 联系起来。

已经开发了多种数据模型来表示数据溯源。值得注意的变体是 2010 年发布的 OPM(开放溯源模型)11;2013 年发布的 W3C PROV 规范13;以及 DARPA 透明计算计划于 2019 年最终确定的 CDM(通用数据模型)10。它们具有一定的相似性。每个模型都包括用于三个元素类别的顶点:代理或主体;进程、活动或主题;以及制品、实体或对象。它们在细节上有所不同,具体取决于其预期使用领域:OPM 旨在与领域无关;W3C PROV 的创建是为了帮助发布语义丰富的 Web 内容;而 CDM 则专注于操作系统的特定领域。

被监控的活动领域的语义通过自定义模式捕获。通过使用属性图来表示溯源,这些细节可以直接嵌入。顶点和边都伴随着一组(可能为空)领域描述性注解 AA = a1, a2,..., an。每个注解 ai 都是键值对,即 ai = keyi : valuei,它报告领域的某个方面,例如 program:firefoxpath:/etc/passwd。通过这种方式,溯源图捕获了事件的相对顺序以及被监控领域的突出方面。

例如,考虑一个表示操作系统进程的顶点。此顶点可能具有传达诸如其名称、标识符或开始时间等信息的注解。边可以将进程与已读取的文件相关联。在比特币溯源7 的情况下,表示交易的顶点将具有诸如标识它的哈希值以及最早有效时间等注解。边可以将未花费的比特币与收款人联系起来,并带有指定金额的注解。

 

规范溯源查询

最简单的溯源查询包括搜索与规范匹配的顶点,该规范由描述它的注解上的表达式定义。此类查询对于定位可以用作更复杂查询(如本文所述的查询)起点的顶点非常有用。类似于检索顶点的是用于识别单个边的查询。例如,用户可能想了解特定文件的权限被更改的所有情况。由于这是一个原子系统事件,因此用户可以搜索所有相关的溯源边。类似地,一旦定位了一条边(或一组边),用户就可以提取端点顶点。在前面的示例中,这将允许识别执行操作的进程。

在操作溯源记录时,最常需要的功能之一是支持查找元素的沿袭。在沿袭查询中,数据制品的祖先关系会被追溯指定的步数。在另一个方向上运行的类似功能对于识别后代非常有用。给定数据制品的祖先或后代是通过递归查找图结构中的父顶点或子顶点来找到的。项目的祖先沿袭提供了在该项目创建之前发生的事情的图景,而后代变体描述了在其创建之后从中派生的内容。对于操作系统溯源,文件的沿袭可以解释该文件是如何、何时以及由谁创建的。它可以支持枚举所有写入或读取文件的系统进程(及其所有者)。对于比特币,支付的沿袭可以揭示有关参与用户以及与他们关联的所有交易的详细信息。

另一个重要的操作包括搜索一对元素之间的路径。在实践中经常出现此操作的两个变体。第一个变体涉及查找两个顶点之间的所有路径,而第二个变体则侧重于查找它们之间的最短路径。两个顶点之间的路径演示了不同的数据元素如何通过系统中发生的事件相互影响。例如,查找 Web 浏览器应用程序与从 Internet 下载的文件之间的路径,显示了浏览器的用户将文件从远程服务器带到本地计算机所需的完整步骤集。在比特币上下文中,两个地址之间的路径可用于查找链接这两个地址的交易。反过来,这可以用于计算从一个用户流向另一个用户的资产,即使它们通过中介机构也是如此。

 

溯源系统架构

开源 SPADE 项目3 提供了用于推断、存储和查询数据溯源的软件。它是跨平台的,可以与各种来源一起使用,例如区块链、在线社交网络和多种操作系统,包括 Linux、macOS 和 Windows。溯源的收集无需更改应用程序或目标平台。SPADE 易于安装和配置。它为用户提供了一种简单的机制,可以从多种存储格式中进行选择。

图 1 显示了 SPADE 的架构。它由多个模块组成,每个模块在处理溯源记录中都扮演着独立的角色。这些模块由核心的 SPADE 内核 管理。关于活动领域的溯源图元素由 Reporter 模块推断并发送到内核。在被任何存在的 过滤器 操作后,元素被发送到 存储 模块,这些模块将元素插入配置有自定义模式的数据库中。用于摄取和查询处理的独立线程的存在允许客户端在底层图正在更改时进行溯源查询。各种类型的模块将在稍后进一步描述。

Digging into Big Provenance (with SPADE)

Reporter 模块充当溯源元数据的生产者。它接收来自不同来源的事件流,从中提取相关信息,并推断溯源关系,在此过程中构建图顶点和边。SPADE 提供了大量的 Reporter,它们生成关于不同领域的溯源,包括操作系统、区块链、应用程序内调用和用户定义的模式。

过滤器模块对 Reporter 发出的溯源流进行操作。它根据编程标准对溯源执行选择操作。例如,一些过滤器仅允许与规范匹配的顶点和边通过。其他过滤器抽象或删除顶点或边中的信息。过滤器的输出是要持久化的已处理溯源信息。可以插入多个过滤器以按顺序对每个前一个过滤器的输出进行操作。

存储模块获取过滤器序列(如果存在)的最终输出,并将其存储在可用的数据库之一中。该模块提供了对底层持久存储的抽象。该子系统可以是关系数据库(如 MySQL 或 Postgres)、图数据库(如 Neo4j)或任何数据存储。该模块提供了用于存储和检索数据的接口,这些接口与底层数据库无关。

分析器模块为用户提供了一个界面,用于检索存储在 SPADE 中的溯源记录。它负责接收查询、将其发送到适当的存储、处理信息以及与用户共享结果。默认实现从命令行接收查询。

 

查询表面的设计

第一代 SPADE 及其前身引入了对查询文件沿袭的支持,该沿袭由其路径和版本(截至给定日期和时间)指定。它包括用于跨主机传输溯源元数据4 和加速此类记录的加密验证5 的多项优化。直到第二代6 才添加了更丰富的查询表面,包括支持检索顶点、边、路径和沿袭。

为了使查询更易于使用,以便导航大数据溯源和执行分面搜索,开发了一个新的表面。它的名称 QuickGrail 源于其设计灵感来自 Grail 项目2 并且最初在 Quickstep 数据库12 之上实现的事实。随后,SPADE 添加了对将 QuickGrail 与 Neo4j 图数据库和 Postgres 关系数据库一起使用的支持。

QuickGrail 提供了对底层数据库的抽象,以便用户可以使用统一的查询语言,而无需考虑下面的数据模型和序列化。这允许用户专注于手头的溯源分析任务,而无需担心查询将如何转换为数据库的本机语言。除了高效之外,该表面还提供了一种统一的机制来导出响应以进行可视化和其他外部用途。

查询界面提供了一系列功能,用于搜索溯源记录和操作从底层数据库检索的响应。支持的数据库是 Neo4j、Postgres 和 Quickstep。查询表面中的每个函数都以中间表示形式实现,该中间表示形式被转换为目标数据库的查询语言。

该系统提供了多项功能,以方便分面搜索,允许用户专注于他们感兴趣的信息。其中一项功能是能够将查询响应分配给图变量。此类变量可以在后续查询中进行操作,以优化搜索。在存在大数据溯源的情况下,有助于高效用户交互的另一项功能是限制响应大小的能力。这允许用户发送查询并快速接收部分响应,他们可以检查这些响应以优化搜索。

 

变量

特殊变量 $base 表示当前选定数据库中存储的整个溯源图。此变量充当大多数查询的溯源宇宙。当变量用于存储来自查询的响应图时,它将出现在赋值的左侧(用 = 表示),并且其名称必须以 $ 开头。如果变量用于定义查询约束,则其名称必须以 % 开头。此类变量是一种便利,提供了一种简洁的方式来表示可能需要重复作为参数传递给查询的约束。

 

约束

为了限定与查询匹配的元素范围,可以指定选择约束。在其最基本的形式中,它由注解键、关系运算符和值组成。(回想一下,注解已在本文前面介绍过。)支持的运算符包括 ==!=<><=>=LIKE。最后一个运算符有助于匹配字符串(其中 % 用作通配符)。例如,name LIKE '/bin/%' 将匹配具有注解键名称且值以 /bin/ 开头的顶点。uid == '0' 的约束可用于选择以 root 身份运行的进程的顶点(因为其 uid 为 0)。为了简化重用,可以将约束存储在变量中,例如 %system_procs = name LIKE '/bin/%'

为了支持更复杂的过滤,可以使用逻辑运算符 ANDORNOT 组合成分来构建约束表达式。这允许约束表达式在多个注解上构建。此外,它允许用户将现有约束与新标准组合,从而方便分面搜索。例如,考虑用于查找表示 python 执行的顶点的约束 %proc_python = name == 'python'。查询者可能对以 root 用户身份运行的子集感兴趣。在这种情况下,查询者可以定义另一个约束 %proc_root = uid == '0'。然后可以将这两个约束组合成一个表达式 %proc_python AND %proc_root,以便在后续查询中使用。

 

提取元素

由于溯源图由顶点和边组成,因此提供的最基本函数是 getVertexgetEdge。它们可以与任何现有图变量一起使用,以提取元素的子集,如约束所指定的那样。这些函数的输出必须分配给图变量。请注意,即使这些函数产生顶点或边的集合,这些集合也被视为图。在以下示例中,顶点是从特殊变量 $base 中提取的,该变量表示全局图。它们被约束为具有 Process 注解类型的子集:

%only_processes = type == 'Process'

$all_processes = $base.getVertex(%only_processes)

 

类似地,如果每条边都具有操作值为 fork 的注解,则提取每条边

 

%all_forks = operation == 'fork'

$fork_edges = $base.getEdge(%all_forks)

 

使用刚刚获得的边集,下一个查询提取执行 fork 操作的进程,以及作为结果创建的进程

 

$fork_vertices = $fork_edges.getEdgeEndpoints()

 

识别起源和影响

给定溯源图中的一个元素,一个中心问题是理解是什么导致了它的产生。同样重要的是理解特定元素受到了什么影响。在这两种情况下,都是通过从元素开始,分别找到其父元素或子元素,然后递归来完成的。getLineage 函数支持这一点,该函数被推广为对一组种子元素进行操作。它接受三个参数:(1)一组种子顶点;(2)从种子顶点遍历的最大级别数,必须是正整数;以及(3)遍历的方向,可以是 ancestorsdescendants 或两者。以下示例提取具有 firefox 注解的顶点的两个级别的祖先沿袭

 

%firefox = name == 'firefox'

$init_vertex = $base.getVertex(%firefox)

$firefox_lineage = $base.getLineage($init_vertex, 2, 'ancestors')

 

连接点

初步分析(例如,通过使用越来越具体的约束进行分面搜索)可能会导致识别出两组顶点:一组可能由网络流量进入系统的入口点组成,而第二组可能具有泄露指标,例如权限被提升的进程或在特定时间窗口内所有权发生更改的文件。

了解两组之间是否存在连接是一个关键问题。这可以使用 getPath 函数来确定,该函数接受三个参数:(1)一组源顶点;(2)一组目标顶点;以及(3)任何源顶点和目标顶点之间的最大路径长度,必须是正整数。溯源的语义暗示只有当目标在溯源中(即,它是源的祖先)时才会找到路径。以下示例搜索长度最多为三条边的路径,这些路径介于 firefox 进程顶点和 /etc/passwd 文件顶点之间

 

%source = name == 'firefox'

$firefox = $base.getVertex(%source)

%destination = path == '/etc/passwd'

$etc_passwd = $base.getVertex(%destination)

$paths = $base.getPath($firefox, $etc_passwd, 3)

 

如果发现的路径集很大,可以通过指定一个或多个中间顶点集来优化它。例如,如果已知 $compromised_process 集位于从 $firefox$etc_passwd 的感兴趣路径上,则可以使查询更具体

 

$paths = $base.getPath($firefox, $compromised_process, 3, $etc_passwd, 3)

 

填补缺失的部分

在调查的早期,可能已知特定的代理、活动和制品是感兴趣的,但并非所有元素(包括它们之间的关系)都是已知的。在这种情况下,分析师可以定义一组感兴趣的顶点,然后要求系统描述它们如何相互关联。例如,在指定的时间范围内可能会识别出一组可疑的网络连接和所有权已修改的文件。然后,分析师可能希望知道这些元素中的任何元素是否相关以及如何相关。

在一般情况下,分析师可以在集合中包含边,以合并有关已知感兴趣的溯源关系的信息。这可以使用 getSubgraph 函数完全实现,该函数将骨架图作为输入。骨架是一组先验已知的感兴趣的顶点和边。该函数返回跨越骨架中所有元素以及位于骨架中顶点和边端点之间的路径上的元素的溯源子图。

在下面的示例中,返回的溯源子图将显示 Firefox 创建的几十个线程中的每个线程的顶点、访问的每个配置和缓存文件以及用于进程间通信的每个套接字,以及它们之间的溯源关系。

 

%firefox_threads = name LIKE 'firefox%'

$firefox_skeleton = $base.getVertex(%firefox_threads)

$firefox_process = $base.getSubgraph($firefox_skeleton)

 

使用原生查询

通用数据库提供了各种查询表面。支持的基元集取决于诸如所使用的数据模型和底层引擎中实现的索引等因素。关系数据库(如 Postgres 和 Quickstep)提供基于 SQL(结构化查询语言)的界面。图数据库(如 Neo4j)使用 Cypher,一种面向图的声明性类似物。由于每个数据库都可能支持可能对分析师有用的自定义查询,因此提供了一种访问它们的功能。如果查询以关键字 native 开头,则它将未经修改地传递到底层数据库。响应将作为文本行而不是图返回。这允许调用任意原生查询。

例如,考虑 OPM 中的操作系统溯源图,其中 制品 顶点按子类型细分,包括 filelinkdirectoryblock devicecharacter devicenamed pipeunnamed pipeunix socketnetwork socket。在初步分析中,这些元素的分布可能对识别异常模式感兴趣。在这种情况下,可以使用用户定义的函数 histogram 从 Postgres 获取每个子类型的计数

 

native 'SELECT * FROM histogram(vertex, subtype)'

 

复杂溯源分析

当分析大型数据集时,该过程通常是迭代的。分析师可能会构建许多假设,并通过查询数据来检查每个假设是否有效。随着调查的展开,维护工作流程的效率需要简洁地表示中间结果,以避免 I/O 带宽成为瓶颈。在实践中,搜索通常是分面的,一个步骤的结果在后续步骤中重用。它还可能涉及回溯和比较提取的数据子集。当检索到潜在感兴趣的结果时,可视化或其他外部处理可能允许分析师广泛了解选定的子集。查询表面具有解决这些问题的多项功能。它们共同促进了敏捷探索。

 

高效表示

SPADE 将溯源建模为属性图。选择注解模式以确保哈希它们将为每个顶点和边生成唯一的基于内容的标识符。当执行查询时,只有响应中涉及的标识符与用于跟踪响应的图变量相关联。实际上,仅构建由相应子图的邻接列表组成的骨架表示。具有键值注解形式的图属性的丰富表示不会立即物化。这些属性描述了推断溯源的领域,占用了保存完整图所需的大部分存储空间。在显式导出响应(通过控制台或使用 dump 命令的文件)之前,避免检索它们。这允许分析师进行可能产生大型响应的查询,而不会中断他们的交互式工作流程(如果完整响应要物化,则会发生这种情况)。

考虑以下序列

 

$sources = $base.getVertex(name == 'firefox')

$destinations = $base.getVertex(path == '/etc/passwd')

$paths = $base.getPath($sources, $destinations, 3)

 

图变量 $sources$destinations$paths 仅跟踪涉及的顶点和边的标识符。仅当显式发出 dump $paths 时,例如,才从数据库中检索图 $paths 中元素的注解。

 

响应重用

当查询客户端启动会话时,会创建一个本地工作区来存储接收到的图响应。每个图都绑定到一个变量名,从而简化了其重复使用。此类变量可以通过两种方式之一使用。首先,由于变量表示图,因此可以将其视为将由后续查询操作的宇宙。其次,变量可以作为查询的参数传递。

在以下示例中,最后一个查询使用 $processes 而不是 $base 作为溯源宇宙,在其中搜索名称以 firefox 开头的所有进程顶点

 

%type_process = type == 'Process'

$processes = $base.getVertex(%type_process)

%firefox_threads = name LIKE 'firefox%'

$firefox_parents = $processes.getVertex(%firefox_threads)

 

随着会话的进行,可以使用命令 list graph 识别当前定义的变量集。stat 命令可用于获取有关特定图的统计信息。例如,stat $paths 报告名为 $paths 的图中的顶点和边数。通过使用 erase <variable name> 销毁绑定来支持变量名的重用。这消除了与变量关联的骨架表示。

 

集合操作

对溯源的初步检查可能会使分析师拥有一系列需要进一步优化的庞大子图。例如,可以利用关于活动领域的知识来识别图中特别感兴趣的子集,如前所述。更具体地说,在领域特定注解上构建的查询可以将顶点和边的集合从底层数据库提升到工作区;然后可以通过路径和沿袭查询扩展这些种子集。

为了方便对图进行符号操作,提供了一套补充操作。它们在图的设置中实现了直观的数学集合运算。特别是,可以使用 + 运算符将成对的图转换为成分的并集。结果包含一个顶点集,该顶点集是操作数图中顶点的并集。类似地,结果边集是操作数图中边的并集。或者,可以使用 & 运算符计算两个图的交集。结果图将仅包含操作数图中都存在的顶点和边。最后,可以根据第二个图的规范删除图中的元素。这是通过差集运算符 - 实现的。

考虑这样一种情况,分析师希望确定在执行过程中更改其身份的进程集。首先,他们提取报告身份更改的所有边集。接下来,他们提取这些边的端点,表示发出 setuid() 调用的进程。然而,最初以 root 身份运行的子集在这种上下文中并不受关注。因此,通过在最后一步中减去相应的集合来删除此类进程。

 

$setuid_operations = $base.getEdge(operation == 'setuid')

$chameleons = $setuid_operations.getEdgeDestination()

$privilege_escalated = $chameleons - $chameleons.getVertex(uid != 0)

 

图导出

由于从查询产生的图可能很大,因此不会立即物化。相反,图可以通过三种方式使用。首先,可以以 JSON(JavaScript 对象表示法)格式将其打印到控制台。输出是一个顶点和边数组。每个元素都由一个或两个标识符组成(取决于它是顶点还是边)以及描述它的注解。

在下一个示例中,分析师检查图内容的子集。这是通过使用 limit 函数提取样本(在本例中为 10 个元素),然后使用 dump 命令打印它们来完成的。这种模式在分面搜索过程中非常有用,在分面搜索过程中,分析师可能会根据对连续中间结果的研究迭代地优化查询。

 

$firefox_vertices = $base.getVertex(name LIKE 'firefox%')

$firefox_sample = $firefox_vertices.limit(10)

dump $firefox_sample

 

使用图的第二种方式是以 JSON 格式将其导出到文件或管道。这允许外部工具导入或摄取它。为了实现这一点,在使用 dump 之前立即使用 export 指令来指定文件系统路径。例如,可以使用以下命令将图变量 $firefox_vertices 序列化到文件 /tmp/firefox.json

 

export > /tmp/firefox.json

dump $firefox_vertices

 

最后,提供了将图导出为广泛使用的 Graphviz DOT 格式的支持。这允许以多种形式可视化它,具体取决于用于渲染它的布局工具。其机制与前一种方法类似,在 dump 命令之前使用 export(指定应将 DOT 数据发送到何处)

 

export > /tmp/firefox.dot

dump $firefox_vertices

 

说明性用例

本节介绍来自前面介绍的两个领域(操作系统和区块链)的用例。在事后分析场景中查询溯源。

 

操作系统

考虑这样一种设置,其中溯源是从系统调用中推断出来的,就像 SPADE 的 Audit Reporter 在 Linux 上、OpenBSM 在 macOS 上以及 ProcMon 在 Windows 上所做的那样。结果图捕获了用户、进程和数据制品之间的交互。作为一个动机性用例,考虑系统管理员在遭到入侵后所面临的挑战。必须确定对目标主机造成的损害的性质和程度。这可能从确定恶意软件感染的来源到识别哪些数据已被泄露以及哪些系统配置已被修改不等。

现在考虑一个受实践中看到的攻击启发的示例,如图 2 所示。通过分析系统中进程和制品之间抽象的溯源关系,可以简化对攻击步骤的理解。假设应用程序 (firefox) 通过远程连接接受恶意请求。这利用了程序中存在的漏洞。它导致正在执行的进程被劫持,攻击者获得对它的控制权。数据被写入二进制文件 (tcexec) 的位置。修改后的文件的权限被更新,以确保它是可执行的。随后,当此二进制文件运行时,它会访问系统文件并将它们泄露到远程主机。

Digging into Big Provenance (with SPADE)

取证分析师可以使用以下一组查询来重建所发生的事情。在开始时,假定分析师先验知道是在浏览恶意网站后 firefox 进程被劫持。

  1. 确定 Web 浏览器是否执行了从远程网络连接下载的文件。
    1. ) 获取表示 Firefox Web 浏览器的顶点。
    2. $firefox = $base.getVertex("command line" LIKE '%firefox%')

    3. ) 获取表示全局可读、可写和可执行的文件的顶点。
    4. $executableFiles = $base.getVertex(subtype == 'file' AND permissions == '0777')

    5. ) 获取表示网络连接的顶点。
    6. $networkConnections = $base.getVertex(subtype == 'network socket')

    7. ) 获取以下路径:(1) Firefox 进程从网络连接读取数据,以及 (2) 同一 Firefox 进程更新可执行文件的权限。
    8. $potentialAttackersEntryPath = $base.getPath($executableFiles, $firefox, 1, $networkConnections, 1)

    9. ) 获取由 Firefox 编写的可执行文件。
    10. $potentiallyExecutedFiles = $potentialAttackersEntryPath & $executableFiles

  2. 确定 Web 浏览器是否执行了任何写入的文件。
    1. ) 获取表示进程的顶点。
    2. $allProcesses = $base.getVertex(type == 'Process')

    3. ) 获取表示由 Firefox 启动的进程的顶点。
    4. $firefoxChildren = $base.getPath($allProcesses, $firefox, 1).getEdgeSource()

    5. ) 获取访问过写入文件的 Firefox 子进程。
    6. $firefoxChildrenAccessedExecutableFile = $base.getPath($firefoxChildren, $potentiallyExecutedFiles, 1).getEdgeSource()

  3. 确定一个进程是否访问了敏感的系统文件,然后通过网络连接发送了信息。
    1. ) 获取代表系统文件 /etc/passwd/etc/group/etc/hosts 的顶点。
    2. $systemFiles = $base.getVertex(path == '/etc/passwd' OR path == '/etc/group' OR path == '/etc/hosts')

    3. ) 获取从网络连接到读取系统文件的 Firefox 子进程的路径。
    4. $exfiltrationPath = $base.getPath($networkConnections, $firefoxChildrenAccessedExecutableFile, 1, $systemFiles, 1)

 

比特币

比特币被用于暗网(以及其他)市场。8 每笔支付都发送到一个特定的地址,该地址标识一个用户。每笔成功的交易都记录在一个区块中,该区块成为公共账本(比特币区块链)的一部分。SPADE 的 Bitcoin Reporter 可以用来推断关联各个地址、交易和区块的出处图。下一个示例假设区块链已导入到 QuickGrail 支持的数据库中。这允许取证分析师跟踪资金在比特币生态系统中的流动。例如,他们可能希望识别特定交易的所有来源。或者,他们可能想检查从一个比特币地址到另一个比特币地址是否存在路径。

在这个例子中,分析师从一个在网站上找到的比特币地址开始,该网站征集捐款以支持非法活动。最初,他们检查特定地址是否发送过任何付款。搜索限制在五个间接层级内。

 

$donation_address = $base.getVertex(address == '13Pcmh4dKJE8Aqrhq4ZZwmM1sbKFcMQEE')

$payer_candidate = $base.getVertex(address == 'ZwmbK4ZdKJ3PcQEmh8MEAqrhq41FcEM1s')

$paths = $base.getPath($donation_address, $payer_candidate, 5)

 

接下来,分析师检索所有付款人,他们的资金通过直接付款或通过中介到达捐赠地址。

 

$payers = $base.getLineage($donation_address, 2, 'descendants')

 

查询的生命周期

在线提供了下载、构建和运行 SPADE 的说明。3 假设它正在运行,查询客户端可以在通过在 shell 命令行执行命令 spade query 启动后交互使用。也可以通过分别重定向标准输入和标准输出来向其管道命令和来自其的响应。

指令 set storage <name> 可以在客户端中发出,以更改当前的默认数据库。这假设之前已添加了相应的 SPADE 存储。此时,会创建一个会话。现在发出的任何查询都将发送到选定的数据库。查询会话将持续到发出 exit 命令为止。

 

致谢

本材料基于美国国家科学基金会根据 Grant ACI-1547467 支持的工作。本材料中表达的任何意见、发现、结论或建议均为作者的观点,不一定反映美国国家科学基金会的观点。

 

参考文献

1. Ahmad, R., Jung, E., de Senne Garcia, C., Irshad, H., Gehani, A. 2020. 全网络溯源中的差异检测,《第 12 届 USENIX 溯源理论与实践研讨会论文集》(TaPP); https://www.usenix.org/conference/tapp2020/presentation/ahmad.

2. Fan, J., Gerald, A., Raj, S., Patel, J. 2015. 反对专用图分析引擎的案例。《第 7 届创新数据系统双年会议论文集》(CIDR); http://cidrdb.org/cidr2015/Papers/CIDR15_Paper20.pdf.

3. Gehani, A. SPADE; http://spade.csl.sri.com.

4. Gehani, A., Kim, M., Zhang, J. 2009. 管理网格集群中沿袭元数据的步骤。《第一届 Usenix 溯源理论与实践研讨会论文集》(TaPP) 7, 1-9; https://dl.acm.org/doi/10.5555/1525932.1525939.

5. Gehani, A., Kim, M. 2010. Mendel:有效验证在多个信任域中修改的数据的沿袭,《第 19 届 国际高性能分布式计算研讨会 (HPDC) 论文集》; https://dl.acm.org/doi/abs/10.1145/1851476.1851503 227-239.

6. Gehani, A., Tariq, D. 2012. SPADE:分布式环境中溯源审计的支持。《第 13 届 /IFIP/Usenix 中间件会议论文集》; https://dl.acm.org/doi/pdf/10.5555/2442626.2442634.

7. Gehani, A., Kazmi, H., Irshad, H. 2016. 将 SPADE 扩展到“大数据溯源”。《第 8 届 Usenix 溯源理论与实践研讨会 (TaPP) 论文集》,26-33; https://www.usenix.org/conference/tapp16/workshop-program/presentation/gehani.

8. Ghosh, S., Das, A., Porras, P., Yegneswaran, V., Gehani, A. 2017. 用于分析暗网生态系统的 Onion 网站的自动分类。《第 23 届 国际知识发现和数据挖掘会议 (KDD) 论文集》,1793-1802; https://dl.acm.org/doi/10.1145/3097983.3098193.

9. Glavic, B. 2012. 大数据溯源:基准测试的挑战和影响。《第一届大数据基准规范研讨会修订的精选论文》,第 8163 卷,72-80; https://dl.acm.org/doi/10.1007/978-3-642-53974-9_7.

10. Khoury, J., Upthegrove, T., Caro, A., Benyo, B., Kong, D. 2020. 用于细粒度信息流跟踪的基于事件的数据模型。《第 12 届 Usenix 溯源理论与实践研讨会论文集》(TaPP); https://www.usenix.org/biblio-4496.

11. Moreau, L., Clifford, B., Freire, J., Futrelle, J., Gil, Y., Groth, P., Kwasnikowska, N., Miles, S., Missier, P., Myers, J., Plale, B., Simmhan, Y., Stephan, E., Van den Bussche, J. 2011. Open Provenance Model 核心规范。《未来世代计算机系统》27(6); https://dl.acm.org/doi/10.1016/j.future.2010.07.005.

12. Patel, J., Deshmukh,H., Zhu, J., Potti, N., Zhang, Z., Spehlmann, M., Memisoglu, H., Saurabh, S. 2018. Quickstep:基于向上扩展方法的数据平台。《VLDB Endowment 论文集》11(6), 663-676; https://dl.acm.org/doi/10.14778/3184470.3184471.

13. W3C 工作组. 2013. PROV-概述; https://www.w3.org/TR/prov-overview/.

 

Ashish Gehani 是加利福尼亚州门洛帕克 SRI 的首席计算机科学家。他的研究兴趣在于数据溯源和安全。他拥有杜克大学计算机科学博士学位和芝加哥大学数学学士学位。

Raza Ahmad 是德保罗大学的研究工程师。他为 Neo4j 和 Postgres 开发了 SPADE 的 QuickGrail 后端。他的出版物涵盖机器学习、数据科学、溯源和可重复性。

Hassaan Irshad 是 SRI 计算机科学实验室的软件工程师。他是开源分布式数据溯源框架 SPADE 的主要维护者。他的工作重点是溯源数据收集和分析,并在多个同行评审场所发表。

Jianqiao Zhu 是 Google 的软件工程师。他是 F1 查询引擎内核执行团队的技术主管。在加入 Google 之前,他获得了威斯康星大学计算机科学博士学位。他开发了 SPADE 的 QuickGrail 及其 Quickstep 后端。

Jignesh Patel 是威斯康星大学的计算机科学教授,他还与生物统计学和医学信息学系以及创意破坏实验室(他是该实验室的联合负责人)有联系。他的研究领域是数据库系统。他是一位连续创业者,也是 和 IEEE 的会士。

 

版权 © 2021 归所有者/作者所有。出版权已授权给 。

acmqueue

最初发表于 Queue vol. 19, no. 3
数字图书馆 中评论这篇文章





更多相关文章

Ethan Miller, Achilles Benetopoulos, George Neville-Neil, Pankaj Mehra, Daniel Bittman - 远内存中的指针
有效利用新兴的远内存技术需要考虑在父进程上下文之外操作丰富连接的数据。正在开发中的操作系统技术通过公开诸如内存对象和全局不变指针等抽象来提供帮助,设备和新实例化的计算可以遍历这些抽象。这些想法将允许在具有分离内存节点的未来异构分布式系统上运行的应用程序利用近内存处理来实现更高的性能,并独立扩展其内存和计算资源以降低成本。


Simson Garfinkel, Jon Stewart - 磨砺你的工具
本文介绍了我们在最初发布十年后更新高性能数字取证工具 BE (bulk_extractor) 的经验。在 2018 年至 2022 年间,我们将该程序从 C++98 更新到 C++17。我们还进行了完整的代码重构并采用了单元测试框架。DF 工具必须经常更新,以跟上其使用方式的变化。对 bulk_extractor 工具的更新描述可以作为可以并且应该做什么的示例。


Pat Helland - 自主计算
自主计算是一种使用协作来连接封地及其特使的商业工作模式。这种模式基于纸质表格,已经使用了几个世纪。在这里,我们解释了封地、协作和特使。我们研究了特使如何在自主边界之外工作,并且在保持局外人身份的同时很方便。我们还研究了如何启动跨不同封地的工作,长时间运行并最终完成。


Archie L. Cobbs - 持久性编程
几年前,我的团队正在为一个增强型 911 (E911) 紧急呼叫中心商业 Java 开发项目工作。我们尝试使用传统的 Java over SQL 数据库模型来满足该项目的数据存储需求,但感到沮丧。在对项目的特定需求(和非需求)进行一些反思之后,我们深吸一口气,决定从头开始创建我们自己的自定义持久层。





© 保留所有权利。

© . All rights reserved.