CVE-2022-33891 Apache Spark shell 命令注入漏洞分析

漏洞简介       

 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/sparkicon-default.png?t=N7T8https://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命令

查看回显

成功回显,漏洞利用成功