如何在Go语言中创建沙盒程序

9

问:有没有一种方法可以对Go程序进行沙盒处理?
答:有。请参见GAE与Goplay.golang.org

怎么做呢?

在我的特定情况下,我想允许使用Go编写的不受信任的扩展。 我想Go Playground正是我需要的东西。 它是开源的吗?还是至少有关于如何构建类似服务的文档?

注意:

code.google.com/p/go-playground是Go Playground编辑器的源代码。 但是沙盒被隐藏在对http://golang.org/compile?output=json的POST后面。


这不是一个Go语言的问题。也许https://dev59.com/o2855IYBdhLWcg3wm1m3会有所帮助? - Jonathan Feinberg
我认为有一个针对Go的特定答案。特别是,Go的设计受到了在GAE上进行沙盒处理的需求的影响。但我找不到如何实现的描述。 - deft_code
你有关于 Go 运行时被设计成沙盒化的想法的引用吗? - Jonathan Feinberg
@JonathanFeinberg,我一直在寻找,但似乎找不到。我将Go的安全代码设计(例如数组边界检查,无指针算术)与Go Playground和GAE的沙盒混淆了。 - deft_code
2个回答

12

游乐场沙盒技术目前据我所知不是开源的。原因之一可能是,公开实施细节会使攻击企图变得更加容易。

如果要自己创建沙盒环境,建议提供虚假/空白/有限版本的{unsafe,runtime,net,os,syscall}包,并禁止GOMAXPROCS超过1个。但设计必须根据你对沙盒的定义而定制。文件访问是/否/受限?网络是/否/受限?等等......最后但并非最不重要的是,应该禁用CGO、汇编代码和甚至是构建标签。

请注意,上述列表不完整。


3
看来你是正确的。Russ Cox 在谷歌工作,并在关于 Go 的沙盒化方面撰写了这篇文章。 - deft_code
1
除了上述操作,我还会将每个应用程序放置在其自己的基于Linux cgroup/namespace的容器中,或者采用更不理想的chroot方法。 - voidlogic

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接