
Apache Spark 4.2.0 - Alta - Remoto - Privilégio remanescente - REST standalone ignora spark.authenticate
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · spark-rest-auth-bypass
Classe: Privilégio remanescente Alcance: Remoto
Apache Spark 4.2.0 (32f72996) - Apache Software Foundation
O REST do Master standalone está ativado por padrão na porta 6066 e nunca lê spark.authenticate. O CVE-2018-11770 prometeu REST desativado por padrão e falha segura caso o segredo RPC estivesse definido enquanto o REST estivesse ativo. Esta versão reverteu ambos. MASTER_REST_SERVER_ENABLED é createWithDefault(true). Os filtros são apenas MASTER_REST_SERVER_FILTERS, padrão Nil. Um POST /v1/submissions/create não autenticado executa o main do atacante com o UID do Worker. O Worker injeta _SPARK_AUTH_SECRET, portanto o limite de 2018 de "driver sem executores" não se sustenta.
Este é um resquício do 11770, não um novo RCE CVE-2020-9480. O RPC 7077 ainda instala AuthServerBootstrap. O envio de job em um cluster com spark.authenticate=false é o padrão documentado e não é este bug.
| ID | ainda sem CVE |
| Classe | Privilégio remanescente (resquício do CVE-2018-11770) |
| Alcance | Remoto (HTTP não autenticado para o 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 |
| Produto | Apache Spark |
| Afetado | 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) REST do Master standalone |
| Autenticação | nenhuma no REST. Operador definiu spark.authenticate=true. REST deixado no padrão. |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1:18900. Imagem oficial spark:4.2.0. |
Fixe a tag v4.2.0, peel 32f7299601108917fb01920a54e084595b7b3bf8 (2026-07-11, v4.2.0-rc6). Não é master. Não é um RC 4.3.
Alcançar o REST do Master standalone na 6066. Sem cabeçalho Authorization. spark.authenticate está ativado. spark.master.rest.filters não está definido. Pelo menos um Worker está ativo.
| Método | Sink | Privilégio |
|---|---|---|
POST /v1/submissions/create não autenticado | RequestSubmitDriver (Master.scala:402-420) e então Worker DriverWrapper classForName(mainClass).main | Integridade (comprovada em lab): executar o mainClass do atacante com o UID do Worker. Lab: driver RUNNING, arquivo testemunha. |
Mesmo create; Worker CommandUtils.buildLocalCommand | env do driver _SPARK_AUTH_SECRET | Integridade (comprovada em lab): o driver pode entrar via SASL no cluster RPC autenticado. Lab: injected=yes. |
GET /v1/submissions/status/{id} não autenticado | RequestDriverStatus (Master.scala:489-503) | Recon (comprovado em lab para o id criado): estado do driver / host do worker. |
GET /v1/submissions/readyz não autenticado | RequestReadyz | Recon (comprovado em lab): Master não está STANDBY. |
POST /v1/submissions/kill/{id} não autenticado | RequestKillDriver (Master.scala:422-453) | Integridade + disponibilidade (inferido): parar o driver standalone de outro inquilino. Mesma fiação de servlet não autenticada; não exercitado. |
POST /v1/submissions/killall não autenticado | RequestKillAllDrivers (Master.scala:455-478) | Disponibilidade (inferido): encerrar todos os drivers standalone em espera/execução. Não exercitado. |
POST /v1/submissions/clear não autenticado | RequestClearCompletedDriversAndApps | Integridade (inferido): descartar o registro de drivers/apps concluídos. Não exercitado. |
Comprovado em lab vs inferido: create, injeção de segredo, status do próprio id e readyz são de lab. Kill / killall / clear são inferidos do mesmo mapa de servlet não autenticado.
Requer: Master standalone (não YARN/K8s). Operador definiu spark.authenticate=true. REST deixado no padrão (spark.master.rest.enabled true, spark.master.rest.filters não definido). Caminho de rede para o Master 6066. Pelo menos um Worker. Não é o cluster documentado como aberto (spark.authenticate=false).
| Superfície | Motivo |
|---|---|
RPC 7077 com spark.authenticate=true | AuthServerBootstrap ainda é exigido. O caminho de recepção do CVE-2020-9480 permanece fechado. Não é um novo RCE 9480. |
| JWSFilter quando definido | spark.master.rest.filters=org.apache.spark.ui.JWSFilter mais secretKey. Testes retornam 403 sem JWT. Opt-in. Padrão Nil. |
UI doAs | ainda exige admin. O REST não herda os filtros da UI. |
| Shell da UI do CVE-2022-33891 | resquício de argv id -Gn fechado nesta versão. |
| Envio YARN / Kubernetes | este servidor REST é apenas do Master standalone. |
Envio de job com spark.authenticate=false padrão | FAQ: por design. Não é este resquício. |
| REST do Mesos | removido no Spark 4.0. |
Padrão do CLI spark-submit | ainda usa RPC 7077 (useRest com padrão de string false). --kill / --status em spark:// sempre usam REST. O resquício é o listener do servidor. |
A correção de código do CVE-2018-11770 (SPARK-25088) foi: REST desativado por padrão, e require do Master com falha segura caso spark.authenticate.secret estivesse definido enquanto o REST estivesse ativo. Esta versão: