我在应用程序中使用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
。否则,将编译未修改的脚本