初生牛犊:Windows下Anti-sandboxes技术探究
由于云端杀毒的流行,病毒基本上都会加上anti-sandboxes手段来躲避沙箱的探测,在这点上,由于一些原因,最近也一直在做这一块,所以算是总结一下吧。
一:什么是沙箱以及其他:
根据受控环境中的观察行为确定文件是否恶意。沙箱允许恶意软件执行所有恶意操作,并记录生成的行为。过了一段时间后,分析停止,检查结果并扫描典型的恶意行为模式。基于行为的恶意软件检测仅在观察文件在其分析期间实际执行恶意操作时有效。如果 - 无论什么原因 - 在分析过程中都没有执行有害的操作,则沙箱得出结论:被检查的文件是良性的。
所以,这也得出了anti-sandboxes的两种方式,一种是检测到沙箱之后,直接退出进程,另一种就是检测在沙箱时,显示良性行为。
anti-sandbox大致可以分为三种类型:
1:直接检查沙箱
2:利用沙箱的一些缺陷进行检测
3:利用运行时环境进行检测
二:沙箱anti方式
1:直接检查沙箱
关于沙箱的检查,其实任何和正常主机不相似的地方都可以作为anti方法。这里选取几种特别典型的方式
1:检测设备名:
通过使用诸如SetupDiGetClassDevsA,SetupDiEnumDeviceInfo和SetupDiGetDeviceRegistryPropertyA之类的API枚举设备细节来检测虚拟化软件的存在。在枚举之后,可以将其与Sandboxes中使用的已知值(如VMware Pointing,VMware Accelerated,VMware SCSI,VMware SVGA,VMware Replay,VMware服务器内存,CWSandbox,Virtual HD,QEMU等)进行比较,下面是一个病毒对于sandboxes的检测:
2.利用注册表进行查询:
注册表的查询各种各样,这里选取一些经典的例子:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Disk\Enum 像vmware,qume,xen等虚拟化产品的值为0。
除此之外,类似于 HKEY_CLASSES_ROOT\Applications\VMwareHostOpen.exe 还有
KEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\VideoBiosVersion等等.....
3.利用硬件信息:
这里包括但不限于:productId(在注册表里可以查),productName,mac地址以及CPUID等等........这里的原理在于,每一个沙箱沙箱的产品的这些信息一般是相同的。
4.进程遍历:
一个沙箱里,总有运行一些敏感的进程,做类似于hook或者其他的操作,一般使用Process32First()/Process32Next()进行便利,下面是一些常见的进程名称:
"VBoxTray.exe" "VBoxService.exe" "VMwareUser.exe" "VMwareTray.exe" "VMUpgradeHelper.exe" "vmtoolsd.exe" "vmacthlp.exe"
....
5.特有模块查询:
这里的一般的套路是:
沙盒在一个进程中注入模块以记录其执行的活动。由于安全沙箱使用的某些模块名称是公开的,因此它们被病毒用来通过以下方法来检测沙箱的存在:在模块名称上调用GetModuleHandleA()。如果返回的句柄为非空,则表示模块已加载。它通过调用 FreeLibrary()来卸载。一旦完成,沙箱将不会记录恶意软件执行的任何活动。病毒经常搜索的常见模块名称是dbghelp.dll,sbiedll.dll等。
6.SSDT和shadowSSDT等结构进行校验:
一般在沙箱中,需要对一个SSDT的函数指针进行hook,病毒可以通过加载内核模块,并进行读取。得到原始的ssdt表,利用zwSystemControlDebug(windows xp以前)函数读取内存中的ssdt表,进行比较校验。
7.内核驱动遍历:
不同的虚拟机都一些相关的驱动模块,可以利用zwSystemcontrolDebug函数进行遍历
2:利用沙箱的一些缺陷进行检测
明确寻找沙箱的存在可以在分析过程中被检测为可疑活动。因此,更高级的恶意软件方法利用了沙箱技术中的弱点,无需检测即可执行操作。通过利用这些沙箱的弱点,恶意软件无需担心即使在沙盒系统中执行也被检测到。
大多数沙盒在客户端进行监控,即将代码,进程,挂钩等放在分析环境中。如果这些修改被撤销或规避,则沙箱就不会起作用的 - 换句话说,分析环境的可见性将会丢失。可以采取以下形式:
- 钩子去除
- 可以通过恢复原始指令或数据来删除钩
- 钩规避
- 通过使用直接的系统调用代替API,调用私有函数(no hook)或执行未对齐的函数调用(跳过“挂钩代码”),可以避免钩子。我们可以在本分析报告 中看到一个例子, 其中检测到恶意软件使用非法的API来启动和破坏explorer.exe和regedit.exe。虽然这个问题可以通过这些特定内部函数的钩子解决,但是在操作系统中存在许多这些问题,并且它们随着每个Windows版本而变化。而且,通过挂钩,不能很好地解决未对齐的函数调用问题。
- 系统文件替换:
- 挂钩通常驻留在映射到内存中的系统文件中。某些恶意软件将取消映射这些文件并重新加载它们。新加载的文件版本然后是“未挂钩” 内核代码。许多沙盒不能监视系统的内核代码或启动过程:晦涩的文件格式:许多沙箱不支持所有文件格式
-
- Powershell,.hta,.dzip等是一些文件格式的例子,这些文件格式可能会在沙盒环境中滑倒,而且无法执行
- ·系统文件替换:
- 挂钩通常驻留在映射到内存中的系统文件中。某些恶意软件将取消映射这些文件并重新加载它们。新加载的文件版本然后是“未挂钩”
- 内核代码。许多沙盒不能监视系统的内核代码或启动过程:
- 晦涩的文件格式:许多沙箱不支持所有文件格式
- Powershell,.hta,.dzip等是一些文件格式的例子,这些文件格式可能会在沙盒环境中滑倒,而且无法执行。
- 许多沙箱不支持所有技术。虽然最初的感染向量(例如,具有宏的Word文档)可能会打开,并且宏在沙箱中运行,但宏将下载并运行使用隐藏的分析隐藏技术的有效内容。
- 操作系统重启:
- 许多沙盒无法在重新启动后生存。某些系统尝试通过重新登录用户来模拟重新启动,但是可以检测到这一点,并且不会执行所有重新启动的触发器。
通过简单地压制目标分析环境,恶意软件也可以避免使用这种粗略但有时有效的方法进行分析。例如,
- 一些沙箱仅支持一定大小的文件,例如10 MB
- 其他人不支持多个压缩层
3:利用运行时环境进行检测
1.最常见的技术之一是延迟执行一段时间,因为沙箱通常只运行几分钟的采样。与许多其他逃避技术一样,特别是使用时间炸弹是一个持续的猫和老鼠游戏:恶意软件睡着了,沙箱尝试检测睡眠并缩短时间,恶意软件检测缩短的时间,沙盒试图隐藏时间向前还更新系统计时器等。
技术包括:
简单到非常复杂的睡眠,例如彼此观看或相互依赖的并发线程。
仅在特定时间或特定日期执行,例如星期一或上午12点或3月12日。
如,通过注入数百万个无效的任意系统调用,除了减慢执行速度,特别是在被监视或仿真的环境中执行时,会显着降低执行速度。
- 系统事件
- 仅在关机,重新启动或有人登录或关闭后才能生效。
- 图2显示了一个示例,其中仅在重新启动后才将二级有效负载下拉。我们可以在VTI分数中看到可执行文件由恶意软件(初始有效载荷)安装,这将在启动后自动运行。正是这个启动过程获取第二个有效载荷。
3.用户互动
- 等待鼠标移动(但不要太快,因为这是一个沙盒)或键盘输入。
- 与某些应用程序进行交互,例如浏览器,电子邮件,Skype,在线银行应用程序。
- 假安装程序:恶意软件只有在用户单击多个按钮并检查各种复选框后才会激活(参见图2)。
- 具有恶意嵌入式内容的Office文档:当用户向下滚动(查看)或单击时,恶意内容才会生效。
4.检测特定的目标系统
复杂的有针对性的恶意软件只适用于预期的目标系统。标识通常基于当前用户名,时区,键盘布局,IP地址或其他系统工件。支票本身可以通过各种方式完成,从简单到非常复杂的方法。
- 简单检查包括字符串检查。
- 如果预期的目标环境不知道,复杂检查(例如,从环境设置中获取的散列解密)几乎不可破坏。
如果恶意软件确定它在预期的目标环境中,则只进入第二阶段(即下载主要有效载荷)。