如何在Groovy脚本中防止/禁用AST转换



我在应用程序中使用Groovy3.x作为运行时脚本环境。用户可以通过多种方式输入脚本并扩展应用程序。然而,我需要防止某些事情发生;其中包括从这样一个脚本进行shell访问。

CCD_ 1和列入黑名单起了很大作用。但是,下面的示例显示了一个静态类型检查和黑名单未涵盖的情况。假设用户输入以下脚本:

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

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

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

我最终做的(至少目前,我对更好的建议持开放态度(是:

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

相关内容

  • 没有找到相关文章

最新更新