有关 Apache Spark 期望的安全属性以及如何配置各种安全功能的信息,请参阅Spark 安全文档。
Apache Spark 采用Apache 安全团队概述的标准流程来报告漏洞。请注意,在项目作出回应之前,不应公开披露漏洞。
要报告可能的安全漏洞,请发送电子邮件至 security@spark.apache.org
。这是一个非公开列表,邮件将发送给 Apache 安全团队以及 Spark PMC。
不,这本身不被视为一个问题或漏洞,因为远程代码执行是 Apache Spark 设计和宗旨的基础。用户可以在 Spark 作业中提交代码,这些代码将被无条件执行,不会尝试限制可以运行的代码。启动其他进程、建立网络连接或访问和修改本地文件都是可能的。任何能够使用 Spark 集群的人通常已经对资源管理器(YARN、Kubernetes 等)分配给其 Spark 应用程序的资源拥有完全控制权。
从历史上看,我们收到了大量代码执行漏洞报告,但我们都予以拒绝了,因为这是设计使然。我们期望用户可以完全访问已配置的应用程序资源;但是,用户应用程序不应影响其资源管理器所配置资源之外的资源。
我们强烈不建议将 Spark 集群(包括 UI 和提交端点)直接暴露给公共互联网或不受信任的网络。我们建议在受信任的网络(公司内网、私有云环境)内部访问,并通过强大的身份验证、授权和网络控制来限制对 Spark 集群的访问。
此 CVE 仅是CVE-2022-33891的更新,旨在澄清 3.1.3 版本也受影响。它本身并非新的漏洞。请注意,Apache Spark 3.1.x 现已 EOL(生命周期结束)。
严重程度:中
供应商:Apache 软件基金会
受影响版本
描述
在 Apache Spark 3.4.0 之前的版本中,使用 spark-submit 的应用程序可以指定一个“代理用户”来运行,从而限制权限。但是,应用程序可以通过在 classpath 上提供恶意配置相关类,以提交用户的权限执行代码。这会影响依赖代理用户的架构,例如那些使用 Apache Livy 管理提交应用程序的架构。
此问题正在作为 SPARK-41958 进行追踪
缓解措施
spark.submit.proxyUser.allowCustomClasspathInClusterMode
设置为其默认值“false”,且未被提交的应用程序覆盖。致谢
严重程度:中
供应商:Apache 软件基金会
受影响版本
描述
Apache Spark 3.2.1 及更早版本以及 3.3.0 中存在一个存储型跨站脚本 (XSS) 漏洞,允许远程攻击者通过在日志中包含恶意 payload,并在 UI 中渲染日志时,在用户的网络浏览器中执行任意 JavaScript。
缓解措施
致谢
严重程度:重要
供应商:Apache 软件基金会
受影响版本
描述
Apache Spark UI 提供了通过配置选项 spark.acls.enable 启用 ACL 的可能性。通过身份验证过滤器,这会检查用户是否具有查看或修改应用程序的访问权限。如果启用了 ACL,HttpSecurityFilter 中的代码路径可能允许某人通过提供任意用户名来执行模拟。恶意用户可能能够达到权限检查功能,该功能最终将根据其输入构建 Unix shell 命令并执行它。这将导致以 Spark 当前运行的用户身份执行任意 shell 命令。
缓解措施
致谢
严重程度:中
供应商:Apache 软件基金会
受影响版本
描述
Apache Spark 通过 spark.authenticate
和 spark.network.crypto.enabled
支持 RPC 连接的端到端加密。在 3.1.2 及更早版本中,它使用一种定制的相互认证协议,允许完全恢复加密密钥。在初始交互式攻击后,这会允许某人离线解密明文流量。请注意,这不影响由 spark.authenticate.enableSaslEncryption
、spark.io.encryption.enabled
、spark.ssl
、spark.ui.strictTransportSecurity
控制的安全机制。
缓解措施
致谢
严重程度:重要
供应商:Apache 软件基金会
受影响版本
描述
在 Apache Spark 2.4.5 及更早版本中,独立资源管理器的主节点可能被配置为通过共享密钥要求身份验证 (spark.authenticate
)。然而,当启用时,即使没有共享密钥,对主节点的特制 RPC 也可以成功在 Spark 集群上启动应用程序资源。这可以被利用来在主机上执行 shell 命令。
这不影响使用其他资源管理器(YARN、Mesos 等)的 Spark 集群。
缓解措施
致谢
严重程度:重要
供应商:Apache 软件基金会
受影响版本
描述
在 Spark 2.3.3 之前,在某些情况下,即使 spark.io.encryption.enabled=true
,Spark 也会将用户数据未加密地写入本地磁盘。这包括获取到磁盘的缓存块(由 spark.maxRemoteBlockSizeFetchToMem
控制);在 SparkR 中使用 parallelize;在 PySpark 中使用 broadcast 和 parallelize;以及使用 python UDF。
缓解措施
致谢
严重程度:重要
供应商:Apache 软件基金会
受影响版本
描述
使用 PySpark 时,不同的本地用户有可能连接到 Spark 应用程序并模拟运行 Spark 应用程序的用户。这会影响 1.x、2.0.x、2.1.x、2.2.0 至 2.2.2 以及 2.3.0 至 2.3.1 版本。
缓解措施
致谢
严重程度:低
供应商:Apache 软件基金会
受影响版本
描述
Spark 的独立资源管理器接受在“master”主机上执行的代码,然后该代码在“worker”主机上运行。master 本身按设计不执行用户代码。但是,对 master 的特制请求可能会导致 master 也执行代码。请注意,这不影响启用了身份验证的独立集群。尽管 master 主机对其他资源的出站访问通常少于 worker,但 master 上执行代码仍然是意外的。
缓解措施
在任何未通过网络级限制等方式进行额外保护的 Spark 独立集群上启用身份验证。使用 spark.authenticate
和 https://spark.apache.org/docs/latest/security.html 中描述的相关安全属性。
致谢
严重程度:低
供应商:Apache 软件基金会
受影响版本
描述
Spark 基于 Apache Maven 的构建包含一个便捷脚本“build/mvn”,它会下载并运行一个 zinc 服务器以加速编译。此服务器默认接受来自外部主机的连接。对 zinc 服务器的特制请求可能导致它泄露开发人员账户可读文件中的信息。请注意,此问题不影响 Spark 的最终用户,只影响从源代码构建 Spark 的开发人员。
缓解措施
致谢
严重程度:中
供应商:Apache 软件基金会
受影响版本
描述
从 1.3.0 版本起,除了 spark-submit
使用的提交机制外,Spark 的独立主节点还暴露了一个用于作业提交的 REST API。在独立模式下,配置属性 spark.authenticate.secret
建立了一个共享密钥,用于通过 spark-submit
提交作业的请求进行身份验证。但是,REST API 不使用此或其他任何身份验证机制,并且这一点未充分记录。在这种情况下,用户将能够在不进行身份验证的情况下运行驱动程序,但不能使用 REST API 启动执行器。Mesos 在设置为集群模式(即,当也运行 MesosClusterDispatcher
时)时也使用此 REST API 进行作业提交。未来版本的 Spark 将改进这些点的文档,并禁止在运行 REST API 时设置 spark.authenticate.secret
,以明确这一点。未来版本还将通过将 spark.master.rest.enabled
的默认值更改为 false
,从而默认禁用独立主节点中的 REST API。
缓解措施
对于独立主节点,如果未使用 REST API,则通过将 spark.master.rest.enabled
设置为 false
来禁用它,并且/或者确保所有对 REST API(默认为端口 6066)的网络访问仅限于受信任的提交作业主机。Mesos 用户可以停止 MesosClusterDispatcher
,但这将阻止他们在集群模式下运行作业。或者,他们可以确保对 MesosRestSubmissionServer
(默认为端口 7077)的访问仅限于受信任的主机。
致谢
严重程度:中
受影响版本
描述
在 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(可能还有其他浏览器)则不能。
缓解措施
致谢
严重程度:高
供应商:Apache 软件基金会
受影响版本
描述
在 Apache Spark 直到 2.1.2(包括此版本)、2.2.0 至 2.2.1 和 2.3.0 版本中,使用 PySpark 或 SparkR 时,不同的本地用户有可能连接到 Spark 应用程序并模拟运行 Spark 应用程序的用户。
缓解措施
致谢
JIRA:SPARK-20922
严重程度:中
供应商:Apache 软件基金会
受影响版本
描述
在 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 或更高版本。
致谢
JIRA:SPARK-20393
严重程度:中
供应商:Apache 软件基金会
受影响版本
描述
攻击者可以利用用户对服务器的信任,诱骗他们访问指向共享 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>
结果:在上述 payload 中,BASE64 数据解码为
<html><script>alert("XSS")</script></html>
致谢