Spark 未授权访问漏洞

漏洞描述

Apache Spark是一款集群计算系统,其支持用户向管理节点提交应用,并分发给集群执行。如果管理节点未启动访问控制,攻击者可以在集群中执行任意代码。该漏洞的本质是未授权用户可以向Master节点提交一个应用,Master节点会分发给Slave节点执行应用。如果应用中包含恶意代码,会导致任意代码执行,威胁Spark集群整体的安全性。

环境搭建

git clone https://github.com/vulhub/vulhub.git
cd /opt/vulhub-master/spark/unacc/
docker-compose up 

漏洞检测

环境启动后,访问http://your-ip:8080即可看到master的管理页面,访问http://your-ip:8081即可看到slave的管理页面。

image-20220516154414820
image-20220516154453373

该漏洞本质是未授权的用户可以向管理节点提交一个应用,这个应用实际上是恶意代码。

提交方式有两种:

利用REST API

构造payload

image-20220516154805960

其中,spark.jars即是编译好的应用,mainClass是待运行的类,appArgs是传给应用的参数。

此时访问http://your-ip:8081 已经加载了exploit.jar

image-20220516154832618

返回的包中有submissionId(driver-20220516074753-0000),然后访问http://your-ip:8081/logPage/?driverId={submissionId}&logType=stdout,即可查看执行结果:

image-20220516155318390

利用submissions网关(集成在7077端口中)

如果6066端口不能访问,或做了权限控制,我们可以利用master的主端口7077,来提交应用。

方法是利用Apache Spark自带的脚本bin/spark-submit

如果你指定的master参数是rest服务器,这个脚本会先尝试使用rest api来提交应用;如果发现不是rest服务器,则会降级到使用submission gateway来提交应用。

查看结果的方式与前面一致。

MSF

修复方案

创建认证filter对应的jar包

在idea中通过maven编译源码方式。

添加maven依赖

创建maven项目后,pom.xml添加如下依赖:

创建com.demo包

image-20220516165325327

这段代码是一个 Java 的 Servlet Filter 类,名为 SparkAuthFilter。该类实现了 Filter 接口,在接收 HTTP 请求时可以对请求进行认证,并决定是否允许该请求继续向下传递。

在 Filter 初始化时,可以从配置中读取 username 和 password,并赋值到类的实例变量中。

对于每一个请求,程序会检查请求的 Authorization header 是否存在,并判断是否是 Basic 认证方式。如果是,程序会对 header 中的认证凭证进行解码,并与 username 和 password 进行比较,如果一致则允许请求继续,否则返回 401 Unauthorized。

在返回 401 Unauthorized 时,程序会在 HTTP 响应的 WWW-Authenticate header 中加入认证需要使用的 realm 信息。

使用maven进行编译,编译的jar包在target目录下面。

image-20220516165416923

执行配置

  1. 将jar包上传到spark的jars目录。

  2. spark-defaults.conf配置文件中,增加如下配置:

重启spark集群

image-20220516165656719

最后更新于

这有帮助吗?