Java中不受信任的Groovy脚本安全性

15
我们正在尝试在一款“企业级”产品中提供可编写脚本的元素。我们想使用Groovy语言,但是我们很难确保非常基础的安全性。
例如,我们希望防止客户简单地执行以下操作:
Class.forName("my.company.internal.SecruityTools").runAsAwesome(...)
我们已经安装了一个安全管理器,该策略只允许accesDeclaredMembers并覆盖了checkPackageAccess方法,只允许白名单内的包。不幸的是,默认的类加载器链似乎可以绕过这个限制,任意加载类。
这似乎是一个相当普遍/讨论的问题,但我无论如何都找不到一个库,甚至是一篇关于如何在更大的应用程序上下文中锁定不受信任的脚本的好博客文章。
有人成功地做到了吗?我是否错过了一些非常明显的帖子/概念?是否已经存在一个可靠的库?也许是Groovy.tinFoilHatMode(true)

4
也许类似问题的这个答案能够提供一些帮助?该答案指向了这篇博客文章,它提供了一个可行的机制来防止这种情况发生... - ig0774
如果我没记错的话,有很多动态语言特性可以防止任何类型的抽象语法树保护。比如像 object.("ge"+t" +"ClassLoader")."fo"+$rname 或者其他一些愚蠢的东西。 - Steve Skrla
1
@Ambience,你尝试过ig0774建议的步骤吗?我不认为你可以用你所建议的技巧来规避它们,如果你能够这样做,这是应该立即向Groovy团队报告的事情。 - tim_yates
我们已经在使用它来防范一些明显的攻击,但即使在那篇文章的评论中,有人指出你可以简单地使用方法迭代来获取方法指针并执行任何你想要的操作(我相信还有其他超出我初步理解的 Groovy 技巧)。但我们将看看是否能找到一个好的方法来锁定它。我觉得更清晰的解决方案涉及设置类加载器链,以便它始终根据安全管理器或其他门卫检查类加载。 - Steve Skrla
你也可以查看我在http://stackoverflow.com/questions/9681413/how-do-you-forbid-users-from-doing-evil-things-in-groovy-scripts/36706404#36706404的回答是否有所帮助。 - tnabeel
4个回答

7

请看Groovy沙盒。您可以使用它阻止像System.exit(0)new File("/etc/passwd")这样的操作。


2

我会在有机会回头时查看这个,谢谢! - Steve Skrla

1
我们最终采取了上述方法的结合,但真正的魔法在于实现了这个AST转换器,它将任何表达式(包括this或隐式的this)都包装在访问检查中。

1

请纠正我,但这似乎是隐式包装编译源代码,并仅帮助缩小脚本策略。我们的代码为评估线程中的所有源定义了非常严格的策略。因此,这将帮助我们“范围”我们的权限,但不会通过Class.forName权限开始验证(就我所看到的内部Groovy引用而言)任何神奇的事情。 - Steve Skrla

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