简单的活着

SandboxEvasionSurvey

Posted on By Mista Cai

VMRay沙箱逃逸

Part 1

这篇文章是当前恶意软件使用的沙箱逃逸技术系列的第一部分。在入门之后,将在后续文章中深入探讨三种主要类别逃逸技术的详细信息。

使用恶意软件分析沙箱作为抵御APT的银弹,十多年前就开始流行起来。当时,恶意软件作者已经找到了基于静态分析(例如传统的防病毒软件产品)使用多态,变质,加密,混淆和反向保护等技术来规避工具的方法。因此,恶意软件分析沙箱现在被认为是抵御高级威胁的最后一道防线。

沙箱的操作原理很简单 — 根据在受控环境中观察到的行为来确定文件是否是恶意的。沙箱允许恶意软件执行其所有恶意操作并记录生成的行为。一段时间后,停止分析并检查结果并扫描典型的恶意行为模式。由于检测不是基于签名,因此沙箱甚至可以检测零日和目标恶意软件(安全研究人员以前从未见过或在防病毒实验室中进行过分析)。

显然,基于行为的恶意软件检测只有在观察到的文件在分析过程中实际执行恶意操作时才有效。如果 - 无论出于何种原因 - 在分析过程中没有执行任何有害操作,沙箱会得出结论认为正在检查的文件是良性的。恶意软件作者总是通过隐藏恶意软件的真实行为来寻找新的创新方法来逃避沙箱检测。我们将这些方法分为三类:

  • 沙箱检测:检测沙箱的存在(并且仅在检测时显示良性行为模式)
  • 沙箱漏洞:利用沙箱技术或生态系统中的弱点或差距
  • 条件触发:使用基于时间/事件/环境的触发器(在沙箱分析期间未激活)

沙箱检测

第一种方法是通过查找沙箱环境和真实受害者系统之间的微小差异来检测沙箱的存在。

如果检测到沙箱,恶意软件通常会以两种不同的方式作出反应:

  • 它立即终止(这本身就是可疑的),
  • 或者它显示非恶意行为并且只执行良性操作。

这里分析了一个例子,其中样本:

  • 尝试检测它是否在虚拟机(VM)内运行
  • 查看是否有应用程序沙箱运行(在此Sandboxie中)

可以在VMRay威胁标识符(VTI)详细信息中看到这一点,该详细信息显示VMRay识别出沙盒检测尝试并将此行为评为高度恶意。

沙箱漏洞

第二种方法直接攻击并利用底层沙箱技术或周围生态系统中的弱点。

例如,我们最近看到大量恶意软件在内部使用Microsoft COM,因为大多数沙箱无法正确分析此类示例。 其他恶意软件将使用沙盒无法处理的模糊文件格式,或者它们利用沙箱无法处理超过特定大小的文件。

我们在这里发布了一个示例,其中恶意软件试图“使监视器变得模糊” — 也就是说,通过执行非法的API使用来逃避分析。 这可以是一种有效的方法来隐藏依赖于注入目标机器的钩子或驱动程序的分析器。 但是,由于VMRay不使用挂钩,因此检测到逃逸尝试并对其进行评分。

条件触发

第三类代表不会尝试检测或攻击沙箱的恶意软件。 相反,它利用了这种自动化系统的自然缺点。 由于大多数环境中出现大量独特的恶意软件,沙箱分析系统通常只在每个文件上花费几分钟。 因此,通过将恶意有效载荷的执行延迟一定时间,恶意软件可以保持不被发现。 除了时间触发器,恶意软件还可以使用通常不会出现在沙箱中的其他事件,例如: 系统重启或用户交互。 或者,恶意软件可能正在寻找预期目标机器上存在的特定工件,本地化设置等,例如我们在此讨论的应用程序。

在这个例子中,我们看到一个分析,其中除了试图检测VM环境之外,恶意软件还参与了“持久性”,安装启动脚本和应用程序以便在重启时生存。

Part 2

之前的文章介绍了沙箱逃逸技术分为三类:

  • 沙箱检测:检测沙箱的存在(并且仅在检测时显示良性行为模式)
  • 沙箱漏洞:利用沙箱技术或生态系统中的弱点或差距
  • 条件触发:使用基于时间/事件/环境的触发器(在沙箱分析期间未激活)

在这篇文章中,我们将深入探讨第一类沙盒逃避技术的更多细节:当恶意软件专门检测到沙箱的存在并切换到良性行为时。

第一种方法是通过查找沙箱环境和真实受害者系统之间的微小差异来检测沙箱的存在。 如果检测到沙箱,恶意软件通常会以两种不同的方式作出反应:它立即终止(这本身就是可疑的),或者它显示非恶意行为并且只执行良性操作。

检测沙箱的存在

有很多技术可以识别沙箱的存在。一旦沙箱被检测出,恶意软件会有不同的反应。

最简单的就是立即终止,这会引起一个红色警告,因为这不是正常良性程序的行为。

另一个操作是显示虚假错误消息。 例如,恶意软件可能会显示某个系统模块丢失或可执行文件已损坏的消息。

更复杂的恶意软件可能会执行一些良性操作来隐藏真实意图。

通过深入研究真实恶意软件使用的不同技术,检测它是否在沙箱中执行:

  • 检测虚拟化/管理程序

这是最古老的逃避技术之一。 但是,它现在不太重要,因为无论如何许多生产环境(工作站和服务器)都是虚拟化的,而虚拟机(VM)不再仅仅被研究人员和恶意软件分析师使用。

  • 最早的方法是检测由于缺乏对虚拟化(半虚拟化)的完全硬件支持而存在的技术工件。 技术包括:
    • 检测流行的VM管理程序的工件,例如, VMWare(“端口0x5658”)或Virtualbox通过后门(“无效操作码”)。
    • 检测通用管理程序工件:最著名的是redpill(“IDTR无法虚拟化”)

这些技术今天不是很有效。 借助硬件虚拟化支持,VM内部的可见工件(如果有)非常少,因为大多数硬件方面现在都由CPU本身进行虚拟化处理。 因此,它们不必由管理程序模拟。

  • 目前仍然相关的另一种方法是检测管理程序的实现工件
    • 例如:从MAC地址,设备ID或CPU ID显示供应商,或者从内存中存在某些进程,文件,驱动程序,注册表项或字符串

我们发布了两个分析,演示了几种类型的虚拟化检测。 在第一个中,我们看到尝试检测恶意软件是否在VirtualPC内运行,这里.

另一种方法是通过查看注册表值来检测VM的存在。 在此示例中,恶意软件查询注册表项HKEY_LOCAL_MACHINE\HARDWARE\Description\System以查找与VMWare等常见VM实施相关的值.


  • 检测沙箱工件

在这种方法中,恶意软件试图检测的不是虚拟机管理程序,而是沙箱本身。这可以通过以下方式完成

  • 使用与以下相关的供应商特定信息

    • 常见的VM产品。例如,某些文件,进程,驱动程序,文件系统结构,Windows ID,用户名等的存在。
    • 生态系统。例如,机制:
      • 感染后将分析环境恢复到干净状态:Deepfreeze,Reborn Cards
      • 与沙箱控制器进行通信:附加侦听端口,特定网络环境(主服务器,……)
  • 使用某些沙盒技术进行检测:

    • 大多数沙箱使用钩子,即它们在分析系统内注入或修改代码和数据。 ‘hook’本质上是一个填充进程,驱动程序和操作系统之间通信的填充层。钩子可以通过多种方式实现,例如:内联钩子,IAT,EAT,代理DLL,过滤器驱动程序等。这使得它们可以通过以下方式检测到:
      • 明确检查某些指令或指针,或通过
      • 验证系统的完整性,例如验证相关系统文件的哈希签名
    • 一些沙箱使用仿真,与本机系统相比,它具有副作用和小的差异,例如不同的指令语义,基于缓存的攻击等。可以通过例如调用未包括在仿真中的模糊CPU指令来检测仿真间隙。当调用失败时,恶意软件将知道它正在模拟环境中运行。

    特定于供应商的检测示例是恶意软件查找模块“SbieDll.dll”的存在 - 这是一个指示它将在Sandboxie下运行,这是一个常见的沙盒环境。


  • 检测人工环境

沙箱通常不是生产系统,而是专门针对恶意软件分析而设置的。因此,它们与真实计算机系统不同,并且恶意软件可以检测到这些差异。差异可能包括:

  • 硬件属性:屏幕分辨率异常小,没有USB 3.0驱动程序,缺乏3D渲染功能,只有一个(V)CPU,小硬盘和内存大小
  • 软件属性:非典型软件堆栈,例如没有IM,没有邮件客户端
  • 系统属性:正常运行时间(“系统在10秒前重启”),网络流量(“系统正常运行时间是几天,但只通过网络传输了几MB”),没有或只安装了默认打印机
  • 用户属性:清理桌面,清理文件系统,没有cookie,没有最近的文件,没有用户文件

为了演示,我们将回到我们在图2中看到的相同分析。除了检查VM存在之外,恶意软件还在寻找Wine,一个软件模拟器(即它模拟Windows功能,而不是CPU仿真)。我们可以在VTI评分中看到恶意软件正在进行查询,GET_PROC_ADDRESS并尝试从返回的结果中确定它是否在Wine环境中。


  • 基于时序的检测

监视应用程序的行为会带来时间损失,可以通过恶意软件来测量,以检测沙箱的存在。 沙箱试图通过伪造时间来防止这种情况。 但是,恶意软件可以通过合并外部时间源(如NTP)来绕过此问题。 基于时序的检测的一个示例是此示例,当分析检查rdtsc时,时间戳计数器。

没有检测的沙箱

为了逃避恶意软件的这些类型的检测,分析环境应该:

  • 不依赖于修改目标环境。
    • 特别是,沙箱分析的常用方法是挂钩。钩子的存在(注入用户模式或内核级驱动程序,监视和拦截API调用和其他恶意软件活动)是恶意软件的标志。几乎不可能完全隐藏钩子的存在。
  • 要么完全实现完整的系统仿真,要么完全不实现。
    • 虽然从理论上讲,完美实现的仿真环境很难被发现,但这是一项复杂的工作。正如所有软件都有错误一样,几乎可以确定任何给定的仿真环境都会有可以检测到的漏洞。
  • 使用“真实”的目标分析环境。
    • 如果沙箱分析器可以运行从实际生产端点复制的映像,则检测风险会急剧下降。正如我们之前所写,将环境随机化与环境相结合有助于确保恶意软件没有任何迹象表明目标环境是“假的”

VMRay基于无代理管理程序的方法可确保恶意软件的攻击面最小,以检测它是否在沙箱中运行。通过不修改目标环境,不依赖于仿真,并允许真实图像作为目标环境运行,VMRay不会将恶意软件标记为沙箱环境。

Part 3

老规矩,先放分类

  • 沙箱检测:检测沙箱的存在(并且仅在检测时显示良性行为模式)
  • 沙箱漏洞:利用沙箱技术或生态系统中的弱点或差距
  • 条件触发:使用基于时间/事件/环境的触发器(在沙箱分析期间未激活)

我们写道,使用恶意软件分析沙箱作为防御高级持久威胁的银弹在十多年前开始流行起来。当时,恶意软件作者已经找到了基于静态分析(例如传统的防病毒软件产品)使用多态,变质,加密,混淆和反向保护等技术来规避工具的方法。基于行为检测的恶意软件分析沙箱现在被认为是防御高级威胁的最后一层。

显然,基于行为的恶意软件检测只有在观察到的文件在分析过程中实际执行恶意操作时才有效。如果 - 无论出于何种原因 - 在分析过程中没有执行任何有害操作,沙箱会得出结论认为正在检查的文件是良性的。在本系列的第二部分中,我们深入探讨了恶意软件如何直接检测沙箱环境的存在。

在这篇文章中,我们将了解恶意软件如何利用沙箱环境中的漏洞,而不是明确检测沙箱的存在。

利用沙盒技术的弱点

在分析期间,可以将显式搜索沙箱的存在检测为可疑活动。 因此,针对恶意软件的更高级方法利用沙盒技术中的弱点来执行操作而不被检测到。 通过利用这些沙箱弱点,恶意软件即使在沙盒系统中执行也不必担心被检测到。 一些技术包括:

  • 使监视器变盲

大多数沙箱都进行客户监控,即它们在分析环境中放置代码,进程,挂钩等。如果撤消或规避这些修改,则沙箱会被蒙蔽 - 换句话说,对分析环境的可见性就会丢失。这种致盲可以采取以下形式:

  • 钩子去除 可以通过恢复原始指令或数据来删除挂钩
  • 勾断规避 可以通过使用直接系统调用而不是API,调用私有函数(未挂钩)或执行未对齐函数调用(跳过“挂钩代码”)来规避挂钩。我们可以在此分析报告中看到此示例,其中检测到恶意软件启动和危害explorer.exe和regedit.exe的非法API使用。虽然这个问题可以通过这些特定内部函数的钩子来解决,但操作系统中存在许多这些问题,并且它们随每个Windows版本而变化。此外,通过挂钩无法充分解决未对齐函数调用的问题。

  • 系统文件替换: 挂钩通常驻留在映射到内存的系统文件中。某些恶意软件会取消映射这些文件并重新加载它们。然后,新加载的文件版本将“取消挂钩”
  • 内核代码。许多沙箱无法监视内核代码或系统的引导过程:
  • 模糊文件格式:许多沙箱不支持所有文件格式 Powershell,.hta,.dzip等是文件格式的一些示例,可能会在沙盒环境中无法执行而无法执行。
  • 许多沙箱不支持所有技术。虽然初始感染向量(例如,带有宏的Word文档)可能会打开并且宏在沙箱中运行,但宏将下载并运行使用隐藏在分析中的模糊技术的有效负载。 COM,Ruby,ActiveX,JAVA是我们在之前的博客文章中分析过的一些例子。
  • 操作系统重启: 许多沙箱无法重新启动。某些系统尝试通过重新登录用户来模拟重新启动,但是可以检测到这种情况,并且不会执行重启的所有触发器。

  • 致盲生态系统

通过简单地压倒目标分析环境,恶意软件也可以避免使用这种粗略但有时有效的方法进行分析。 例如,

  • 某些沙箱仅支持一定大小的文件,例如 10 MB
  • 其他人不支持多个压缩层

将光照射到黑暗中

为了确保恶意软件无法通过这些方法逃避分析,沙盒分析环境应该:

  • 不依赖于修改目标环境。

特别是,沙箱分析的常用方法是挂钩。钩子(注入的用户模式或内核级驱动程序,监视和拦截API调用和其他恶意软件活动)的存在使恶意软件有机会禁用分析。

  • 将黄金图像作为目标分析环境运行。

为了提高效率和方便性,许多沙箱都采用“一刀切”的方式。所有分析都使用单一类型的目标环境。更好的方法是使用实际的黄金映像(即企业使用的标准和服务器操作系统和应用程序配置)作为目标环境。这样,您可以放心,任何针对您的企业并可以在您的桌面或服务器上运行的恶意软件也将在分析环境中运行。

  • 监控所有与恶意软件相关的活动,无论应用程序或格式如何。

一些沙盒分析器,特别是那些使用基于钩子的方法的沙箱分析器,为了确定监控哪些活动的效率而采取捷径和妥协。这可能会留下盲点。

VMRay的无代理管理程序方法适用于所有这些方案。当与使用真实VM映像作为目标分析机器一起使用时,VMRay Analyzer将提供对恶意软件活动的完全可见性,无论恶意软件是否试图模糊其意图。

Part 4

第三类

  • 沙箱检测:检测沙箱的存在(并且仅在检测时显示良性行为模式)
  • 沙箱漏洞:利用沙箱技术或生态系统中的弱点或差距
  • 条件触发:使用基于时间/事件/环境的触发器(在沙箱分析期间未激活)

上下文依赖/环境敏感恶意软件

使用基于时间/事件/环境的触发条件

第三种方法,如沙箱间隙开发,不会尝试检测沙箱。 它也没有试图通过规避沙箱或利用沙箱的弱点来隐瞒恶意行为。 相反,它会延迟/推迟其恶意有效负载,直到发生某个触发/事件。选择的触发器不太可能在沙箱内激活。 触发器可以分为四类:

  • 定时炸弹

最常见的技术之一是延迟执行一段时间,因为沙箱通常只运行样本几分钟。与许多其他逃避技术一样,时间炸弹的使用尤其是持续的猫捉老鼠游戏:恶意软件入睡,沙箱试图检测睡眠并缩短时间,恶意软件检测缩短时间,沙箱试图通过更新系统计时器隐藏时间等。 技术包括:

  • 简单到非常复杂的睡眠,例如,并发线程彼此观察或相互依赖。
  • 仅在特定时间或特定日期执行,例如,周一或上午12点或3月12日。
  • 显着降低执行速度,例如,通过注入数百万个任意系统调用,除了减慢执行速度之外没有任何影响,特别是在受监视或模拟环境中执行时。

例如,图1显示了Pafish测试,该测试运行VM检测某些工件,这些工件通常存在于分析环境中。 请注意时间戳检查。 恶意软件也将运行这样的检查,如果在计数器中发现差异,则假设它在分析环境中运行。


  • 系统事件
    • 仅在关机,重启后或有人登录或关闭时变为活动状态。
    • 图2显示了此示例,其中仅在重新启动后下拉第二阶段有效负载。 我们可以在VTI评分中看到恶意软件(初始有效负载)安装了可执行文件,该软件将在重新启动后在启动时自动运行。 这是启动过程中获取第二个有效负载。

  • 用户交互
    • 等待鼠标移动(但不是太快,因为这是沙箱)或键盘输入。
    • 与某些应用程序交互,例如,浏览器,电子邮件,Skype,在线银行应用程序。
    • 假安装程序:恶意软件仅在用户单击多个按钮并检查各种复选框后才会变为活动状态(参见图2)。
    • 具有恶意嵌入内容的Office文档:恶意内容仅在用户向下滚动(查看)或单击时才会变为活动状态。

  • 检测特定目标系统

复杂的目标恶意软件仅适用于预期的目标系统。标识通常基于当前用户名,时区,键盘布局,IP地址或一些其他系统工件。检查本身可以通过各种方式完成,从简单到非常复杂的方法。

  • 简单检查包括字符串检查。
  • 如果预期的目标环境未知,则复杂检查(例如,使用从环境设置获取的散列进行解密)几乎是不可破解的。

如果恶意软件确定它处于预期的目标环境中,则它将仅进入第二阶段(即下载主有效负载)。

与此相关的是反向场景,其中恶意软件检测到环境很可能是人工分析环境。这可能是检查的结果,例如:

  • 如果系统的网络使用情况统计信息太低,则不要执行任何操作
  • 如果“最近使用的文档”几乎是空的,那么不要做任何事情
  • 如果进程数<x,则不要执行任何操作。

结论

在我们发布的三类沙盒逃避技术中,上下文感知的恶意软件对底层沙箱分析技术最不敏感。随着分析技术的改进并找到绕过沙箱检测的方法,环境触发器对恶意软件作者将变得越来越重要。

因此,事件响应者和分析人员必须确保他们使用目标分析环境,准确地复制他们正在保护的实际桌面和服务器环境的每个细节。此外,正如我们之前所写,将伪随机属性作为目标分析环境的一部分非常重要。

运行相同标准目标环境的通用沙箱已不再足够。此外,分析环境需要能够检测环境查询并识别隐藏的代码分支。 VMRay Analyzer能够随机化分析环境,包括将桌面或服务器黄金映像用作目标时。此外,VMRay Analyzer将标记恶意软件何时进行环境查询。结合起来,这些可以确保分析师全面了解并了解他们何时处理上下文感知的恶意软件。