漏洞简介
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架 Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
Apache Spark UI 提供了通过配置选项启用 ACL 的可能性。使用身份验证筛选器,这将检查用户是否具有查看或修改应用程序的访问权限。如果启用了 ACL,则 HttpSecurityFilter 中的代码路径可以允许某人通过提供任意用户名来执行模拟。然后,恶意用户可能能够访问权限检查函数,该函数最终将根据其输入构建 Unix shell 命令并执行它。这将导致执行任意 shell 命令,因为用户 Spark 当前运行时为该命令。这会影响 Apache Spark 版本 3.0.3 及更早版本、版本 3.1.1 至 3.1.2 以及版本 3.2.0 至 3.2.1。spark.acls.enable
漏洞影响版本
This affects Apache Spark versions 3.0.3 and earlier, versions 3.1.1 to 3.1.2, and versions 3.2.0 to 3.2.1.
修复方式
升级到 Apache Spark 3.1.3、3.2.2 或 3.3.0 或更高版本
漏洞分析
在 ShellBasedGroupsMappingProvider 类中
getUnixGroups 使用了传进来的参数username与命令进行拼接直接执行了命令。
向上分析调用链
find usages ShellBasedGroupsMappingProvider#getUnixGroups
find usages ShellBasedGroupsMappingProvider#getGroups
继续向上分析
find usages #getCurrentUserGroups
继续向上分析
find usages #isUserInACL
继续向上分析
find usages #checkUIViewPermissions
来到了dofilter, 分析得知effectiveUser这个参数是 Option(hreq.getParameter("doAs"))得来是可控的变量
如此便有命令执行的可能
漏洞复现
下载源码Release v3.1.1 · apache/spark · GitHubApache Spark - A unified analytics engine for large-scale data processing - Release v3.1.1 · apache/sparkhttps://github.com/apache/spark/releases/tag/v3.1.1
构建项目
./build/mvn -DskipTests clean package
启动 Apache spark 项目
./bin/spark-shell --conf spark.acls.enable=true
访问url [yourip]:4040
打入dnslog命令
查看回显
成功回显,漏洞利用成功