
Apache Spark 4.2.0 - Hoch - Remote - Privilegien-Rest - Standalone-REST ignoriert spark.authenticate
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · spark-rest-auth-bypass
Klasse: Privilegien-Überbleibsel Reichweite: Remote
Apache Spark 4.2.0 (32f72996) - Apache Software Foundation
Der Standalone-Master-REST-Dienst ist standardmäßig auf Port 6066 aktiv und liest spark.authenticate nie aus. CVE-2018-11770 versprach, REST standardmäßig zu deaktivieren und bei gesetztem RPC-Secret und aktiviertem REST fail-closed zu reagieren. Dieser Pin hat beides umgekehrt. MASTER_REST_SERVER_ENABLED ist createWithDefault(true). Filter sind nur MASTER_REST_SERVER_FILTERS, Standard Nil. Ein unauthentifiziertes POST /v1/submissions/create führt die main des Angreifers unter der Worker-UID aus. Der Worker injiziert _SPARK_AUTH_SECRET, sodass die Obergrenze „Driver ohne Executors" von 2018 nicht hält.
Dies ist ein Überbleibsel von 11770, keine neue CVE-2020-9480 RCE. RPC 7077 installiert weiterhin AuthServerBootstrap. Job-Submit auf einem Cluster mit spark.authenticate=false ist der dokumentierte Standard und nicht dieser Bug.
| ID | noch keine CVE |
| Klasse | Privilegien-Überbleibsel (Überbleibsel von CVE-2018-11770) |
| Reichweite | Remote (unauthentifiziertes HTTP zum Standalone-Master 6066) |
| CWE | CWE-306, CWE-287 |
| CVSS | Hoch: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Produkt | Apache Spark |
| Betroffen | 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) Standalone-Master-REST |
| Auth | keine bei REST. Betreiber hat spark.authenticate=true gesetzt. REST auf Standard belassen. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18900. Offizielles spark:4.2.0-Image. |
Ich habe Tag v4.2.0 gepinnt, Peel 32f7299601108917fb01920a54e084595b7b3bf8 (2026-07-11, v4.2.0-rc6). Nicht master. Kein 4.3-RC.
Erreicht den Standalone-Master-REST auf 6066. Kein Authorization-Header. spark.authenticate ist aktiv. spark.master.rest.filters ist nicht gesetzt. Mindestens ein Worker ist live.
| Methode | Sink | Privileg |
|---|---|---|
Unauth POST /v1/submissions/create | RequestSubmitDriver (Master.scala:402-420) dann Worker DriverWrapper classForName(mainClass).main | Integrität (lab-belegt): mainClass des Angreifers unter der Worker-UID ausführen. Lab: Driver RUNNING, Witness-Datei. |
Gleiches create; Worker CommandUtils.buildLocalCommand | Driver-Env _SPARK_AUTH_SECRET | Integrität (lab-belegt): Driver kann per SASL dem authentifizierten RPC-Cluster beitreten. Lab: injected=yes. |
Unauth GET /v1/submissions/status/{id} | RequestDriverStatus (Master.scala:489-503) | Recon (lab-belegt für die erzeugte id): Driver-Status / Worker-Host. |
Unauth GET /v1/submissions/readyz | RequestReadyz | Recon (lab-belegt): Master nicht STANDBY. |
Unauth POST /v1/submissions/kill/{id} | RequestKillDriver (Master.scala:422-453) | Integrität + Verfügbarkeit (abgeleitet): Standalone-Driver eines anderen Mandanten stoppen. Gleiche Unauth-Servlet-Verdrahtung; nicht ausgeführt. |
Unauth POST /v1/submissions/killall | RequestKillAllDrivers (Master.scala:455-478) | Verfügbarkeit (abgeleitet): jeden wartenden/laufenden Standalone-Driver beenden. Nicht ausgeführt. |
Unauth POST /v1/submissions/clear | RequestClearCompletedDriversAndApps | Integrität (abgeleitet): abgeschlossene Driver-/App-Buchführung verwerfen. Nicht ausgeführt. |
Lab-belegt vs. abgeleitet: create, Secret-Injektion, Status der eigenen id und readyz sind Lab. Kill / killall / clear sind aus derselben Unauth-Servlet-Map abgeleitet.
Voraussetzungen: Standalone-Master (nicht YARN/K8s). Betreiber hat spark.authenticate=true gesetzt. REST auf Standard belassen (spark.master.rest.enabled true, spark.master.rest.filters nicht gesetzt). Netzwerkpfad zum Master 6066. Mindestens ein Worker. Nicht der dokumentiert-offene Cluster (spark.authenticate=false).
| Fläche | Grund |
|---|---|
RPC 7077 mit spark.authenticate=true | AuthServerBootstrap weiterhin erforderlich. Der Receive-Pfad von CVE-2020-9480 bleibt geschlossen. Keine neue 9480-RCE. |
| JWSFilter, wenn gesetzt | spark.master.rest.filters=org.apache.spark.ui.JWSFilter plus secretKey. Tests 403 ohne JWT. Opt-in. Standard Nil. |
UI doAs | erfordert weiterhin Admin. REST erbt keine UI-Filter. |
| CVE-2022-33891 UI-Shell | id -Gn-argv-Überbleibsel auf diesem Pin geschlossen. |
| YARN / Kubernetes Submit | dieser REST-Server ist nur Standalone-Master. |
Standard-Job-Submit mit spark.authenticate=false | FAQ: by design. Nicht dieses Überbleibsel. |
| Mesos REST | in Spark 4.0 entfernt. |
CLI spark-submit Standard | nutzt weiterhin RPC 7077 (useRest string-defaults false). --kill / --status auf spark:// nutzen immer REST. Das Überbleibsel ist der Server-Listener. |
Der Code-Fix von CVE-2018-11770 (SPARK-25088) war: REST standardmäßig aus, und require Master fail-closed, wenn spark.authenticate.secret gesetzt ist, während REST an ist. Dieser Pin: