沙盒Java / Groovy / Freemarker代码 – 防止执行特定方法

我正在开发一个允许开发人员上传自定义groovy脚本和freemarker模板的系统。

我可以使用默认的Java安全基础架构在非常高的级别上提供一定级别的安全性 – 即阻止代码访问文件系统或网络,但是我需要限制对特定方法的访问。

我的计划是修改Groovy和Freemarker运行时以读取将某些方法列入白名单或列入黑名单的注释,但这会迫使我维护其代码的分叉版本,这是不可取的。

我基本上需要做的就是在从Groovy或Freemarker调用时阻止特定方法的执行。 我已经考虑过一个看看调用堆栈的黑客攻击,但这将是一个巨大的速度命中(而且非常混乱)。

有没有人有任何其他想法来实现这个?

您可以通过inheritanceGroovyClassLoader并在AST访问者中强制执行约束来完成此操作。 这篇文章解释了如何做到这一点: http : //hamletdarcy.blogspot.com/2009/01/groovy-compile-time-meta-magic.html

此外,引用的代码位于Groovy 1.6安装程序的samples文件夹中。

你应该看看kohsuke的项目groovy-sandbox 。 还可以看看他在这篇主题上的博客文章以及解决方案正在解决的问题:沙盒,但性能缺陷。

OSGi非常适合这一点。 您可以将代码分区为捆绑包,并准确设置每个捆绑包暴露的内容以及其他捆绑包。 这对你有用吗?

您可能还会考虑java-sandbox( http://blog.datenwerke.net/p/the-java-sandbox.html )最近开发的库,它允许从java中安全地执行不受信任的代码。

另见: http : //blog.datenwerke.net/2013/06/sandboxing-groovy-with-java-sandbox.html