安全模型

有关 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 集群的访问。

加载机器学习模型是否安全?谁负责模型安全?

加载 Apache Spark ML 模型等同于在 Spark 运行时中加载和执行代码。

Spark ML 模型可能包含序列化对象、自定义转换器、用户定义的表达式和执行图。在模型加载期间,Spark 会反序列化这些组件、重构管道并实例化运行时对象。此过程可以在 Spark Driver 和 Executor 上调用可执行逻辑。任何模型,尤其是那些被篡改或故意怀有恶意创建的模型,都可能执行任意代码、访问敏感数据或破坏集群节点。

最终用户在处理 Spark ML 模型时,必须给予与任何第三方软件相同水平的谨慎和安全审查。这包括在加载或部署模型之前验证来源、验证完整性,并应用适当的隔离和安全控制措施。

已知安全问题

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

此 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 的应用程序可以指定一个“代理用户”(proxy-user)来运行,从而限制权限。然而,通过在类路径(classpath)中提供恶意配置相关的类,应用程序可以以提交用户的权限执行代码。这会影响依赖代理用户的架构,例如使用 Apache Livy 管理提交应用程序的架构。

此问题在 SPARK-41958 中进行追踪

缓解措施

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

致谢

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

CVE-2022-31777:日志查看器 UI Javascript 中的 Apache Spark XSS 漏洞

严重程度:中

供应商: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:通过 Spark UI 实现的 Apache Spark shell 命令注入漏洞

严重程度:重要

供应商: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:在启用身份验证的独立 Master 中存在的 Apache Spark™ RCE 漏洞

严重程度:重要

供应商:Apache 软件基金会

受影响版本

  • Apache Spark 2.4.5 及更早版本

描述

在 Apache Spark 2.4.5 及更早版本中,独立资源管理器的 Master 可能被配置为需要通过共享密钥进行身份验证 (spark.authenticate)。然而,启用后,发送给 Master 的特制 RPC 即使没有共享密钥也能成功在 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.io.encryption.enabled=true,Spark 也会将用户数据未加密地写入本地磁盘。这包括被提取到磁盘的缓存块(由 spark.maxRemoteBlockSizeFetchToMem 控制);在 SparkR 中使用 parallelize;在 Pyspark 中使用 broadcast 和 parallelize;以及使用 python UDF 时。

缓解措施

  • 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 运行 zinc,并可能暴露构建机器的信息

严重程度:低

供应商:Apache 软件基金会

受影响版本

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

描述

Spark 基于 Apache Maven 的构建包含一个便捷脚本“build/mvn”,它会下载并运行 zinc 服务器以加速编译。该服务器默认接受来自外部主机的连接。对 zinc 服务器的特制请求可能使其泄露运行构建的开发者账户可读取的文件中的信息。请注意,此问题不影响 Spark 终端用户,仅影响从源代码构建 Spark 的开发者。

缓解措施

  • Spark 用户不受影响,因为 zinc 仅是构建过程的一部分。
  • Spark 开发者只需使用本地 Maven 安装的“mvn”命令进行构建,即可避免运行 build/mvn 和 zinc。
  • 构建活跃分支(2.2.x、2.3.x、2.4.x、master)的 Spark 开发者可以更新其分支,以接收已修补到 build/mvn 脚本中的缓解措施。
  • 单独运行 zinc 的 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 版本起,运行启用了 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 运行驱动程序,但无法启动 Executor。当设置为在集群模式下运行(即同时运行 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(默认端口 6066)的所有网络访问仅限于受信任提交作业的主机。Mesos 用户可以停止 MesosClusterDispatcher,尽管这将阻止他们以集群模式运行作业。或者,他们可以确保对 MesosRestSubmissionServer(默认端口 7077)的访问仅限于受信任的主机。

致谢

  • Imran Rashid, Cloudera
  • Fengwei Zhang, 阿里云安全团队

CVE-2018-8024:UI 中的 Apache Spark™ 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 软件基金会

受影响版本

  • 1.6.0 至 2.1.1 版本的 Apache Spark

描述

在 1.6.0 至 2.1.1 版本的 Apache Spark 中,启动器 API(launcher API)会对 socket 接收到的数据执行不安全的反序列化。这使得使用启动器 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™ Web UI MHTML XSS 漏洞

JIRA: SPARK-20393

严重程度:中

供应商:Apache 软件基金会

受影响版本

  • 2.1.2、2.2.0 之前的 Apache Spark 版本

描述

攻击者可以利用用户对服务器的信任,诱导其访问指向共享 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