
Apache Spark 4.2.0 - Alta - Remota - Privilegio residual - REST independiente ignora spark.authenticate
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · spark-rest-auth-bypass
Clase: Privilegio residual Alcance: Remoto
Apache Spark 4.2.0 (32f72996) - Apache Software Foundation
El REST del Master en modo standalone está activado por defecto en el puerto 6066 y nunca lee spark.authenticate. CVE-2018-11770 prometió REST desactivado por defecto y un fail-closed si el secreto RPC estaba configurado mientras REST estaba activado. Este pin revirtió ambas cosas. MASTER_REST_SERVER_ENABLED es createWithDefault(true). Los filtros son solo MASTER_REST_SERVER_FILTERS, por defecto Nil. Un POST /v1/submissions/create no autenticado ejecuta el main del atacante con el UID del Worker. El Worker inyecta _SPARK_AUTH_SECRET, por lo que el límite de 2018 de "driver sin ejecutores" no se sostiene.
Esto es un residuo de 11770, no un nuevo RCE CVE-2020-9480. El RPC 7077 sigue instalando AuthServerBootstrap. El envío de trabajos en un clúster con spark.authenticate=false es el comportamiento documentado por defecto y no es este bug.
| ID | sin CVE todavía |
| Clase | Privilegio residual (residuo de CVE-2018-11770) |
| Alcance | Remoto (HTTP no autenticado al Master standalone 6066) |
| CWE | CWE-306, CWE-287 |
| CVSS | Alto: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Producto | Apache Spark |
| Afectado | 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) REST del Master standalone |
| Autenticación | ninguna en REST. El operador configuró spark.authenticate=true. REST quedó por defecto. |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18900. Imagen oficial spark:4.2.0. |
Fijé el tag v4.2.0, peel 32f7299601108917fb01920a54e084595b7b3bf8 (2026-07-11, v4.2.0-rc6). No master. No un RC de 4.3.
Alcanzar el REST del Master standalone en 6066. Sin cabecera Authorization. spark.authenticate está activado. spark.master.rest.filters no está configurado. Al menos un Worker está activo.
| Método | Sink | Privilegio |
|---|---|---|
POST /v1/submissions/create sin autenticación | RequestSubmitDriver (Master.scala:402-420) y luego el Worker DriverWrapper classForName(mainClass).main | Integridad (probado en laboratorio): ejecutar el mainClass del atacante con el UID del Worker. Laboratorio: driver RUNNING, archivo testigo. |
Mismo create; Worker CommandUtils.buildLocalCommand | env del driver _SPARK_AUTH_SECRET | Integridad (probado en laboratorio): el driver puede unirse por SASL al clúster RPC autenticado. Laboratorio: injected=yes. |
GET /v1/submissions/status/{id} sin autenticación | RequestDriverStatus (Master.scala:489-503) | Reconocimiento (probado en laboratorio para el id creado): estado del driver / host del worker. |
GET /v1/submissions/readyz sin autenticación | RequestReadyz | Reconocimiento (probado en laboratorio): el Master no está en STANDBY. |
POST /v1/submissions/kill/{id} sin autenticación | RequestKillDriver (Master.scala:422-453) | Integridad + disponibilidad (inferido): detener el driver standalone de otro inquilino. Mismo cableado del servlet sin autenticación; no ejercitado. |
POST /v1/submissions/killall sin autenticación | RequestKillAllDrivers (Master.scala:455-478) | Disponibilidad (inferido): terminar todos los drivers standalone en espera/en ejecución. No ejercitado. |
POST /v1/submissions/clear sin autenticación | RequestClearCompletedDriversAndApps | Integridad (inferido): eliminar el registro de drivers/apps completados. No ejercitado. |
Probado en laboratorio vs inferido: create, inyección del secreto, status del propio id y readyz son de laboratorio. Kill / killall / clear se infieren del mismo mapa de servlets sin autenticación.
Requiere: Master standalone (no YARN/K8s). El operador configuró spark.authenticate=true. REST quedó por defecto (spark.master.rest.enabled true, spark.master.rest.filters sin configurar). Ruta de red al Master 6066. Al menos un Worker. No el clúster documentado como abierto (spark.authenticate=false).
| Superficie | Motivo |
|---|---|
RPC 7077 con spark.authenticate=true | AuthServerBootstrap sigue siendo obligatorio. La ruta de recepción de CVE-2020-9480 permanece cerrada. No es un nuevo RCE 9480. |
| JWSFilter cuando está configurado | spark.master.rest.filters=org.apache.spark.ui.JWSFilter más secretKey. Las pruebas dan 403 sin JWT. Opt-in. Por defecto Nil. |
UI doAs | sigue requiriendo admin. REST no hereda los filtros de la UI. |
| Shell de la UI de CVE-2022-33891 | el residuo de argv id -Gn está cerrado en este pin. |
| Envío YARN / Kubernetes | este servidor REST es solo del Master standalone. |
Envío de trabajos con spark.authenticate=false por defecto | FAQ: por diseño. No es este residuo. |
| REST de Mesos | eliminado en Spark 4.0. |
spark-submit de CLI por defecto | sigue usando RPC 7077 (useRest con valor por defecto de cadena false). --kill / --status sobre spark:// siempre usan REST. El residuo es el listener del servidor. |
El arreglo de código de CVE-2018-11770 (SPARK-25088) fue: REST desactivado por defecto, y require de que el Master hiciera fail-closed si spark.authenticate.secret estaba configurado mientras REST estaba activado. Este pin: