java - 如何防止/禁用 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
?
解决方案
我最终做了什么(至少现在,我愿意接受更好的建议)是:
- 在将脚本内容传递给
GroovyClassLoader
... - ...检查脚本内容的注释。这是通过以下方式完成的:
""
使用正则表达式将所有字符串文字替换为空字符串 ( )- 检查剩余的字符串是否包含
@
字符
- 如果
@
在脚本中找到不存在于字符串文字中的字符,则该脚本将被拒绝,甚至不会传递给GroovyClassLoader
. 否则,编译未修改的脚本。
推荐阅读
- c - 如何修复 munmap_chunk():在 C 中调用 fclose 并覆盖堆栈变量时指针无效?
- database - 为我的用例选择数据库时遇到问题。有任何帮助/见解会受到重视吗?
- javascript - css中的onclick背景颜色转换
- ffmpeg - 是否可以像使用 FFmpeg 的 Icecast 一样通过 http 投射 mp3?
- r - 如何从数据框中获取特定年份的前 2 个值?
- css - Jupyter notebook 在 Google Chrome 上的字体不同
- python - 我似乎无法理解导致错误的原因
- flutter - Flutter:这个表达式的类型是 'void',所以它的值不能被使用
- javascript - 添加事件侦听器多次触发
- vim - 有没有办法让 vi 在文件中运行编辑命令?