2

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

我假设:

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

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

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

你怎么看:这是一个好概念吗?你会改变什么来改善它?

4

3 回答 3

1

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

于 2010-10-30T16:34:44.210 回答
1

模拟一台完整的机器似乎是一种执行本机代码的非常慢的方法。仅针对单个本机指令的大量操作,包括加载、查找、执行、存储等。

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

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

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

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

printf("Hello World\n");

将替换为对您的图书馆的调用

myVM_printf("Hello World\n");

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

于 2010-10-30T07:45:52.830 回答
0

听起来这可以通过 Microsoft的 SELinux 或App-V等现有沙盒来完成。

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

于 2010-10-30T00:07:08.343 回答