security - Groovy/Grails:有没有办法使.evaluate()完全安全?

标签 security grails groovy evaluate groovyshell

我遇到一种情况,我需要确定一个对象“骑”另一个对象的资格。车辆的规则非常混乱,我希望能够在不重新启动或重新编译项目的情况下进行更改。

这有效,但基本上使我的安全 friend 感到抽搐并说方言:

class SweetRider{
  String stuff
  BigDecimal someNumber
  BigDecimal anotherNumber
}

class SweetVehicle{
  static hasMany=[constraintLinkers:VehicleConstraintLinker]
  String vehicleName
  Boolean canIRideIt(SweetRider checkRider){
    def checkList = VehicleConstraintLinker.findAllByVehicle(this)
    checkList.each{
      def theClosureObject = it.closureConstraint
      def iThinkINeedAShell = new GroovyShell()
      def checkerThing = iThinkINeedAShell.evaluate(theClosureObject.closureText)
      def result = checkerThing(checkRider)
      return result
    }
  }
}

class VehicleConstraintLinker{
  static belongsTo = [closureConstraint:ConstraintByClosure, vehicle:SweetVehicle]
}

class ConstraintByClosure{
  String humanReadable
  String closureText
  static hasMany = [vehicleLinkers:VehicleConstraintLinker]
}

因此,如果我想添加一条规则,即当您的“东西”是“佩吉”或“华夫饼”并且您的someNumber大于您的anotherNumber时,您才有资格使用某种车辆:

使用humanReadable =“peggy waffle some#>”创建新的ConstraintByClosure(这是人类可读的解释),然后将此字符串添加为closureText
{
   checkRider->if(
     ["peggy","waffles"].contains(checkRider.stuff) &&
     checkRider.someNumber > checkRider.anotherNumber ) {
     return true  
   } 
   else { 
      return false
   }
}

然后,我只是创建了VehicleConstraintLinker来将其链接起来,瞧。

我的问题是:是否有任何方法可以限制GroovyShell的功能?我可以使其无法更改任何文件,全局变量或数据库数据吗?这够了吗?

最佳答案

请注意,仅以各种形式拒绝访问java.iojava.lang.Runtime是不够的。恶意代码有很多具有很多权限的核心库可能被恶意程序利用,因此您需要将不受信任的脚本可以访问的符号列入白名单(沙盒或基于功能的安全性),或者限制JVM中可以执行的操作做(通过Java SecurityManager)。否则,您很容易受到confused deputy attacks的攻击。

provide security sandbox for executing scripts尝试与GroovyClassLoader一起使用以提供沙箱。

Sandboxing Java / Groovy / Freemarker Code - Preventing execution of specific methods讨论了沙盒常规的方式,但没有专门讨论evaluate边界。

Groovy Scripts and JVM Security讨论了沙盒groovy脚本。我不是JVM安全策略的忠实拥护者,因为安装安全管理器可能会影响JVM中的许多其他事情,但是它确实提供了一种拦截对文件和运行时内容的访问的方法。

我不知道前两个方案中的任何一个都受到了广泛的攻击,因此如果不进行全面的攻击审查,我将不愿意部署它们。 JVM安全管理器在浏览器中遭受了广泛的攻击,并遭受了许多失败。它可以是很好的纵深防御,因此,我不会将它作为任何珍贵事物的唯一防线。

关于security - Groovy/Grails:有没有办法使.evaluate()完全安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6783825/

相关文章:

grails - 如何从自定义验证器Grails中的另一个Domain类引用属性?

spring - Spring Cloud Angel.SR4和Grails 3.0.9无法正常工作

java - Groovy 空格分隔的 HashMap 键

xml - 使用 "envelop"创建 groovy xml - 在 xml 结构中间添加节点

java - 尝试根据复选框自动创建子任务。子任务不会被创建,但没有收集到错误

PHP 验证 base64 编码的图像

objective-c - 无法检查 iPhone 上是否存在配置文件

java - 比较两个字符串,都使用正则表达式

c# - 如何正确保护忘记密码端点

grails - 过滤器映射中无效的<url-pattern> *。在glassfish上部署grails 3应用程序期间