
Apache Spark 4.2.0 - Alta - Remoto - Privilegio residual - proxy-user defaultExtraClassPath
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · spark-proxyuser-classpath
Clase: Resto de privilegio (resto de CVE-2023-22946 / SPARK-41958) Alcance: Remoto
Apache Spark 4.2.0 (32f72996) - Apache Software Foundation
CVE-2023-22946 / SPARK-41958 todavía establece por defecto spark.submit.proxyUser.allowCustomClasspathInClusterMode en false y todavía ejecuta childClasspath.clear() en el envío de clúster con --proxy-user. Esa es la ruta pública de YARN --jars. Spark 4.0 luego añadió spark.driver.defaultExtraClassPath. El lanzador siempre antepone esa clave al -cp de la JVM de spark-submit, incluso en modo clúster. SPARK-41958 nunca lo ve.
Un inquilino al estilo Livy todavía puede cargar un jar preparado dentro de la JVM de spark-submit de la puerta de enlace. El UserGroupInformation.doAs de Hadoop no cambia ese UID de Unix.
| ID | sin CVE todavía |
| Clase | Resto de privilegio (resto de CVE-2023-22946 / SPARK-41958) |
| Alcance | Remoto (envío de trabajo --proxy-user al estilo Livy a través de la puerta de enlace) |
| 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 |
| Producto | Apache Spark |
| Afectado | Apache Spark 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) |
| Autenticación | inquilino autenticado de una puerta de enlace al estilo Livy / Kyuubi / Oozie que reenvía --conf y --jars preparados a spark-submit --proxy-user ... --deploy-mode cluster |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18950. Archivo testigo. Gadget de los recorridos citados del lanzador / submit. |
Tener una cuenta de inquilino en una puerta de enlace Spark multiinquilino (Livy, Kyuubi, Oozie y similares) que ejecuta spark-submit --proxy-user <tenant> --deploy-mode cluster como un UID de superusuario. Preparar un jar que la JVM de la puerta de enlace pueda abrir. Enviar --conf spark.driver.defaultExtraClassPath=<staged jar>. La compuerta de SPARK-41958 puede permanecer en false. El spark-submit -cp construido todavía comienza con ese jar. Las clases en él se cargan con el UID de Unix de la puerta de enlace.
--conf spark.submit.proxyUser.allowCustomClasspathInClusterMode=true es un segundo recorrido: .internal() es solo documentación, --conf todavía escribe la clave, y el clúster de YARN entonces mantiene --jars en childClasspath. El CVE-2023-22946 público sigue siendo la ruta por defecto de YARN --jars que clear() ya cubre. Este resto es defaultExtraClassPath sin compuerta.
La suplantación de Hadoop después de un envío limpio sigue siendo el usuario proxy para el AM de YARN / driver de k8s. Este resto es solo la JVM de la puerta de enlace.
| Método | Sumidero | Reconocimiento | Integridad | Disponibilidad | Procedencia |
|---|---|---|---|---|---|
Envío al estilo Livy --proxy-user + clúster yarn/k8s/standalone + --conf spark.driver.defaultExtraClassPath=<staged local jar>, con el flag de SPARK-41958 dejado en false | SparkSubmitCommandBuilder.buildSparkSubmitCommand SparkSubmitCommandBuilder.java:317-327 primera entrada de -cp | Listar/leer archivos que el UID de la puerta de enlace puede leer (directorio de keytab, spark-defaults, staging local). La identidad Hadoop de RPCs posteriores sigue siendo el usuario proxy. | Cargar clases del inquilino dentro de la JVM de spark-submit. El UID de Unix sigue siendo la puerta de enlace (superusuario proxy de Hadoop). Laboratorio: defaultExtraClassPath-on-cp=yes childClasspath-cleared=yes lab.WitnessMain escribió SPARK-PROXYUSER-CLASSPATH-WITNESS. Inferido de la clase del CVE público: superposición de recursos de Configuration de Hadoop / búsqueda de implementación de FileSystem como ese UID. | Caída de la JVM de envío si la superposición lanza una excepción. No la clase. | Carga probada en laboratorio + escritura de testigo como -cp construido. Superposición de Hadoop inferida. Passthrough de --conf de Livy/Kyuubi inferido (esos árboles no son este pin. |
Mismo envío con --conf spark.submit.proxyUser.allowCustomClasspathInClusterMode=true más --jars / recurso primario | SparkSubmit.prepareSubmitEnvironment SparkSubmit.scala:333-336,738-743,917-924 luego runMain :980-987 | Mismo reconocimiento que el recorrido A, sobre el URLClassLoader hijo en lugar del cargador del sistema. | Mantener --jars en childClasspath para que se ejecute addJarToClasspath. Laboratorio: conf-flag-keeps-jars=yes. | Igual. | Mantenimiento de childClasspath probado en laboratorio. No es una re-presentación de la ruta pública de YARN --jars que clear() cubre cuando el flag permanece en false. |
Probado en laboratorio vs inferido: el -cp construido contiene defaultExtraClassPath en modo clúster; childClasspath.clear() todavía se ejecuta con el flag por defecto; spark.driver.extraClassPath se omite en clúster; --jars con el flag en false se limpia; una clase testigo en ese -cp escribe el oráculo. La ejecución de clases de configuración de Hadoop es el mecanismo del CVE-2023-22946 público, no se re-ejecuta aquí. El reenvío de --conf por Livy/Kyuubi es la arquitectura que esos proyectos documentan.