LASTLINE
袁师兄对标的是FireEye和Lastline。
摘要
恶意代码(或恶意软件)被定义为满足攻击者故意有害意图的软件。 恶意软件分析是确定给定恶意软件样本(例如病毒,蠕虫或特洛伊木马)的行为和目的的过程。 该过程是能够开发有效检测技术和去除工具的必要步骤。 目前,在大多数公司中,恶意软件分析主要是手动过程,这是一个繁琐且耗时的过程。 为了缓解这个问题,许多公司已经开始使用和推广分析工具,这些工具通过在受限环境中执行并记录调用的操作系统调用来自动提取未知程序的行为。
动态分析工具的问题是仅观察到单个程序执行。然而,遗憾的是,某些恶意行为可能仅在特定情况下(例如,在特定日期,当存在某个文件时,或者在接收到某个命令时)被触发。在研究人员Andreas Moser博士,Christopher Kruegel博士和Engin Kirda博士在2007年5月于加利福尼亚州奥克兰举行的IEEE安全和隐私会议上提出的一篇着名的开创性科学论文中,作者提出了一个允许的系统我们探索多个执行路径并识别仅在满足某些条件时执行的恶意操作。这使他们能够自动提取正在分析的程序的更完整视图,并确定在何种情况下执行可疑操作。他们的实验结果表明,许多恶意软件样本根据从环境读取的输入显示不同的行为。因此,通过探索多个执行路径,他们可以获得更完整的行动图。本文的两位合着者,Kruegel博士和Kirda博士是Lastline的联合创始人。在本白皮书中,我们给出了该科学工作的执行摘要,并使用了该论文的摘录。有关多路径探索论文的更详细概述,请参阅完整的论文,该论文可在http://www.lastline.com/papers-/IEEE_SP_2007_explore.pdf上找到。
Lastline构建了新颖和改进的工具,这些工具在概念上类似于科学的多路径勘探工作,但在实践中更有效和有效。 请注意,与竞争对手相比,处理试图逃避检测的恶意软件样本是Lastline分析技术的重要主要特征之一。
Introduction
分析未知程序行为的传统方法是在受限环境中执行二进制文件并观察其操作。受限制的环境通常是一个调试器,由人工分析师用来手动单步执行代码以了解其功能。不幸的是,反恶意软件公司每天都会收到多达数十万个新的恶意软件样本。显然,无法完全手动执行这些恶意软件样本的分析。
遗憾的是,当前的分析系统也存在明显的缺点:它们的分析仅基于单个执行跟踪。也就是说,他们的报告仅包含在特定时间点在特定测试环境中运行样本时观察到的交互。不幸的是,这种方法有可能错过程序在不同情况下可能表现出来的很大一部分行为。
恶意软件程序经常包含检查,用于确定计算机上是否存在某些文件或目录,并且只在它们执行时运行部分代码。其他要求建立与Internet的连接或者不存在特定的互斥对象。如果不满足这些条件,恶意软件可能会立即终止。这类似于检查虚拟机环境的指示的恶意代码,如果存在这样的指示则修改其行为以便使其在虚拟环境中的分析更加困难。每次运行时未调用的其他功能是恶意软件例程,这些例程仅在特定日期或某个时间执行。例如,Bagle蠕虫的一些变体包括一个检查,它会在某个日期之后完全停用蠕虫。另一个例子是米开朗基罗病毒,它大部分时间都处于休眠状态,只在3月6日(这是米开朗基罗的生日)提供有效载荷。当然,功能也可以由其他条件触发,例如用户名或本地网络接口的IP地址。最后,某些恶意软件会侦听某些必须在启动活动之前通过控制通道发送的命令。例如,自动登录到IRC服务器的机器人通常会监视通道以获取触发某些有效负载例程的关键字列表。
当如在当前工业分析系统中从单次运行确定程序的行为时,可能无法观察到许多先前提到的动作。这可能导致人类分析师对某个样本的风险得出错误的结论。更糟糕的是,当代码在早期检查时失败并立即退出时,生成的报告可能根本不会显示任何恶意活动。解决此问题的一种可能性是尝试增加测试覆盖率。这可以通过在不同环境中运行可执行文件来完成,可能使用各种操作系统版本,已安装的应用程序和数据/时间设置。不幸的是,即使在虚拟机的帮助下,创建和维护这样的测试系统也是昂贵的。此外,对每个样本执行数百次测试效率不高,尤其是因为许多环境变化对程序执行没有影响。此外,在恶意代码期望某些命令作为输入或检查非标准文件的存在(例如,先前利用可能已经创建的文件)的情况下,实际上不可能触发某些动作。
在Lastline,基于Moser等人的概念性工作。并且原型的完全重新实现,我们使用解决方案来解决测试覆盖问题,并允许自动恶意软件分析系统生成更全面的报告。基本思想是我们探索被测程序的多个执行路径,但是通过监视代码如何使用某些输入来驱动对不同路径的探索。更确切地说,我们动态跟踪程序读取的某些输入值(例如来自操作系统的当前时间,文件内容或检查Internet连接的结果)并识别执行中输入的点用于制定控制流程决策。当识别出这样的决策点时,我们首先创建程序执行的当前状态的快照。然后,允许程序沿着一个执行分支继续,具体取决于实际输入值。稍后,我们返回快照并重写输入值,以便获取另一个分支。这允许我们探索两个程序分支。此外,我们可以确定执行某些代码路径的条件。 举一个简单的例子,考虑一个检查文件是否存在的程序。在执行期间,我们跟踪检查该文件是否存在的操作系统调用的结果。当该结果稍后由程序在条件分支中使用时,我们存储当前执行状态的快照。例如,假设文件不存在,程序快速退出。此时,我们将进程回退到先前存储的状态并重写结果,以便报告文件的存在。然后,我们可以探索程序在文件存在的情况下执行的操作。 我们为Microsoft Windows开发了一个系统,允许我们动态执行程序并跟踪它们读取的输入。该系统允许我们查看竞争对手分析系统看不到的恶意软件隐藏功能。
SYSTEM OVERVIEW
为了解决单个执行跟踪通常只产生完整程序行为的一部分的问题,我们的分析工具已经扩展,具有探索多个执行路径的能力。目标是获得许多不同的执行路径,并且每个路径可能揭示在其他跟踪中无法观察到的某些特定行为。分支点的选择 - 即程序执行中对两个备选延续都感兴趣的点 - 基于程序处理输入数据的方式。更确切地说,当控制流决策基于先前通过系统调用读取的某个输入值时,程序采用一个分支(这取决于具体检查的结果)。此时,必须提出以下问题:如果输入是采用了另一个分支,则可以观察到哪种行为?
为了回答这个问题,标记了程序感兴趣的某些输入,并且动态地跟踪它们在执行期间的传播。系统监视过程移动和操纵这些输入值的方式。每当检测到基于标记值的控制流决定时,存储过程地址空间的当前内容。然后,执行继续正常。当该进程稍后希望终止时,它将自动重置为先前存储的快照。这是通过用先前存储的值替换进程地址空间的当前内容来完成的。此外,系统重写控制流决策中使用的输入值,以便反转该决策的结果。然后,该过程继续沿着另一个分支执行。当然,可能遇到连续多个分支。在这种情况下,通过以深度优先顺序选择连续点来探索执行空间。
有关如何探索程序的多个执行路径的示例,请考虑图1.请注意,虽然此示例以C代码显示(以便更容易理解),但我们创建的系统类似于Moser的系统等,直接在x86二进制文件上工作。执行程序时,它首先接收一些输入并将其存储到变量x(第1行)。请注意,因为x被认为是有趣的,所以它被标记。假设在这个具体的运行中,存储到x中的值是2.在第2行,它被比较为0.此时,系统检测到涉及标记数据的比较操作。因此,创建了当前进程的快照。然后,允许该过程继续。因为满足条件,所以采用if-branch并记录x必须大于0的事实。在第3行,下一次检查失败。但是,由于比较再次涉及标记数据,因此会创建另一个快照。这一次,进程在else分支上继续,并且即将调用exit。因为仍有未探索的路径(即,存在两个尚未访问的状态),所以该过程恢复到先前的(第二个)状态。系统检查第3行的比较并尝试重写x以使检查成功。为此,必须遵守附加约束x> 0。这会产生x等于1的解.x的值更新为1并重新启动进程。这次,调用第4行的print语句。当进程即将在第5行退出时,它将重置为第一个快照。这次,系统搜索未通过第2行检查的x的值。因为没有x的附加约束,所以选择任意的非正整数,并且该过程沿着else分支继续。这次,允许退出调用,并且分析过程终止于报告,该报告指示在输入x为1(但不是0或2)的条件下发出了对打印的调用。
一致的内存更新。不幸的是,当重写某个输入值以探索替代执行路径时,通常不足以改变控制流决策所使用的单个存储器位置。相反,有必要一致地更新(或重写)进程地址空间中与输入相关的所有值。原因是原始输入值可能已被复制到其他存储器位置,甚至被程序用作以前计算的一部分。仅修改输入的单个实例时,原始值的副本可能保留在程序的数据部分中。这可能导致执行无效操作或探索不可能的路径。因此,每当重写输入值时,必须保持程序状态一致并适当地更新输入的所有副本,以及涉及该值的先前操作的结果。此外,在为特定输入选择替代值时,我们可能没有完全的自由度。例如,在先前的比较操作中可能已经使用了输入,并且在选择可以在分支点处恢复控制流决策的值时需要观察所得到的约束。甚至可能没有有效的替代值可以导致探索替代路径。因此,为了能够一致地更新和输入及其相关值,有必要跟踪哪些存储器位置取决于某个输入以及它们如何依赖于该值。
结论
为了处理试图逃避分析并具有基于触发器的功能的恶意软件,Lastline开发了一个系统来探索Windows可执行文件的多个执行路径。目标是获得未知样本可以执行的操作的更全面的概述。此外,该工具还会自动提供触发恶意操作的信息。
与Moser等人的工作类似,我们改进和重新实现的系统通过跟踪程序如何处理有趣的输入(例如,本地时间,文件检查,从网络读取)来工作。特别是,我们动态检查条件分支指令,其结果取决于某些输入值。当遇到这样的指令时,创建当前执行状态的快照。当程序稍后沿第一个分支完成时,我们将其重置为先前保存的状态并修改条件的参数,以便获取另一个分支。执行此重写操作时,必须始终更新与参数值相关的所有内存位置。这是防止程序执行无效或不可能路径所必需的。 请注意,多路径探索是竞争分析引擎无法提供的Lastline可执行分析的主要功能。与竞争对手相比,此功能允许Lastline查看更多恶意行为。