用于应用程序的沙箱虚拟机(概念)

时间:2010-10-29 22:25:38

标签: security virtualization virtual-machine sandbox portable-executable

我想编写一个沙盒虚拟机来执行已编译的程序。我的目标是将该程序与其余操作系统隔离开来,并控制其执行,以便它不会对主机造成任何损害。

我认为:

  • 执行的程序被编译为Portable Executable格式,它是机器代码,不是任何字节代码或CLR,
  • 执行程序不允许与打印机,扫描仪等外围设备通信,并且不使用任何GUI,
  • 执行程序的主要任务是处理存储在本地文件中的一些数据(例如计算),并将其结果放在另一个本地文件中,
  • 执行的程序不应该直接与操作系统通信,每个请求都应该由虚拟机处理,任何可能导致操作系统损坏的请求都应该被阻止。

我对沙箱虚拟机的架构和操作的概念:

  • 应用程序包含几个模拟对象的对象:处理器,内存,文件的i / o操作,
  • 有一个模块可以读取已编译的文件并将可执行代码加载到虚拟内存中,
  • 然后虚拟处理器从第一个字节开始处理,读取操作码,参数,如果需要从内存加载它们,执行命令并将结果放在适当的位置,如果需要设置虚拟标志,然后读取下一个命令,直到程序执行到最后。

您如何看待:这是一个好主意吗?你会改变什么改进它?

3 个答案:

答案 0 :(得分:1)

模拟完整的计算机似乎是执行本机代码的一种非常慢的方式。对于单个本机指令,有大量的加载,查找,执行,存储等操作。

我会尝试本地执行至少一些代码块。想想以下代码。

int sum = 0;
for (int i = 0; i < 10; i++)
{
    sum += i;
}

此代码在您的虚拟机中执行本机是完全安全的。只需确保为虚拟机代码注入一个返回调用。

但我会尝试更进一步,除了库/ os调用之外,本地执行所有代码。在加载沙盒应用程序之前,扫描文件并通过调用虚拟机中的处理程序替换所有“危险”调用。
代码

printf("Hello World\n");

将替换为对您的库的调用

myVM_printf("Hello World\n");

然后,您可以以原生速度执行整个程序,并且仍然能够处理虚拟机中的所有危险代码。

答案 1 :(得分:1)

只需调整流程权限,即可实现A LOT。至少在WinNT下,它具有相当细粒度的过程权限。我也相信Chrome中使用的google沙盒已经开源了。

答案 2 :(得分:0)

听起来这可以通过现有的沙箱来实现,例如SELinux或微软的App-V

同样访问外围设备可能会有问题。如果外围设备是房间里的摄像头或麦克风怎么办?如果黑客想通过在彩虹文本中打印出一个永无止境的故事来浪费你的钱,该怎么办?