Spark 存在 shell 命令注入

3月24日,墨菲安全实验室情报预警监控发现 spark 提交[修复 shell 命令注入的代码],当上传文件名可以被攻击者控制时,就可以构造恶意文件名造成远程任意命令执行。

墨菲安全实验室
墨菲安全实验室   Follow

# 漏洞简述

3月24日,墨菲安全实验室情报预警监控发现 spark 提交修复 shell 命令注入的代码 (opens new window),当上传文件名可以被攻击者控制时,就可以构造恶意文件名造成远程任意命令执行。

Spark 是用于大规模数据处理的统一分析引擎。

用户上传文件后,tar 文件会被 hadoop 的 tar 命令解压,如果文件名被用户恶意构造后,就会导致 shell 命令注入。

漏洞评级为严重,受影响组件版本范围为:

  • 3.1.1 ~ 3.2.1

用户需要尽快下载补丁并安装,参考链接:https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f。

# 漏洞时间线

  • 3.24日:开发者提交代码进行漏洞修复,墨菲安全实验室发现该漏洞并上报CNVD和CNNVD

# 缺陷分析

通过https://github.com/apache/spark项目中的commit信息可以发现漏洞和shell命令执行有关。

img

开发者修改了对 tar 文件的处理方式,我们分析下这两种处理方式。

img

有问题的 unTar 方法调用了

通过对源码分析,可以看到ShortcutConfigurable.getValue()方法取值时使用了StandardEvaluationContext进行表达式解析。

img

下方的shortcutType().normalize()则在对value进行归一化的时候调用了getValue()

img

可以发现GatewayFilterFactory继承了ShortcutConfigurableRewritePathGatewayFilterFactory等过滤器类实现了GatewayFilterFactory

根据官方文档 (opens new window),开启acutator后可以通过访问/actuator/gateway/routes列出路由,路由中包含filter,如:

img

同时可以通过/gateway/routes/{id_route_to_create}创建路由。

然后通过/actuator/gateway/refresh刷新路由,重新加载配置使得路由生效。

因此攻击者可以添加带有filter的恶意路由,当重新加载路由时,会触发对参数的归一化逻辑,从而导致filter参数value中的SPEL表达式被解析。

img

漏洞发现者在博客中描述了自己的漏洞发现过程,还分析了为什么在CodeQL中存在SPEL注入的规则,却没能发现这个问题,以及其他的一些问题,值得学习,感兴趣的同学可以阅读,在此不过多展开。

# 参考链接

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-how-it-works

https://wya.pl/2022/02/26/cve-2022-22947-spel-casting-and-evil-beans/

https://tanzu.vmware.com/security/cve-2022-22947

#

img