AWS上的Cuckoo SandBox

软件漏洞APT组,Check Point Research涉及许多网络研究领域。可以说,最具挑战性的研究领域之一是恶意软件分析。

当然,有各种工具可以帮助解决这些经常具有挑战性的调查,其中之一就是Cuckoo Sandbox,这是一个可以在单独的虚拟机(VM)上自动模拟文件的开源系统。

使用Cuckoo Sandbox的一般结果是它从恶意软件中收集各种测量值并运行分析,然后将其作为详细报告显示。我们使用这种工具的主要重点是了解恶意软件的行为并衡量它对受害者机器的影响。

目前,Cuckoo系统只有几个传统VM框架(如VirtualBox和VMware)的集成(AKA Machineries)。实际上,虽然运行云VM通常比传统VM更优越,但遗憾的是,Cuckoo的官方代码不包括任何基于云的环境的实现。

对这种情况不满意,我们开始编码,现在可以为云引入一个版本的Cuckoo Sandbox

 

Cuckoo Adaptation to the Cloud

使Cuckoo Sandbox适应云有许多优点:

  • 无需物理维护
  • 降低成本
  • 更大的灵活性
  • 灾难恢复选项

然而,最重要的好处是能够根据需要立即按比例放大或缩小。

想象一下几乎无限数量的并行机器,没有性能影响。例如,这可能在多个系统中是有益的,要求同时分析相同的不同恶意软件,并使Cuckoo-in-the-Cloud成为游戏规则的改变者。

由于官方Cuckoo存储库不包含任何云支持,我们开始在云环境中搜索Cuckoo机器的任何社区实现。最后,我们发现了一个原始的Cuckoo开发人员对“控制AWS [亚马逊网络服务] EC2实例”的查询回复

“如果你有兴趣来开发模块AWS的工作,特别是新  i3.metal  的事情,我们可以考虑一下。否则现在我将关闭这个问题,因为我们对实现它没有多大兴趣(无论如何,Cuckoo在裸机上工作得很好)。谢谢!”

我们决定接受挑战!

 

术语

在我们继续之前,因为这将是技术性的,让我们定义一些术语:

嘉宾 - 沙盒机器进行分析。

Nest - 控制和收集来宾的数据的主服务器。

机械 - 允许嵌套控制物理/ VM来宾的Python层。
(注意
:不同类型的VM环境必须使用其互补的机械)

EC2实例 - AWS中的虚拟机。

 - AWS EBS [弹性块存储]卷。卷是一个虚拟硬盘驱动器,可以连接到单个EC2实例。

 

目标

我们的目标是开发Cuckoo扩展以满足以下要求:

  • 能够提供和管理AWS实例。
  • 支持用户预定义的实例。
  • 支持使用新实例自动扩展,超出预定义实例。
  • 避免更改Cuckoo的主要代码 - 将其合并到主Cuckoo存储库中的更简单,更安全的方法。
  • 在合理的时间段内处理分析。

 

初步设计

我们的第一步是为EC2基本操作创建一个API包装器,这样我们就可以将EC2处理与其他支持Cuckoo的VM框架对齐。

例如,与传统的VM API不同,AWS API仅部分支持恢复计算机的原始状态,这在处理恶意软件时尤其重要。对于此类计算机,还原它需要用户停止它,删除旧卷,使用所需快照创建新卷,并将其与计算机关联。在这个例子中,为了方便起见,所有这些行动都捆绑成一个单一的动作在API封装恢复机器。

一旦我们编写了API包装器,创建新的AWS机制来控制现有实例变得更容易。

但是,我们仍然需要解决利用云的弹性来创建自动扩展基础架构的目标。任何其他Cuckoo机器中都不存在此功能,从而进一步增加了此任务的复杂性。

在所有预先配置的机器都被占用的情况下,我们的机器将通过创建新机器并将它们添加到Cuckoo内部数据库(DB)来立即扩展。然后,预先配置的机器可用于每次运行Cuckoo,但新机器将在使用后终止。

为简化起见,用户可以选择准备(但不必)任意数量的预配置计算机,其中唯一必须安装的机器是主要的Cuckoo嵌套。

我们需要处理的一个限制是,从机器的DB中添加或删除VM不是Cuckoo机器的典型行为。为了解决这个问题,类似于我们对API包装器的处理,我们创建了一个额外的数据库组件来处理机器的删除。

fig1.jpg

获取机器 - 使用任务锁定一台机器的操作(机器变得不可用)。

配置 - 包含用户为Cuckoo系统预定义的计算机数量的配置(它们将在每次运行Cuckoo时可用)。

 

最终设计

我们根据初始设计开发了这种新机器,并开始进行测试。它工作正常,但不符合一个非常重要的要求,速度,因为处理时间大约需要8分钟。这远远超出了单一分析的合理时间(与VirtualBox相比)。

由于EC2实例的性质,它不能跳过OS初始化阶段。因此,操作系统启动和Cuckoo分析时间都会消耗创建Cuckoo报告的时间。

为了提高性能,我们需要进行特殊更改:使用户能够配置准备执行任务(启动和运行)的计算机数量。

用户定义池的大小,该池包含已提前启动的计算机。每当池中的计算机启动任务时,系统将启动新计算机并将其添加到池中。因此,对于用户的请求总是存在恒定数量的就绪机器。

杜鹃将把这个游泳池视为可用的机器,并将选择最旧的游泳池。因此,需要处理新任务的机器可能会立即准备好处理任务。

fig2.jpg

X - 用户给出的参数,表示应该启动并准备好处理任务的机器数量。这不一定必须等于任务数量。

在Initializati on 之前 - 在初始化过程开始之前已启动并准备好执行任务的机器(X)的数量。

 获取机器 - 使用任务锁定一台机器的操作(机器变得不可用)。

配置中的可用计算机 - 不一定启动并运行但可在我们的配置中启动的计算机。

 

我们来看看以下用户场景。Alice通常有34个并行执行的任务,因此当她初始化她的Cuckoo系统时,她预先配置了34台机器(除了强制性的Cuckoo嵌套)。Alice的配置包含34台机器+ Cuckoo巢。

有一天,Alice有52个应该同时执行的任务,所以她想拥有52台可用且已经启动的机器。她将机器池的大小定义为52,并设置X = 52.在系统初始化之前,机器将创建另外18台机器并启动它们。在这18台机器执行Alice的任务后,它们将被终止。剩余的预配置34台机器将恢复到其原始状态。

第二天,爱丽丝一次只能完成16项任务。她设置X = 16.在“初始化前”阶段,预先启动只有16台机器(预先配置的34台机器)。

因此,Alice能够以极佳的性能并行执行所有任务,而不会浪费任何昂贵的资源。

 

下一步是什么?

亚马逊刚刚发布了针对Linux系统的休眠选项。在停止操作期间,它将保存实例内存中的内容。启动实例时,卷将恢复到先前的状态,重新加载RAM内容,并恢复先前在实例上运行的进程。一旦它在Windows系统上可用,利用这一重要功能可能非常有利于缩短启动时间。

目前,该机器在单个子网上创建新机器。但是,单个子网是有限的,如果溢出可能会导致错误。支持多子网将解决此类问题。

这项任务对我们来说是一个巨大的挑战,我们计划继续更新这个项目的更多功能,因为我们相信这可能对我们社区中的许多人有益。恶意软件,要小心!

单击此处访问Cloud存储库的Cuckoo SandBox



发表评论 / Comment

用心评论~