我正在构建一个 Grails 应用程序,它允许用户编写 Groovy 代码,然后在我的框架中执行。当然,这是一个巨大的安全威胁,因为用户可能会输入恶意代码。
Groovy 类正在使用GroovyClassLoader#parseClass(String)
.
我想严格限制用户编写的 Groovy 类可以访问的类和操作。似乎有两个通用选项,它们并不相互排斥:
1)使用和策略文件来限制允许SecurityManager
特定代码执行的操作,codeSource
2)扩展GroovyClassLoader
并实现包白名单或黑名单,以限制用户代码可以访问哪些类。
不受信任的代码不能以任何方式访问 GORM 或数据库,读取或写入本地磁盘,打开网络套接字,写入控制台等。
我已经实现了 SecurityManager 方法并且它部分工作,阻止了至少读取文件、打开套接字、退出 VM 等的能力。
然而,攻击者仍然可以通过 Groovy 写入控制台println(String)
(不是一个重要问题),更糟糕的是:她可以成功User.list()
获取所有用户及其哈希密码,以及数据库中的所有其他内容!我怎样才能防止这种情况?
我正在考虑扩展 GroovyClassLoader 以防止用户脚本加载,例如我的域类。这足够了吗?你会建议别的吗?我怎样才能确保我没有留下任何漏洞?