
Apache Spark 4.2.0 - Alta - Remoto - Privilegio residuo - proxy-user defaultExtraClassPath
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · spark-proxyuser-classpath
Classe: Privilegio residuo (residuo di CVE-2023-22946 / SPARK-41958) Portata: Remota
Apache Spark 4.2.0 (32f72996) - Apache Software Foundation
CVE-2023-22946 / SPARK-41958 mantiene ancora spark.submit.proxyUser.allowCustomClasspathInClusterMode a false per impostazione predefinita ed esegue ancora childClasspath.clear() sul submit in cluster con --proxy-user. Questo è il percorso pubblico YARN --jars. Spark 4.0 ha poi aggiunto spark.driver.defaultExtraClassPath. Il launcher antepone sempre quella chiave al -cp della JVM di spark-submit, incluso in modalità cluster. SPARK-41958 non la vede mai.
Un tenant in stile Livy può comunque caricare un jar preparato all'interno della JVM spark-submit del gateway. UserGroupInformation.doAs di Hadoop non cambia quell'UID Unix.
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo (residuo di CVE-2023-22946 / SPARK-41958) |
| Portata | Remota (submit di job in stile Livy con --proxy-user attraverso il gateway) |
| CWE | CWE-269, CWE-427 |
| CVSS | Alto: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Prodotto | Apache Spark |
| Affetto | Apache Spark 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) |
| Auth | tenant autenticato di un gateway in stile Livy / Kyuubi / Oozie che inoltra --conf e --jars preparati in spark-submit --proxy-user ... --deploy-mode cluster |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18950. File witness. Gadget del launcher / submit citati. |
Possedere un account tenant su un gateway Spark multi-tenant (Livy, Kyuubi, Oozie e simili) che esegue spark-submit --proxy-user <tenant> --deploy-mode cluster con un UID superuser. Preparare un jar che la JVM del gateway può aprire. Inviare --conf spark.driver.defaultExtraClassPath=<staged jar>. Il gate di SPARK-41958 può restare false. Il spark-submit -cp costruito inizia comunque con quel jar. Le classi al suo interno vengono caricate con l'UID Unix del gateway.
--conf spark.submit.proxyUser.allowCustomClasspathInClusterMode=true è un secondo percorso: .internal() è solo documentazione, --conf scrive comunque la chiave, e il cluster YARN mantiene poi --jars su childClasspath. La CVE-2023-22946 pubblica resta il percorso predefinito YARN --jars che clear() già copre. Questo residuo è defaultExtraClassPath non protetto da gate.
L'impersonificazione Hadoop dopo un submit pulito è comunque l'utente proxy per l'AM YARN / il driver k8s. Questo residuo riguarda solo la JVM del gateway.
| Metodo | Sink | Recon | Integrità | Disponibilità | Provenienza |
|---|---|---|---|---|---|
Submit in stile Livy --proxy-user + cluster yarn/k8s/standalone + --conf spark.driver.defaultExtraClassPath=<staged local jar>, flag SPARK-41958 lasciato false | SparkSubmitCommandBuilder.buildSparkSubmitCommand SparkSubmitCommandBuilder.java:317-327 prima voce di -cp | Elenca/legge file che l'UID del gateway può leggere (directory keytab, spark-defaults, staging locale). L'identità Hadoop delle RPC successive è comunque l'utente proxy. | Carica classi del tenant all'interno della JVM spark-submit. L'UID Unix resta quello del gateway (superuser proxy Hadoop). Lab: defaultExtraClassPath-on-cp=yes childClasspath-cleared=yes lab.WitnessMain ha scritto SPARK-PROXYUSER-CLASSPATH-WITNESS. Inferito dalla classe CVE pubblica: overlay di risorse Configuration di Hadoop / lookup dell'implementazione FileSystem con quell'UID. | Crash della JVM di submit se l'overlay genera eccezioni. Non la classe. | Caricamento provato in lab + scrittura witness come -cp costruito. Overlay Hadoop inferito. Passthrough --conf di Livy/Kyuubi inferito (quei tree non sono questo pin). |
Stesso submit con --conf spark.submit.proxyUser.allowCustomClasspathInClusterMode=true più --jars / risorsa primaria | SparkSubmit.prepareSubmitEnvironment SparkSubmit.scala:333-336,738-743,917-924 poi runMain :980-987 | Stessa recon del percorso A, sul URLClassLoader figlio invece che sul loader di sistema. | Mantiene --jars su childClasspath così addJarToClasspath viene eseguito. Lab: conf-flag-keeps-jars=yes. | Idem. | Mantenimento di childClasspath provato in lab. Non è una ri-segnalazione del percorso pubblico YARN --jars che clear() copre quando il flag resta false. |
Provato in lab vs inferito: il -cp costruito contiene defaultExtraClassPath in modalità cluster; childClasspath.clear() viene comunque eseguito con il flag predefinito; spark.driver.extraClassPath è omesso in cluster; --jars con flag false viene svuotato; una classe witness su quel -cp scrive l'oracle. L'esecuzione della classe di configurazione Hadoop è il meccanismo pubblico di CVE-2023-22946, non rieseguito qui. L'inoltro di --conf da parte di Livy/Kyuubi è l'architettura documentata da quei progetti.