CVE-2026-48518 Overview
CVE-2026-48518 is a Cross-Site Request Forgery (CSRF) vulnerability [CWE-352] in MultiJuicer, a Kubernetes-based platform that hosts isolated Juice Shop instances for Capture the Flag (CTF) events and security training. The flaw affects versions 8.0.0 through 10.0.0 and resides in the team join endpoint POST /multi-juicer/api/teams/{team}/join. The endpoint accepts requests with any Content-Type, including text/plain, which does not trigger a CORS preflight. An attacker can host a malicious HTML form that auto-submits cross-site, forcing a victim's browser to authenticate into the attacker's team. The issue was fixed in version 10.0.1.
Critical Impact
Victims unknowingly solve Juice Shop challenges under the attacker's team identity, inflating attacker scores in CTF contexts and exposing any sensitive data entered into the victim's session to the attacker's instance.
Affected Products
- MultiJuicer 8.0.0
- MultiJuicer versions 8.0.0 through 10.0.0
- MultiJuicer 10.0.0
Discovery Timeline
- 2026-06-15 - CVE-2026-48518 published to NVD
- 2026-06-17 - Last updated in NVD database
Technical Details for CVE-2026-48518
Vulnerability Analysis
The vulnerability is a login CSRF attack against MultiJuicer's team join endpoint. The endpoint accepted JSON payloads but did not validate the Content-Type header. Browsers permit cross-origin form submissions with application/x-www-form-urlencoded, multipart/form-data, or text/plain without sending a CORS preflight request. An attacker leveraging text/plain can submit a JSON-formatted body that the server still parses as a legitimate team join request.
The victim only needs to visit an attacker-controlled webpage while having network reachability to the MultiJuicer deployment. The attacker's page hosts a self-submitting form targeting the join endpoint with the attacker's team credentials. The victim's browser issues the request, MultiJuicer authenticates the session, and the resulting session cookie binds the victim's browser to the attacker's team.
Root Cause
The root cause is missing Content-Type validation on state-changing API endpoints. The application trusted that JSON endpoints would only receive JSON requests, but failed to enforce this at the request handler. SameSite=Strict on the session cookie does not mitigate this attack because the exploit plants a new authentication cookie rather than reusing an existing one.
Attack Vector
Exploitation requires no prior authentication. The attacker prepares a team in the target MultiJuicer deployment, then hosts a webpage containing an auto-submitting HTML form. The form posts to /multi-juicer/api/teams/{attacker_team}/join with Content-Type: text/plain and a JSON body containing the attacker's team password.
// Security patch in internal/routes/middleware/contenttype.go
package middleware
import (
"mime"
"net/http"
"strings"
)
// RequireJSONContentType rejects requests whose Content-Type is not application/json.
// Cross-site form submissions can only set Content-Type to application/x-www-form-urlencoded,
// multipart/form-data, or text/plain without triggering a CORS preflight, so enforcing
// application/json prevents login CSRF (see issue #525).
func RequireJSONContentType(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
mediaType, _, err := mime.ParseMediaType(r.Header.Get("Content-Type"))
if err != nil || !strings.EqualFold(mediaType, "application/json") {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusUnsupportedMediaType)
w.Write([]byte(`{"message":"Content-Type must be application/json"}`))
return
}
next.ServeHTTP(w, r)
})
}
Source: GitHub Commit 75b08c3
Detection Methods for CVE-2026-48518
Indicators of Compromise
- POST requests to /multi-juicer/api/teams/{team}/join with Content-Type headers other than application/json (such as text/plain, application/x-www-form-urlencoded, or multipart/form-data).
- Referer or Origin headers on team join requests that do not match the MultiJuicer deployment hostname.
- Anomalous spikes in successful join requests for a single team from multiple distinct client IP addresses.
Detection Strategies
- Inspect ingress controller and reverse proxy logs for join endpoint requests with non-JSON Content-Type values prior to patching.
- Correlate Juice Shop challenge solve events with team join timestamps to identify accounts joining immediately before unexpected solve activity.
- Flag MultiJuicer authentication events that originate from cross-origin Referer headers.
Monitoring Recommendations
- Enable verbose HTTP access logging on the MultiJuicer ingress and forward logs to a centralized analytics platform for retention and search.
- Configure alerts on HTTP 415 (Unsupported Media Type) responses from the join endpoint after patching to detect ongoing exploitation attempts.
- Monitor for unusual team membership growth patterns, particularly during active CTF events.
How to Mitigate CVE-2026-48518
Immediate Actions Required
- Upgrade MultiJuicer to version 10.0.1 or later, which enforces application/json content-type validation on state-changing endpoints.
- Audit existing team memberships in active deployments to identify accounts that joined unexpectedly.
- Reset team passwords and clear active sessions if exploitation is suspected.
Patch Information
The fix is included in MultiJuicer 10.0.1. The patch introduces a RequireJSONContentType middleware that rejects any request whose Content-Type is not application/json, returning HTTP 415. The middleware is wired into the join and webhook handlers in internal/routes/private/routes.go. Full details are available in GitHub Security Advisory GHSA-h759-hf7w-j6m6 and GitHub Issue #525.
Workarounds
- Deploy a reverse proxy or Web Application Firewall (WAF) rule in front of MultiJuicer that rejects POST requests to /multi-juicer/api/teams/*/join lacking Content-Type: application/json.
- Restrict network access to MultiJuicer deployments to participant IP ranges or require VPN access during CTF events.
- Disable team password reuse and enforce unique, unguessable team credentials to reduce the impact of successful CSRF attacks.
# Example NGINX ingress snippet to enforce JSON content-type on the join endpoint
location ~ ^/multi-juicer/api/teams/[^/]+/join$ {
if ($request_method = POST) {
if ($content_type !~* "^application/json") {
return 415;
}
}
proxy_pass http://multijuicer-backend;
}
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

