最早接触沙箱时,觉得他就是跟虚拟机一样的作用,或者说是一个影子系统
因此我最初认为沙箱,sandboxie,它就是一个轻量级虚拟机,软件的操作都不会影响真正的系统,包括文件、注册表等等资源,可以在里面想干嘛就干嘛
因为之前学的是网络安全相关专业,在网上下载东西非常谨慎,就算通过了杀毒软件扫描,但是也怕有后门或者其他东西,毕竟可以通过静态逃过杀毒软件
很多软件没有官网,让人用着不是很放心,或者一些软件有官网但是正版太贵支持不起,只能在网上寻求破解版,但是呢破解版不知道别人会不会在软件里做过什么
所以很多时候,在网上下载的文件只要不影响使用的情况下我会将其放到虚拟机或者沙箱里
沙箱概述
但是现在对于沙箱的概念有些变化了
公司的后端分析平台也叫沙箱,准确一点来说是云沙箱,主要用于上网行为管理等
沙箱的原理:重定向
相信有了解过Linux的朋友对重定向很熟悉,顾名思义,就是重新指定方向,也就是说沙箱能够做到让沙箱内软件操作的文件、注册表等路径重定向到其他位置(沙箱指定位置),这样软件操作的资源就不会被访问或者操作,保证资源的安全性
比如我从网上下载的软件有问题,他可能有留有后门、植入了病毒等等,当我使用该文件时他可以拿到我电脑的管理员权限进而控制我的电脑。但是沙箱重定向后,即使软件被恶意修改、存在病毒,想破坏系统关键文件,也不太可能了
这其实就跟使用影子系统是一个道理,影子系统是一个虚构的环境,不管你在里面做了什么,当你关闭后所有操作都不会保存也不会对物理机造成任何伤害。因此沙箱在运行程序时其实就是为程序提供了一个虚拟化的环境,并保证该程序的所有操作都会在这个虚拟化环境里面进行
一个完备的沙箱一般需要处理这些东西
- 文件
- 注册表
- DCOM(RPC)
- 进程、线程
- token、类名、消息
- 驱动加载
再举一个简单的例子理解一下重定向。如果程序要删除c:boot.ini,沙箱如何做到隔离,保证文件不被删除呢 - 沙箱hook ZwDeleteFile,函数是HOOK_ZwDeleteFile
- 在HOOK_ZwDeleteFile中,讲路径c:boot.ini加上一个前缀c:sandboxboot.ini,转到沙箱内文件路径
- c:sandboxboot.ini不存在,会先把c:boot.ini拷贝到沙箱内
- 然后调用原始ZwDeleteFile,删除c:sandboxboot.ini
NTSTATUS HOOK_ZwDeleteFile(
POBJECT_ATTRIBUTES ObjectAttributes
) {
AddPrefix(ObjectAttributes->ObjectName, L"sandbox");//路径加上沙箱前缀
if(!PathFileExists(ObjectAttributes->ObjectName.Buffer)) {
CopyFile();//拷贝进来
}
return OrigZwDeleteFile(ObjectAttributes);
}
DCOM虚拟化
DCOM虚拟化最主要的作用是为了防止沙箱内程序逃逸
所谓逃逸,就是沙箱无法控制沙箱内程序行为,程序可以绕过沙箱,对系统造成破坏