
Apache Spark 4.2.0 - Hoch - Remote - Privilegien-Rest - proxy-user defaultExtraClassPath
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · spark-proxyuser-classpath
Write-up: https://abraxaslabs.tech/research/spark-proxyuser-classpath
Klasse: Privilegien-Überbleibsel (Überbleibsel von CVE-2023-22946 / SPARK-41958) Reichweite: Remote
Apache Spark 4.2.0 (32f72996) - Apache Software Foundation
CVE-2023-22946 / SPARK-41958 setzt spark.submit.proxyUser.allowCustomClasspathInClusterMode weiterhin standardmäßig auf false und führt bei --proxy-user-Cluster-Submits weiterhin childClasspath.clear() aus. Das ist der öffentliche YARN---jars-Pfad. Spark 4.0 fügte dann spark.driver.defaultExtraClassPath hinzu. Der Launcher stellt diesen Schlüssel immer dem -cp der spark-submit-JVM voran, auch im Cluster-Modus. SPARK-41958 bekommt ihn nie zu sehen.
Ein Tenant im Livy-Stil kann weiterhin ein bereitgestelltes Jar innerhalb der spark-submit-JVM des Gateways laden. Hadoops UserGroupInformation.doAs ändert diese Unix-UID nicht.
| ID | noch keine CVE |
| Klasse | Privilegien-Überbleibsel (Überbleibsel von CVE-2023-22946 / SPARK-41958) |
| Reichweite | Remote (Livy-artiger --proxy-user-Job-Submit über das Gateway) |
| CWE | CWE-269, CWE-427 |
| CVSS | Hoch: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Produkt | Apache Spark |
| Betroffen | Apache Spark 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) |
| Auth | authentifizierter Tenant eines Gateways im Livy-/Kyuubi-/Oozie-Stil, das --conf und bereitgestellte --jars an spark-submit --proxy-user ... --deploy-mode cluster weiterreicht |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18950. Witness-Datei. Gadget der zitierten Launcher-/Submit-Durchläufe. |
Ein Tenant-Konto auf einem mandantenfähigen Spark-Gateway (Livy, Kyuubi, Oozie und Verwandte) besitzen, das spark-submit --proxy-user <tenant> --deploy-mode cluster unter einer Superuser-UID ausführt. Ein Jar bereitstellen, das die Gateway-JVM öffnen kann. --conf spark.driver.defaultExtraClassPath=<staged jar> senden. Die SPARK-41958-Sperre kann auf false bleiben. Das konstruierte spark-submit -cp beginnt trotzdem mit diesem Jar. Klassen darin werden unter der Unix-UID des Gateways geladen.
--conf spark.submit.proxyUser.allowCustomClasspathInClusterMode=true ist ein zweiter Durchlauf: .internal() ist nur dokumentiert, --conf schreibt den Schlüssel dennoch, und der YARN-Cluster behält dann --jars in childClasspath. Die öffentliche CVE-2023-22946 bleibt der YARN-Standard---jars-Pfad, den clear() bereits abdeckt. Dieses Überbleibsel ist das ungeschützte defaultExtraClassPath.
Die Hadoop-Impersonation nach einem sauberen Submit ist weiterhin der Proxy-Benutzer für den YARN-AM-/k8s-Treiber. Dieses Überbleibsel betrifft nur die Gateway-JVM.
| Methode | Sink | Recon | Integrität | Verfügbarkeit | Provenienz |
|---|---|---|---|---|---|
Livy-artiges Submit --proxy-user + yarn/k8s/standalone Cluster + --conf spark.driver.defaultExtraClassPath=<staged local jar>, SPARK-41958-Flag bleibt false | SparkSubmitCommandBuilder.buildSparkSubmitCommand SparkSubmitCommandBuilder.java:317-327 -cp erster Eintrag | Dateien auflisten/lesen, die die Gateway-UID lesen kann (Keytab-Verzeichnis, spark-defaults, lokales Staging). Die Hadoop-Identität späterer RPCs ist weiterhin der Proxy-Benutzer. | Tenant-Klassen innerhalb der spark-submit-JVM laden. Die Unix-UID bleibt das Gateway (Hadoop-Proxy-Superuser). Lab: defaultExtraClassPath-on-cp=yes childClasspath-cleared=yes lab.WitnessMain schrieb SPARK-PROXYUSER-CLASSPATH-WITNESS. Abgeleitet aus der öffentlichen CVE-Klasse: Hadoop-Configuration-Resource-Overlay / FileSystem-Impl-Lookup als diese UID. | Submit-JVM-Absturz, falls das Overlay eine Exception wirft. Nicht die Klasse. | Lab-belegtes Laden + Witness-Schreiben als konstruiertes -cp. Hadoop-Overlay abgeleitet. Livy/Kyuubi---conf-Passthrough abgeleitet (diese Trees sind nicht dieser Pin). |
Gleiches Submit mit --conf spark.submit.proxyUser.allowCustomClasspathInClusterMode=true plus --jars / primäre Ressource | SparkSubmit.prepareSubmitEnvironment SparkSubmit.scala:333-336,738-743,917-924 dann runMain :980-987 | Gleiches Recon wie Walk A, auf dem Child-URLClassLoader statt dem System-Loader. | --jars auf childClasspath belassen, damit addJarToClasspath läuft. Lab: conf-flag-keeps-jars=yes. | Gleich. | Lab-belegtes Beibehalten von childClasspath. Kein erneutes Einreichen des öffentlichen YARN---jars-Pfads, den clear() abdeckt, wenn das Flag false bleibt. |
Lab-belegt vs. abgeleitet: Konstruiertes -cp enthält defaultExtraClassPath im Cluster-Modus; childClasspath.clear() läuft weiterhin beim Default-Flag; spark.driver.extraClassPath wird im Cluster weggelassen; --jars mit Flag false wird geleert; eine Witness-Klasse auf diesem -cp schreibt das Oracle. Die Ausführung von Hadoop-Config-Klassen ist der öffentliche CVE-2023-22946-Mechanismus, hier nicht erneut ausgeführt. Livy/Kyuubi, die --conf weiterreichen, ist die Architektur, die diese Projekte dokumentieren.