Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
spark-rest-auth-bypass — Apache Spark 4.2.0 - High - Remote - Privilege leftover - standalone REST ignores spark.authenticate | Kitploit
Tools/GitHubGitHub/abraxas/spark-rest-auth-bypass
Privilege EscalationVulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingAuthenticationPapers & ResearchMisconfigurationRed TeamingLabs & Practice
GitHub
32 days agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share
abraxas/spark-rest-auth-bypass

spark-rest-auth-bypass

Apache Spark 4.2.0 - High - Remote - Privilege leftover - standalone REST ignores spark.authenticate

View Repository

Abraxas Labs - spark-rest-auth-bypass

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  spark-rest-auth-bypass

spark-rest-auth-bypass

Class: Privilege leftover Reach: Remote

Apache Spark 4.2.0 (32f72996) - Apache Software Foundation

Standalone Master REST is default-on port 6066 and never reads spark.authenticate. CVE-2018-11770 promised REST off by default and a fail-closed if the RPC secret was set while REST was on. This pin reversed both. MASTER_REST_SERVER_ENABLED is createWithDefault(true). Filters are only MASTER_REST_SERVER_FILTERS, default Nil. An unauthenticated POST /v1/submissions/create runs attacker main as the Worker UID. The Worker injects _SPARK_AUTH_SECRET, so the 2018 "driver without executors" cap does not hold.

This is a leftover of 11770, not a new CVE-2020-9480 RCE. RPC 7077 still installs AuthServerBootstrap. Job submit on a cluster with spark.authenticate=false is the documented default and is not this bug.

IDno CVE yet
ClassPrivilege leftover (leftover of CVE-2018-11770)
ReachRemote (unauthenticated HTTP to standalone Master 6066)
CWECWE-306, CWE-287
CVSSHigh: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
ProductApache Spark
Affected4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) standalone Master REST
Authnone on REST. Operator set spark.authenticate=true. REST left at default.
LicenseGNU Affero GPL v3.0
Lab127.0.0.1:18900 only. Official spark:4.2.0 image.

I pinned tag v4.2.0, peel 32f7299601108917fb01920a54e084595b7b3bf8 (2026-07-11, v4.2.0-rc6). Not master. Not a 4.3 RC.

What an attacker can do

Reach standalone Master REST on 6066. No Authorization header. spark.authenticate is on. spark.master.rest.filters is unset. At least one Worker is live.

MethodSinkPrivilege
Unauth POST /v1/submissions/createRequestSubmitDriver (Master.scala:402-420) then Worker DriverWrapper classForName(mainClass).mainIntegrity (lab-proven): run attacker mainClass as the Worker UID. Lab: driver RUNNING, witness file.
Same create; Worker CommandUtils.buildLocalCommanddriver env _SPARK_AUTH_SECRETIntegrity (lab-proven): driver can SASL-join the authenticated RPC cluster. Lab: injected=yes.
Unauth GET /v1/submissions/status/{id}RequestDriverStatus (Master.scala:489-503)Recon (lab-proven for the created id): driver state / worker host.
Unauth GET /v1/submissions/readyzRequestReadyzRecon (lab-proven): Master not STANDBY.
Unauth POST /v1/submissions/kill/{id}RequestKillDriver (Master.scala:422-453)Integrity + availability (inferred): stop another tenant's standalone driver. Same unauth servlet wiring; not exercised.
Unauth POST /v1/submissions/killallRequestKillAllDrivers (Master.scala:455-478)Availability (inferred): end every waiting/running standalone driver. Not exercised.
Unauth POST /v1/submissions/clearRequestClearCompletedDriversAndAppsIntegrity (inferred): drop completed driver/app bookkeeping. Not exercised.

Lab-proven vs inferred: create, secret inject, own-id status, and readyz are lab. Kill / killall / clear are inferred from the same unauth servlet map.

Requires: standalone Master (not YARN/K8s). Operator set spark.authenticate=true. REST left at default (spark.master.rest.enabled true, spark.master.rest.filters unset). Network path to Master 6066. At least one Worker. Not the documented-open cluster (spark.authenticate=false).

Adjacent surface that stays closed

SurfaceWhy
RPC 7077 with spark.authenticate=trueAuthServerBootstrap still required. CVE-2020-9480 receive-path stays closed. Not a new 9480 RCE.
JWSFilter when setspark.master.rest.filters=org.apache.spark.ui.JWSFilter plus secretKey. Tests 403 without JWT. Opt-in. Default Nil.
UI doAsstill requires admin. REST does not inherit UI filters.
CVE-2022-33891 UI shellid -Gn argv leftover closed on this pin.
YARN / Kubernetes submitthis REST server is standalone Master only.
Default spark.authenticate=false job submitFAQ: by design. Not this leftover.
Mesos RESTremoved in Spark 4.0.
CLI spark-submit defaultstill uses RPC 7077 (useRest string-defaults false). --kill / --status on spark:// always use REST. The leftover is the server listener.

How I found it

CVE-2018-11770's code fix (SPARK-25088) was: default REST off, and require Master fail-closed if spark.authenticate.secret is set while REST is on. This pin:

  1. Default REST on. package.scala:2045-2048. Docs: "Since Spark 4.1, Spark Master daemon provides REST API by default."
  2. Fail-closed absent from Master.scala. Test SPARK-57451: Allows REST server and spark.authenticate.secret to be enabled together (MasterSuite.scala:253-261) asserts start must succeed.
  3. REST still never reads NETWORK_AUTH_ENABLED / AUTH_SECRET. addFilters applies only spark.master.rest.filters default Nil.

An operator who followed CVE-2018-17190 / the FAQ ("enable spark.authenticate") still has unauth HTTP job submit on 6066.

Download Tool