一. 沙箱技术实现特点

    (((本文仅仅讨论沙箱的逃逸技术问题,不涉及高大上的架构性问题及APT防御性问题,避免问题的无限扩大化。)))

用沙箱动态行为分析检测malware是近几年补充传统AV杀软的通用技术,但是各厂商对沙箱的实现方式和检测方案设计不尽相同,单纯从沙箱角度看,基本分为虚拟化和仿真模拟两大类,然后会在这两种的基础上加上内存分析或者多系统多沙箱联合分析,其中云查杀,信誉,流量检测等本文暂且不谈,后续有精力再说。

所谓虚拟化基本就是利用虚拟机技术对恶意样本进行执行,同时通过HOOK系统API的形式进行监控恶意样本的行为动作进行恶意判定,这种HOOK系统API的方式,说的简单点就是我们只能看到关键CALL,但是对CALL中间的指令上下文信息是看不到的,这也就是说纯虚拟化的沙箱容易被识别和绕过。(当大家对未来云虚拟技术的发展背景下,这种虚拟机逃逸样本的发展趋势持怀疑态度的时候,要切记病毒软件的逃逸的重点是防止被检测和分析,虚拟机的检测只是特定的场景,换句话说应该理解为恶意样本的虚拟机的检测其实是为了逃避分析和沙箱检测)。

仿真模拟沙箱基本分为操作系统级的模拟和CPU&内存模拟仿真这两种,该类型沙箱是一种指令级别监控,能够全面掌握恶意代码的执行过程,但是这种类型的沙箱实现要求的难度较大,而且很难做到仿真的全面性和真实性,而且执行效率可能会存在问题。

二. 沙箱逃逸技术

无论是哪种沙箱技术,总归无法和真实环境比拟,所以沙箱逃避技术在高级别病毒样本已经普遍存在,并且逃避技术也在逐渐更新,下面总结下当前的逃避技术,我分为两个特点进行分析,一种是针对虚拟机检测的,一种是针对沙箱分析环境特点的对抗:

  1. 一. 针对虚拟机的检测
  2. 利用虚拟机的特殊环境指纹信息

虚拟机是对真实系统的模拟,但是在其环境中,留下了很多虚拟机的指纹信息

注:不同的虚拟机会存在一些差异,请举一反三地理解

比如:

(1)注册表信息

比如在vmware的虚拟机中,在注册表中搜索”vmware”字样,可以得到特别多的键值

病毒文件会在执行开始去RegOpenKeyExA()对应的虚拟机注册表键值,如果返回为非0,

则说明在虚拟机环境中。

尤其是注册表中硬件信息,经常被病毒检测使用的:

HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/services/Disk/Enum

或者直接检测IDE/DISK  会有QEMU,vbox,vmware,virtualhd的字样等等,这种检测技术在样本中很常见。

(2)进程信息

在虚拟机启动后,进程列表可以看到部分虚拟机的进程存在

病毒样本常会遍历的虚拟机进程有:

"VBoxTray.exe"
"VBoxService.exe"
"VMwareUser.exe"
"VMwareTray.exe"
"VMUpgradeHelper.exe"
"vmtoolsd.exe"
"vmacthlp.exe"

(3)特殊文件信息

比如典型的虚拟机驱动sys文件会被病毒样本遍历

比如GetFileAttributeA()执行

c:/windows/system32/drivers/winmouse.sys

如果返回-1说明不存在该文件,否则样本就不再执行了。

(4)虚拟机硬件信息

虚拟机的网卡信息会有固定指纹

MAC地址:

00:05:69:xx:xx:xx VMware
00:0C:29:xx:xx:xx VMware
00:1C:14:xx:xx:xx VMware
00:50:56:xx:xx:xx VMware
00:15:5D:xx:xx:xx Hyper V
00:16:3e:xx:xx:xx Xen

(5)安装的系统环境信息,比如卷信息

比如有病毒样本就会通过kernel32.getvolumeinformationA查询系统卷信息,因为虚拟机的各个操作系统分区是从宿主机复制过来的,就存在各个卷信息相同的情况,而且如果黑客掌握了某款沙箱产品固有操作系统的卷信息指纹,也就很容易逃避过去。

(手工可以在cmd下用wmic.exe volume查看)

  1. 利用虚拟机的指令的特殊性的逃逸

下面四种技术在虚拟机和反调试对抗中也占据了较大的比例

(1)vmware虚拟机通信端口指令

mov eax, 'VMXh';
mov ecx, 10; // "CODE" to get theVMware Version
mov edx, 'VX'; // Port Number
in eax, dx; // Read port, On return EAXreturns the VERSION
cmp ebx, 'VMXh'; // is it VMware

在病毒样本中,会通过上述指令来判断,如果是vmware虚拟环境,上述的in指令才能正常执行,否则会造出异常,病毒样本就可以走异常分支执行真正的恶意代码,在某视频中被提示不能在虚拟机中运行,发现就存在该段代码。

(2)利用LDT和GDT

虚拟机中的LDT(本地描述符表)和GDT(全局描述符表)和真实环境是有不同的,也是基于IDT (中断描述符表)检测(redpill检测虚拟机技术)的一种改进版,LDT,GDT的基地址是保存在相应的LDTR和GDTR寄存器中,只有当LDT基地址于0x0000(只有两个字节)时为真实机器,而GDT的基址为0XFFXXXXXX情况说明为虚拟机。

(3)利用STR的检测

STR指令用于将任务寄存器TR中的段选择器存储到到目标操作数中,当STR读取的地址等于0x0040xxxx时说明在虚拟机中,否则为真实主机

(4) 利用时间差

通过执行特定代码,比较虚拟机和真实主机的运行时间来判断是否位于虚拟机中,比如RDTSC指令将计算机启动以来CPU运行周期存在到EDX:EAX中,由于虚拟机是模拟系统,所以一条指令在虚拟机中执行的时间要长过真实主机,比如利用交换指令xchg。

  1. 二. 针对沙箱技术特点的技术性逃逸
  2. 关于时间

沙箱执行分析一个样本的时间是有限的,所以一部分样本就采取了sleep类的绕过方法,但是sleep的方式有很多种。

(1)Sleep函数的调用

SleepEx(), NtDelayExecution(),  PDF 的JS函数setTimeout(),比如Trojan Nap病毒

但是现在好多沙箱会对sleep函数进行修改,比如强制修改成1S,但是如果样本加以对时间的判断,那一样会跑不出行为。

(2)Stalling code 循环函数代码,用来占用时间

这种函数的比较典型的特点就是函数成结构独立性,一般不具有跳转的结构,这种在指令级的沙箱就会占据优势,比如据lastline说其指令级的沙箱就可以处理该问题,典型病毒W32.DelfInj,借用一下lastline的图如下。

(3)根据时间条件选择性触发

GetLocalTime() 获取时间, 比如Trojan Hastati 只有在特殊时间才会触发,如果不满足触发时间,就会循环sleep

2.关于交互

由于真实环境是有人的点击或者其他动作的,一般的沙箱环境不存在这种交互的动作,有些恶意样本,充分利用这点,

(1 比如有鼠标click被捕获到的时候,才会联通C&C,比如 :

UpClicke病毒,SetWinodwsHookExA using0Eh as a parameter value. This setting installs   the Windows hook procedure WH_MOUSE_LL, usedto monitor low-level mouse inputs.当恶意样本捕获到upclick(点击释放)的时候才会执行恶意代码部分。

BaneChant病毒,监听三次以上的click动作,才会执行恶意动作

(2 故意弹出窗口,只有用户点击确定按钮,才会执行恶意动作

比如EXE或者DLL执行messagebox函数,Adobe PDF中利用JS脚本,执行app.alert()方法,然后当用户点击OK,之后,在调用app.launchURL()打开恶意链接。

(3 监视短时间内鼠标的移动范围,通过GetCursorPos获取鼠标位置,移动快的被病毒标识为沙箱环境

(4有RTF文档,要滚动到第二页之类的才能执行样本

(5 判断鼠标的移动,当不停在移动,或者不移动时候,都认为在分析环境中,样本不执行,还有类似的对窗体的判断等等。

  1. 关于沙箱本身的特性

(1)样本执行开始,首先去访问链接地址,甚至是下载东西,一是可以验证网络联通性,二是因为沙箱环境是不是联网状态,如果网络畅通,然后才会执行真正的恶意部分,比如chinad就会利用这个特性会访问baidu,还有比如大名鼎鼎的蠕虫conficker。

(2)利用rootkit的典型特点,隐藏进程,利用PsSetCreateProcessNotifyRoutine(监控系统的创建和删除)这个系统的回调函数API进行remove掉所有的回调函数,导致监控失灵

(3)判断文件被执行时候的名字,GetModuleFilenameW()获取执行文件的路径,可检测方式可以通过样本中存入的沙箱常用的名字做对比,比如sample这个名字,个人认为如果样本本身名字固定的话,或者有特殊字符存在,还是跟自身的名字对比,绕过的成功率更高。

(4)重启再启动,用重启后才执行恶意的方式逃避沙箱

(5)DLL检测,会对加载DLL的执行文件进行hash校验,如果仅仅通过load或者run32dll.exe的方式,会被检测出来。

  1. 关于猥琐构造技巧

(1)首先利用探针收集部分应用的版本信息(flash:$version,PDF:app.viewerVersion)版本不符合,不执行,因为毕竟沙箱等环境是有限的。

(2)内嵌方式,比如在图片或者FLASH等等文件里,嵌入加密的PE文件,注意这不是shellcode的方式,仅仅是作为数据的传输载体,在机器上已经有其他样本在等待这些加密数据

  1. Filelessmalware样本的出现

该类样本为的就是为了逃避关于文件级的检测方法,样本执行以后直接将恶意shellcode写在注册表键值里,并且利用系统本身的powershell执行,这种情况下有内存分析模块,就显得尤为重要了。比如Phasebot病毒,首先将shellcode写入

HKEY_CURRENT_USER/Software/Microsoft/ActiveSetup/Installed Components/{Bot GUID}

将采用Rc4Encoded32 和Rc4Encoded64加密后的shellcode写入到上述键值中,然后写入javascript脚本键,然后调用powershell进行执行脚本操作,才会有恶意动作出来,比如释放文件到启动目录,然后通过NtQueryDirectoryFile API的方式隐藏文件,通过NtReadVirtualMemory的方式隐藏进程,这种样本或许逃逸不出我们的沙箱,但是这种fileless类型的攻击会更加进步和常见,或者采用数据流的攻击方式。

  1. 三. 总结

以上提出的对抗技术,有些确实是当前单纯靠沙箱设备无法解决的,有些是猥琐的构造绕过技巧,逃逸技术五花八门,新的手段层出不穷,同时每一种对抗技术并不是都能第一时间获取样本供分析研究,所以看完本文并不一定有什么卵用,攻防就是这么现实。

绕过与反绕过技术说到底是还是真与假的对抗,那或者我们只能将沙箱等类似产品做的无限接近于真,或者从高一层的角度去考虑防御问题。

最后俗气的展望下未来沙箱的需要具备的能力,一定要是真正的:

洞察能力,可对抗性,高性能,可集成性。