安全模型

有关 Apache Spark 应具有哪些安全属性以及如何配置各种安全功能的信息,请参阅Spark 安全文档。

报告安全问题

Apache Spark 使用 Apache 安全团队概述的标准流程来报告漏洞。 请注意,在项目做出响应之前,不应公开披露漏洞。

要报告可能的安全漏洞,请发送电子邮件至 security@spark.apache.org。这是一个非公开列表,会发送给 Apache 安全团队以及 Spark PMC。

常见问题

在对 Apache Spark 进行安全分析期间,我注意到 Spark 允许远程代码执行,这是一个问题吗?

不,这本身不被认为是问题或漏洞,因为远程代码执行是 Apache Spark 设计和目的的基础。 用户可以在 Spark 作业中提交代码,这些代码将无条件执行,而不会尝试限制可以运行的代码。 启动其他进程、建立网络连接或访问和修改本地文件是可能的。 任何能够使用 Spark 集群的人通常已经完全控制了资源管理器(YARN、Kubernetes 等)分配给其 Spark 应用程序的资源。

从历史上看,我们收到了许多代码执行漏洞报告,但我们拒绝了这些报告,因为这是设计使然。 完全访问已配置的应用程序资源是预期的; 然而,期望用户应用程序可以影响资源管理器配置的资源之外的资源。

我们强烈建议不要将 Spark 集群(包括 UI 和提交端点)直接暴露给公共互联网或不受信任的网络。 我们建议在受信任的网络(公司内部网、私有云环境)内访问,并使用强大的身份验证、授权和网络控制来限制对 Spark 集群的访问。

已知的安全问题

CVE-2023-32007:Apache Spark shell 命令注入漏洞,通过 Spark UI

此 CVE 仅是对 CVE-2022-33891 的更新,以明确版本 3.1.3 也受到影响。 否则,它不是新的漏洞。 请注意,Apache Spark 3.1.x 现在已 EOL。

CVE-2023-22946:Apache Spark 代理用户权限提升,来自恶意配置类

严重性:中

供应商:Apache 软件基金会

受影响的版本

  • 3.4.0 之前的版本

描述

在 3.4.0 之前的 Apache Spark 版本中,使用 spark-submit 的应用程序可以指定一个要作为其运行的“代理用户”,从而限制权限。 然而,应用程序可以通过在类路径上提供与恶意配置相关的类,以提交用户的权限执行代码。 这会影响依赖代理用户的架构,例如使用 Apache Livy 管理提交的应用程序的架构。

此问题正在被跟踪为 SPARK-41958

缓解措施

  • 更新到 Apache Spark 3.4.0 或更高版本,并确保 spark.submit.proxyUser.allowCustomClasspathInClusterMode 设置为其默认值“false”,并且未被提交的应用程序覆盖。

鸣谢

  • Hideyuki Furue(发现者)
  • Yi Wu (Databricks)(修复开发人员)

CVE-2022-31777:Apache Spark XSS 漏洞,存在于日志查看器 UI Javascript 中

严重性:中

供应商:Apache 软件基金会

受影响的版本

  • 3.2.1 及更早版本
  • 3.3.0

描述

Apache Spark 3.2.1 及更早版本,以及 3.3.0 中存在存储的跨站脚本 (XSS) 漏洞,攻击者可以将恶意负载包含到日志中,该日志将在 UI 中呈现的日志中返回,从而允许远程攻击者在用户的 Web 浏览器中执行任意 JavaScript。

缓解措施

  • 升级到 Spark 3.2.2 或 3.3.1 或更高版本

鸣谢

  • Florian Walter (Veracode)

CVE-2022-33891:Apache Spark shell 命令注入漏洞,通过 Spark UI

严重性:重要

供应商:Apache 软件基金会

受影响的版本

  • 3.1.3 及更早版本(以前,这被标记为已在 3.1.3 中修复;此更改被跟踪为 CVE-2023-32007
  • 3.2.0 到 3.2.1

描述

Apache Spark UI 提供了通过配置选项 spark.acls.enable 启用 ACL 的可能性。 使用身份验证过滤器,这将检查用户是否具有查看或修改应用程序的访问权限。 如果启用了 ACL,HttpSecurityFilter 中的代码路径允许某人通过提供任意用户名来执行模拟。 恶意用户可能随后能够访问权限检查功能,该功能最终将根据他们的输入构建 Unix shell 命令并执行它。 这将导致以 Spark 当前运行的用户身份执行任意 shell 命令。

缓解措施

  • 更新到 Spark 3.2.2 或 3.3.0 或更高版本

鸣谢

  • Kostya Torchinsky (Databricks)

CVE-2021-38296:Apache Spark 密钥协商漏洞

严重性:中

供应商:Apache 软件基金会

受影响的版本

  • Apache Spark 3.1.2 及更早版本

描述

Apache Spark 支持通过 spark.authenticatespark.network.crypto.enabled 对 RPC 连接进行端到端加密。 在 3.1.2 及更早版本中,它使用定制的相互身份验证协议,该协议允许完全加密密钥恢复。 在初始交互式攻击之后,这将允许某人离线解密纯文本流量。 请注意,这不会影响由 spark.authenticate.enableSaslEncryptionspark.io.encryption.enabledspark.sslspark.ui.strictTransportSecurity 控制的安全机制。

缓解措施

  • 更新到 Spark 3.1.3 或更高版本

鸣谢

  • Steve Weis (Databricks)

CVE-2020-9480:Apache Spark RCE 漏洞,存在于已启用身份验证的独立 master 中

严重性:重要

供应商:Apache 软件基金会

受影响的版本

  • Apache Spark 2.4.5 及更早版本

描述

在 Apache Spark 2.4.5 及更早版本中,可以将独立资源管理器的 master 配置为通过共享密钥要求身份验证 (spark.authenticate)。 但是,启用后,即使没有共享密钥,也可以成功地将特别制作的 RPC 发送到 master,以在 Spark 集群上启动应用程序的资源。 这可以用于在主机上执行 shell 命令。

这不会影响使用其他资源管理器(YARN、Mesos 等)的 Spark 集群。

缓解措施

  • 用户应更新到 Spark 2.4.6 或 3.0.0。
  • 在可能的情况下,应将对集群机器的网络访问限制为仅受信任的主机。

鸣谢

  • Ayoub Elaassal

CVE-2019-10099:Apache Spark 本地磁盘上的未加密数据

严重性:重要

供应商:Apache 软件基金会

受影响的版本

  • 所有 Spark 1.x、Spark 2.0.x、Spark 2.1.x 和 2.2.x 版本
  • Spark 2.3.0 到 2.3.2

描述

在 Spark 2.3.3 之前,在某些情况下,Spark 会将用户数据未加密地写入本地磁盘,即使 spark.io.encryption.enabled=true 也是如此。 这包括提取到磁盘的缓存块(由 spark.maxRemoteBlockSizeFetchToMem 控制); 在 SparkR 中,使用 parallelize; 在 Pyspark 中,使用 broadcast 和 parallelize; 以及 python udfs 的使用。

缓解措施

  • 1.x、2.0.x、2.1.x、2.2.x、2.3.x 用户应升级到 2.3.3 或更高版本,包括 2.4.x

鸣谢

  • 此问题由 NVIDIA 的 Thomas Graves 报告。

CVE-2018-11760:Apache Spark 本地权限提升漏洞

严重性:重要

供应商:Apache 软件基金会

受影响的版本

  • 所有 Spark 1.x、Spark 2.0.x 和 Spark 2.1.x 版本
  • Spark 2.2.0 到 2.2.2
  • Spark 2.3.0 到 2.3.1

描述

使用 PySpark 时,不同的本地用户可以连接到 Spark 应用程序并模拟运行 Spark 应用程序的用户。 这会影响版本 1.x、2.0.x、2.1.x、2.2.0 到 2.2.2 以及 2.3.0 到 2.3.1。

缓解措施

  • 1.x、2.0.x、2.1.x 和 2.2.x 用户应升级到 2.2.3 或更高版本
  • 2.3.x 用户应升级到 2.3.2 或更高版本
  • 否则,受影响的用户应避免在多用户环境中使用 PySpark。

鸣谢

  • Luca Canali 和 Jose Carlos Luna Duran,CERN

CVE-2018-17190:不安全的 Apache Spark 独立执行用户代码

严重性:低

供应商:Apache 软件基金会

受影响的版本

  • 所有版本的 Apache Spark

描述

Spark 的独立资源管理器接受要执行在“master”主机上的代码,然后该代码在“worker”主机上运行。 按照设计,master 本身不执行用户代码。 但是,一个精心制作的到 master 的请求也会导致 master 执行代码。 请注意,这不会影响启用了身份验证的独立集群。 虽然 master 主机通常比 worker 主机对其他资源的传出访问权限少,但在 master 上执行代码仍然是意料之外的。

缓解措施

在任何未以其他方式受到保护而免受不必要访问的 Spark 独立集群上启用身份验证,例如通过网络级限制。 使用 spark.authenticate 以及 https://spark.apache.org/docs/latest/security.html 中描述的相关安全属性

鸣谢

  • Andre Protas,Apple 信息安全

CVE-2018-11804:Apache Spark build/mvn 运行锌,并可能暴露来自构建机器的信息

严重性:低

供应商:Apache 软件基金会

受影响的版本

  • 2.1.x 发布分支及更早版本
  • Spark 2.2.3 之前的 2.2.x 发布分支
  • Spark 2.3.3 之前的 2.3.x 发布分支

描述

Spark 基于 Apache Maven 的构建包含一个方便的脚本“build/mvn”,该脚本下载并运行一个锌服务器以加速编译。 默认情况下,此服务器将接受来自外部主机的连接。 一个精心制作的到锌服务器的请求可能会导致它泄露构建运行开发者帐户可读的文件中的信息。 请注意,此问题不会影响 Spark 的最终用户,只会影响从源代码构建 Spark 的开发者。

缓解措施

  • Spark 用户不受影响,因为锌只是构建过程的一部分。
  • Spark 开发者可以简单地使用本地 Maven 安装的“mvn”命令来构建,并避免运行 build/mvn 和锌。
  • 正在积极开发分支(2.2.x、2.3.x、2.4.x、master)的 Spark 开发者可以更新他们的分支以接收已修补到 build/mvn 脚本上的缓解措施
  • 单独运行锌的 Spark 开发者可以在其命令行中包含“-server 127.0.0.1”,并考虑额外的标志,如“-idle-timeout 30m”,以实现类似的缓解。

鸣谢

  • Andre Protas,Apple 信息安全

CVE-2018-11770:Apache Spark 独立 master,Mesos REST API 不受身份验证控制

严重性:中

供应商:Apache 软件基金会

受影响的版本

  • 从 1.3.0 版本的 Spark 开始,启用了 REST API 的独立 Master 运行模式,或者启用了集群模式的 Mesos Master 运行模式;建议的缓解措施已在 Spark 2.4.0 中解决了此问题。

描述

从 1.3.0 版本开始,Spark 的独立 Master 除了 spark-submit 使用的提交机制外,还公开了一个用于作业提交的 REST API。在独立模式下,配置属性 spark.authenticate.secret 建立了一个共享密钥,用于验证通过 spark-submit 提交作业的请求。但是,REST API 不使用此密钥或任何其他身份验证机制,并且这没有得到充分的文档说明。在这种情况下,用户可以使用 REST API 运行驱动程序,而无需进行身份验证,但无法启动执行器。当设置为以集群模式运行时(即,同时运行 MesosClusterDispatcher 时),Mesos 也会使用此 REST API 来进行作业提交。未来版本的 Spark 将改进有关这些点的文档,并禁止在运行 REST API 时设置 spark.authenticate.secret,以明确说明这一点。未来的版本还将通过将 spark.master.rest.enabled 的默认值更改为 false,在独立 Master 中默认禁用 REST API。

缓解措施

对于独立 Master,如果未使用 REST API,请将 spark.master.rest.enabled 设置为 false 以禁用 REST API,和/或确保对 REST API 的所有网络访问(默认端口 6066)都仅限于受信任的主机才能提交作业。Mesos 用户可以停止 MesosClusterDispatcher,但这会阻止他们在集群模式下运行作业。或者,他们可以确保对 MesosRestSubmissionServer(默认端口 7077)的访问仅限于受信任的主机。

鸣谢

  • Imran Rashid, Cloudera
  • 张峰伟, 阿里云安全团队

CVE-2018-8024: Apache Spark UI 中的 XSS 漏洞

严重性:中

受影响的版本

  • Spark 2.1.0 到 2.1.2
  • Spark 2.2.0 到 2.2.1
  • Spark 2.3.0

描述

在 Apache Spark 2.1.0 到 2.1.2、2.2.0 到 2.2.1 和 2.3.0 中,恶意用户可以构造一个指向 Spark 集群 UI 的作业和阶段信息页面的 URL,如果用户被欺骗访问该 URL,则可能导致脚本执行并暴露用户从 Spark UI 看到的信息。虽然某些浏览器(如最新版本的 Chrome 和 Safari)能够阻止此类攻击,但当前版本的 Firefox(以及可能其他浏览器)则不能。

缓解措施

  • 2.1.x 用户应升级到 2.1.3 或更高版本
  • 2.2.x 用户应升级到 2.2.2 或更高版本
  • 2.3.x 用户应升级到 2.3.1 或更高版本

鸣谢

  • Spencer Gietzen, Rhino Security Labs

CVE-2018-1334: Apache Spark 本地提权漏洞

严重性:高

供应商:Apache 软件基金会

受影响的版本

  • Spark 版本到 2.1.2
  • Spark 2.2.0 到 2.2.1
  • Spark 2.3.0

描述

在 Apache Spark 直到并包括 2.1.2、2.2.0 到 2.2.1 和 2.3.0 中,当使用 PySpark 或 SparkR 时,不同的本地用户可以连接到 Spark 应用程序并模拟运行 Spark 应用程序的用户。

缓解措施

  • 1.x、2.0.x 和 2.1.x 用户应升级到 2.1.3 或更高版本
  • 2.2.x 用户应升级到 2.2.2 或更高版本
  • 2.3.x 用户应升级到 2.3.1 或更高版本
  • 否则,受影响的用户应避免在多用户环境中使用 PySpark 和 SparkR。

鸣谢

  • Nehmé Tohmé, Cloudera, Inc.

CVE-2017-12612 Apache Spark 启动器 API 中的不安全反序列化

JIRA: SPARK-20922

严重性:中

供应商:Apache 软件基金会

受影响的版本

  • Apache Spark 的 1.6.0 到 2.1.1 版本

描述

在 Apache Spark 1.6.0 到 2.1.1 中,启动器 API 对其套接字接收的数据执行不安全的反序列化。 这使得使用启动器 API 以编程方式启动的应用程序可能会受到攻击者的任意代码执行攻击,该攻击者可以访问本地计算机上的任何用户帐户。 它不会影响 spark-submit 或 spark-shell 运行的应用程序。 攻击者将能够以运行 Spark 应用程序的用户身份执行代码。 建议用户更新到 2.1.2、2.2.0 或更高版本。

缓解措施

更新到 Apache Spark 2.1.2、2.2.0 或更高版本。

鸣谢

  • Aditya Sharad, Semmle

CVE-2017-7678 Apache Spark XSS Web UI MHTML 漏洞

JIRA: SPARK-20393

严重性:中

供应商:Apache 软件基金会

受影响的版本

  • Apache Spark 的 2.1.2、2.2.0 之前的版本

描述

攻击者有可能利用用户对服务器的信任,诱骗他们访问指向共享 Spark 集群的链接,并将包括 MHTML 在内的数据提交给 Spark Master 或历史服务器。 然后,此数据(可能包含脚本)将被反映回用户,并且可能被基于 MS Windows 的客户端评估和执行。 这不是对 Spark 本身的攻击,而是对用户的攻击,当查看 Spark Web UI 的元素时,用户可能会不小心执行该脚本。

缓解措施

更新到 Apache Spark 2.1.2、2.2.0 或更高版本。

示例

请求

GET /app/?appId=Content-Type:%20multipart/related;%20boundary=_AppScan%0d%0a--
_AppScan%0d%0aContent-Location:foo%0d%0aContent-Transfer-
Encoding:base64%0d%0a%0d%0aPGh0bWw%2bPHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD48L2h0bWw%2b%0d%0a
HTTP/1.1

响应摘录

<div class="row-fluid">No running application with ID Content-Type: multipart/related;
boundary=_AppScan
--_AppScan
Content-Location:foo
Content-Transfer-Encoding:base64
PGh0bWw+PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD48L2h0bWw+
</div>

结果:在上面的有效负载中,BASE64 数据解码为

<html><script>alert("XSS")</script></html>

鸣谢

  • Mike Kasper, Nicholas Marion
  • IBM z Systems Center for Secure Engineering
最新消息

存档