2009-10-12 97 views
2

场景:运行在像Java或Python这样的字节码虚拟机中的程序想要评估(通过编译运行中的字节码然后运行)一个函数,该函数的代码是由外部自动生成或提供的。细粒度沙盒

棘手的问题是函数的代码是不可信的 - 它可能是由遗传编程等随机方法产生的,甚至是由对手提供的。因此需要强制执行它作为纯函数 - 它可以返回一个值,但它可能没有任何副作用,即它可能不会以任何方式更改程序的任何现有数据。

另一个棘手的问题是该函数可能需要调用某些程序的现有函数;其中一些功能可能有副作用,但只要被嫌疑功能调用,这些功能应该被阻止实际发生持久效果。

此外,优选的是不对可疑功能的编码风格施加约束,例如,它可以自由地对它自己创建的任何数据结构执行破坏性更新,只需要它的整体效果是纯粹的功能。

此外,优选该解决方案具有合理的低开销,因为这可能需要进行数十亿次;例如,避免为每个这样的功能分配一个全新的虚拟机会更好。

这不一定非得在现有的虚拟机如Java或Python中可行;如果有必要围绕这个用例设计一个虚拟机,那就这样吧。

这个问题是否有任何已知的解决方案(或非解决方案,即已知不可行的解决方案)?

回答

1

我和其他许多人之前已经为遗传编程目的构建了语言。如果构建新的语言是一种选择,那么这种解决方案已经存在。由于有自动生成函数的技巧,所以提供函数库应该是微不足道的。这个系统实际上构成了一个沙盒环境。这些功能的任何副作用将被限制在程序可访问的空间。

1

我想象沙盒是你唯一的选择。试图分析程序并确定它是否安全是一个相当于暂停的问题。 CLR具有内置的安全性,允许这样的限制,我想Java也有类似的限制。我不认为Python会。

1

那么,一般问题似乎是无法解决的:没有一种终止策略来排序固有状态计算从可能的无状态。除非字节码是特别构造来提供克服这种需要的强类型约束,否则你将会丢失。 Curien已经写了很多关于什么样的事情可以和从黑匣子观察无法推断。

但是,如果您愿意向您的功能提供商提出更多要求,则问题是请求提供证明代码(PCC)作为答案。我猜你知道Necula的工作,他特别关心确保汇编代码遵守内存使用的限制,比如不篡改超出范围的状态;您可能并不知道在相当常见的情况下自动推理证据所做的工作:可能是PCC比您想象的更容易。