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