我正在构建一个Grails应用程序,该应用程序允许用户编写Groovy代码,然后在我的框架内执行该代码。当然,这是一个巨大的安全威胁,因为用户可能输入恶意代码。

Groovy类正在使用GroovyClassLoader#parseClass(String)进行即时编译。

我想严格限制用户编写的Groovy类可以访问的类和操作。似乎有两个通用选项,它们不是互斥的:

1)要使用SecurityManager和策略文件来限制允许从特定codeSource执行的代码,

2)扩展GroovyClassLoader并实现程序包白名单或黑名单,以限制用户代码可以访问哪些类。

不受信任的代码不得以任何方式访问GORM或数据库,读取或写入本地磁盘,打开网络套接字,写入控制台等。

我已经实现了SecurityManager方法,并且部分起作用,阻止了至少读取文件,打开套接字,退出VM等功能。

但是,攻击者仍然可以通过Groovy println(String)(不是重大问题)向控制台写入信息,更糟糕的是:她可以成功地执行User.list()来获取所有用户及其哈希密码以及数据库中的所有其他密码!我该如何预防?

我正在考虑扩展GroovyClassLoader,以防止用户脚本首先加载我的域类。这样就足够了吗?您还能提出其他建议吗?如何确保我不留任何孔?

最佳答案

您可以采取另一种方式,不是保护方法,而是为用户代码(沙盒)提供环境

here为例。

还要考虑白名单政治:拒绝所有,但不允许的。它可以防止您忘记关键信息。

10-08 08:04