首页 > 解决方案 > 如何防止/禁用 Groovy 脚本中的 AST 转换?

问题描述

我在我的应用程序中使用 Groovy 3.x 作为我的运行时脚本环境。用户可以输入脚本并以多种方式扩展应用程序。但是,我需要防止某些事情;其中包括来自此类脚本的 shell 访问。

CompileStatic和黑名单有很长的路要走。但是,以下示例显示了静态类型检查和黑名单未涵盖的情况。假设用户输入以下脚本:

@groovy.transform.ASTTest(value={
   assert java.lang.Runtime.getRuntime().exec("any evil shell command")
})
def x

这里的问题是注入发生在静态类型检查之前很久(这将阻止访问Runtime)。更糟糕的是:这可能发生在所有声明 ( def x) 合法的地方。

如何防止使用 Groovy 进行此类注入,特别是使用GroovyClassLoader?

标签: javasecuritygroovycode-injection

解决方案


我最终做了什么(至少现在,我愿意接受更好的建议)是:

  • 在将脚本内容传递给GroovyClassLoader...
  • ...检查脚本内容的注释。这是通过以下方式完成的:
    • ""使用正则表达式将所有字符串文字替换为空字符串 ( )
    • 检查剩余的字符串是否包含@字符
  • 如果@在脚本中找到不存在于字符串文字中的字符,则该脚本将被拒绝,甚至不会传递给GroovyClassLoader. 否则,编译未修改的脚本。

推荐阅读