セキュリティモデル

Apache Sparkで期待できるセキュリティプロパティと、さまざまなセキュリティ機能の設定方法については、Spark Securityのドキュメントを参照してください。

セキュリティ問題の報告

Apache Sparkは、脆弱性の報告に関して、Apache Security Teamによって概説されている標準プロセスを使用します。プロジェクトが応答するまで、脆弱性は公に開示されるべきではないことに注意してください。

セキュリティ上の脆弱性の可能性を報告するには、security@spark.apache.orgにメールを送信してください。これは非公開のメーリングリストであり、Apache SecurityチームおよびSpark PMCに届きます。

よくある質問

Apache Sparkのセキュリティ分析中に、Sparkがリモートコード実行を許可することに気づきました。これは問題ですか?

いいえ、これはそれ自体では問題または脆弱性とは見なされません。なぜなら、リモートコード実行はApache Sparkの設計と目的に不可欠だからです。ユーザーはSparkジョブでコードを送信でき、そのコードは、実行できるコードを制限しようとすることなく、無条件に実行されます。他のプロセスを開始したり、ネットワーク接続を確立したり、ローカルファイルにアクセスしたり変更したりすることが可能です。Sparkクラスタを使用できるユーザーは、一般的に、リソースマネージャー(YARN、Kubernetesなど)によってSparkアプリケーションに割り当てられたリソースをすでに完全に制御しています。

過去には、多数のコード実行脆弱性レポートを受け取りましたが、これらは設計によるものとして却下しました。プロビジョニングされたアプリケーションリソースへの完全なアクセスは期待されます。ただし、ユーザーアプリケーションがリソースマネージャーによってプロビジョニングされたリソースの外部のリソースに影響を与えることは期待されていません。

Sparkクラスタ(UIおよび送信エンドポイントを含む)をインターネットまたは信頼できないネットワークに直接公開することは強く推奨しません。信頼されたネットワーク(会社のイントラネット、プライベートクラウド環境)内でのアクセスを推奨します。堅牢な認証、認可、およびネットワーク制御を使用してSparkクラスタへのアクセスを制限してください。

既知のセキュリティ問題

CVE-2023-32007: Spark UIを介したApache Sparkシェルコマンドインジェクションの脆弱性

このCVEは、バージョン3.1.3も影響を受けることを明確にするためのCVE-2022-33891の更新にすぎません。それ以外は新しい脆弱性ではありません。Apache Spark 3.1.xは現在EOLであることに注意してください。

CVE-2023-22946: Apache Sparkプロキシユーザー、悪意のある設定クラスからの権限昇格

深刻度: 中

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • 3.4.0より前のバージョン

説明

Apache Spark 3.4.0より前のバージョンでは、spark-submitを使用するアプリケーションは「proxy-user」を指定して実行できますが、権限は制限されます。ただし、悪意のある設定関連クラスをクラスパスに提供することで、アプリケーションは送信ユーザーの権限でコードを実行できます。これは、Apache Livyを使用して送信アプリケーションを管理するなどの、プロキシユーザーに依存するアーキテクチャに影響します。

この問題はSPARK-41958として追跡されています

緩和策

  • Apache Spark 3.4.0以降にアップデートし、spark.submit.proxyUser.allowCustomClasspathInClusterModeがデフォルトの「false」に設定されており、送信アプリケーションによって上書きされていないことを確認してください。

クレジット

  • 古江 秀幸(発見者)
  • Yi Wu (Databricks)(修正開発者)

CVE-2022-31777: Spark UIのログビューアにおけるApache Spark XSS脆弱性(JavaScript)

深刻度: 中

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • 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シェルコマンドインジェクションの脆弱性

深刻度: 重要

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • 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シェルコマンドを構築し、それを実行する権限チェック関数に到達できる可能性があります。これにより、Sparkが現在実行されているユーザーとして任意のシェルコマンドが実行されます。

緩和策

  • Spark 3.2.2、または3.3.0以降にアップデートしてください

クレジット

  • Kostya Torchinsky (Databricks)

CVE-2021-38296: Apache Spark™ キーネゴシエーションの脆弱性

深刻度: 中

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • Apache Spark 3.1.2およびそれ以前

説明

Apache Sparkは、spark.authenticateおよびspark.network.crypto.enabledを介してRPC接続のエンドツーエンド暗号化をサポートします。バージョン3.1.2以前では、独自の相互認証プロトコルを使用しており、完全な暗号化キーの復旧が可能です。初期のインタラクティブ攻撃の後、これによりオフラインで平文トラフィックを復号化できるようになります。これは、spark.authenticate.enableSaslEncryption、spark.io.encryption.enabled、spark.ssl、spark.ui.strictTransportSecurityによって制御されるセキュリティメカニズムには影響しないことに注意してください。

緩和策

  • Spark 3.1.3以降にアップデートしてください

クレジット

  • Steve Weis (Databricks)

CVE-2020-9480: 認証が有効なスタンドアロンマスターにおけるApache Spark™ RCE脆弱性

深刻度: 重要

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • Apache Spark 2.4.5およびそれ以前

説明

Apache Spark 2.4.5以前では、スタンドアロンリソースマネージャーのマスターは、共有シークレットを介した認証(spark.authenticate)を要求するように構成できます。ただし、有効になっている場合、マスターへの特別に細工されたRPCは、共有キーなしでも、Sparkクラスタ上でアプリケーションのリソースを開始することに成功する可能性があります。これは、ホストマシン上でシェルコマンドを実行するために悪用される可能性があります。

これは、他のリソースマネージャー(YARN、Mesosなど)を使用するSparkクラスタには影響しません。

緩和策

  • ユーザーはSpark 2.4.6または3.0.0にアップデートしてください。
  • 可能な限り、クラスタマシンへのネットワークアクセスは、信頼できるホストのみに制限してください。

クレジット

  • Ayoub Elaassal

CVE-2019-10099: Apache Spark™ ローカルディスク上の暗号化されていないデータ

深刻度: 重要

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • すべての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 udfの使用が含まれます。

緩和策

  • 1.x、2.0.x、2.1.x、2.2.xユーザーは、2.3.3以降(2.4.xを含む)にアップグレードしてください

クレジット

  • この問題はNVIDIAのThomas Gravesによって報告されました。

CVE-2018-11760: Apache Spark™ ローカル権限昇格の脆弱性

深刻度: 重要

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • すべての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™スタンドアロンがユーザーコードを実行

深刻度: 低

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • Apache Sparkのすべてのバージョン

説明

Sparkのスタンドアロンリソースマネージャーは、'master'ホストでコードを実行するためのコードを受け入れ、そのコードを'worker'ホストで実行します。マスター自体は、設計上、ユーザーコードを実行しません。ただし、マスターへの特別に細工されたリクエストにより、マスターもコードを実行する可能性があります。これは、認証が有効になっているスタンドアロンクラスタには影響しないことに注意してください。マスターホストは通常、ワーカーよりも他のリソースへのアウトバウンドアクセスが少ないですが、マスターでのコード実行はそれでも予期しないことです。

緩和策

認証が有効になっていないSparkスタンドアロンクラスタは、たとえばネットワークレベルの制限によって、セキュリティが保護されていない場合は、認証を有効にしてください。spark.authenticateおよびhttps://spark.dokyumento.jp/docs/latest/security.htmlで説明されている関連セキュリティプロパティを使用してください。

クレジット

  • Andre Protas, Apple Information Security

CVE-2018-11804: Apache Spark™ build/mvnはzincを実行し、ビルドマシンからの情報を公開する可能性があります

深刻度: 低

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • 2.1.xリリースブランチおよびそれ以前
  • Spark 2.2.3より前の2.2.xリリースブランチ
  • Spark 2.3.3より前の2.3.xリリースブランチ

説明

SparkのApache Mavenベースのビルドには、コンパイルを高速化するためにzincサーバーをダウンロードして実行する便利なスクリプト「build/mvn」が含まれています。このサーバーはデフォルトで外部ホストからの接続を受け入れます。zincサーバーへの特別に細工されたリクエストにより、ビルドを実行している開発者アカウントが読み取れるファイル内の情報が公開される可能性があります。この問題はSparkのエンドユーザーには影響せず、ソースコードからSparkをビルドする開発者のみに影響することに注意してください。

緩和策

  • zincはビルドプロセスの一部にすぎないため、Sparkユーザーは影響を受けません。
  • Spark開発者は、ローカルMavenインストールの「mvn」コマンドを使用してビルドし、build/mvnおよびzincの実行を避けることができます。
  • アクティブに開発されているブランチ(2.2.x、2.3.x、2.4.x、master)をビルドしているSpark開発者は、ビルド/mvnスクリプトにすでにパッチ適用されている軽減策を受け取るためにブランチを更新できます。
  • 個別にzincを実行しているSpark開発者は、コマンドラインに「-server 127.0.0.1」を含め、同様の緩和策を達成するために「-idle-timeout 30m」のような追加フラグを検討できます。

クレジット

  • Andre Protas, Apple Information Security

CVE-2018-11770: Apache Spark™ スタンドアロンマスター、Mesos REST APIは認証によって制御されない

深刻度: 中

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • Sparkバージョン1.3.0以降、REST APIが有効なスタンドアロンマスターを実行している場合、またはクラスタモードが有効なMesosマスターを実行している場合。示唆された緩和策は、Spark 2.4.0時点で問題を解決しました。

説明

バージョン1.3.0以降、Sparkのスタンドアロンマスターは、spark-submitによって使用される送信メカニズムに加えて、ジョブ送信用のREST APIを公開します。スタンドアロンでは、設定プロパティspark.authenticate.secretは、spark-submitを介してジョブを送信するリクエストの認証用の共有シークレットを確立します。ただし、REST APIはこのメカニズムまたは他の認証メカニズムを使用せず、これは十分に文書化されていません。この場合、ユーザーは認証なしでドライバプログラムを実行できますが、REST APIを使用してエグゼキュータを起動することはできません。このREST APIは、クラスタモード(つまり、MesosClusterDispatcherも実行している場合)で実行するように設定されている場合、Mesosによってもジョブ送信に使用されます。Sparkの将来のバージョンでは、これらの点に関するドキュメントが改善され、REST APIの実行時にspark.authenticate.secretを設定することが禁止され、これが明確になります。将来のバージョンでは、spark.master.rest.enabledのデフォルト値をfalseに変更することにより、スタンドアロンマスターでREST APIが無効になります。

緩和策

スタンドアロンマスターの場合、未使用の場合はspark.master.rest.enabledをfalseに設定してREST APIを無効にするか、REST API(デフォルトでポート6066)へのすべてのネットワークアクセスがジョブ送信を信頼できるホストに制限されていることを確認してください。MesosユーザーはMesosClusterDispatcherを停止できますが、これによりクラスタモードでジョブを実行できなくなります。または、MesosRestSubmissionServer(デフォルトでポート7077)へのアクセスが信頼できるホストに制限されていることを確認できます。

クレジット

  • Imran Rashid, Cloudera
  • Fengwei Zhang, Alibaba Cloud Security Team

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™ ローカル権限昇格の脆弱性

深刻度: 高

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • 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

深刻度: 中

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • 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

深刻度: 中

ベンダー: The Apache Software Foundation

影響を受けるバージョン

  • Apache Spark 2.1.2、2.2.0より前のバージョン

説明

攻撃者は、ユーザーのサーバーへの信頼を利用して、共有SparkクラスタにリンクされたURLにアクセスするように騙し、MHTMLを含むデータをSparkマスターまたは履歴サーバーに送信させることが可能です。このデータにはスクリプトが含まれている可能性があり、ユーザーに反映され、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