我正在构建一个Grails应用程序,该应用程序允许用户编写Groovy代码,然后在我的框架内执行该代码。当然,这是一个巨大的安全威胁,因为用户可能输入恶意代码。
Groovy类正在使用GroovyClassLoader#parseClass(String)
进行即时编译。
我想严格限制用户编写的Groovy类可以访问的类和操作。似乎有两个通用选项,它们不是互斥的:
1)要使用SecurityManager
和策略文件来限制允许从特定codeSource
执行的代码,
2)扩展GroovyClassLoader
并实现程序包白名单或黑名单,以限制用户代码可以访问哪些类。
不受信任的代码不得以任何方式访问GORM或数据库,读取或写入本地磁盘,打开网络套接字,写入控制台等。
我已经实现了SecurityManager方法,并且部分起作用,阻止了至少读取文件,打开套接字,退出VM等功能。
但是,攻击者仍然可以通过Groovy println(String)
(不是重大问题)向控制台写入信息,更糟糕的是:她可以成功地执行User.list()
来获取所有用户及其哈希密码以及数据库中的所有其他密码!我该如何预防?
我正在考虑扩展GroovyClassLoader,以防止用户脚本首先加载我的域类。这样就足够了吗?您还能提出其他建议吗?如何确保我不留任何孔?
最佳答案
您可以采取另一种方式,不是保护方法,而是为用户代码(沙盒)提供环境
以here为例。
还要考虑白名单政治:拒绝所有,但不允许的。它可以防止您忘记关键信息。