Your AI developer's browser becomes a remote control for their Ray cluster the moment they click a sketchy ad
CVE-2025-62593 is a remote code execution flaw in Anyscale Ray (all versions prior to 2.52.0) that chains a DNS rebinding attack with a User-Agent header guard bypass on the unauthenticated Ray Dashboard API (/api/jobs/ and /api/job_agent/jobs/). Ray's only browser-side protection was checking that the User-Agent header starts with "Mozilla" — a check the Fetch API in Firefox and Safari allows an attacker to trivially override. When a developer running Ray locally visits a malicious page (or is served a malvertisement), the attacker's JavaScript rebinds their domain to 127.0.0.1:8265, sets a custom User-Agent, and POSTs a job submission payload containing an arbitrary shell command. The developer's machine executes it without any authentication prompt. Chrome happens to be unaffected due to an implementation quirk, not by design.
The GHSA advisory assigned a CVSS 4.0 score of 9.4 CRITICAL, but no official vendor (Anyscale) CVSS baseline exists. A 9.4 overstates the real-world risk for most enterprise environments because the chain requires a specific browser family, active user interaction (visiting a malicious site), and successful DNS rebinding — all friction points that modern browser security features increasingly mitigate. However, the KEV listing is not decorative: the broader Ray ecosystem has been hammered by the ShadowRay 2.0 campaign (exploiting CVE-2023-48022), and this CVE extends that attack surface to developer workstations that are otherwise unreachable. The real danger is the *pivot*: a compromised ML engineer's laptop typically holds SSH keys, cloud tokens, and credentials to production Ray clusters and GPU infrastructure. HIGH is the correct bucket — not CRITICAL, because the attack prerequisites are narrow; not MEDIUM, because the blast radius on success is devastating.
5 steps from start to impact.
Victim visits attacker-controlled page
- Developer is running Ray head node locally (default port 8265)
- Developer uses Firefox or Safari (Chrome blocks User-Agent override in Fetch)
- Chrome users (~65% browser market share) are immune
- Many enterprise environments enforce Chrome/Edge via policy
DNS rebinding resolves to localhost
127.0.0.1 with a very short TTL. Once the browser's DNS cache expires and re-resolves, subsequent requests from the attacker's origin now hit the victim's local Ray Dashboard on port 8265. Tools like nccgroup/singularity automate this.- Browser DNS cache must expire and re-resolve within the rebinding window
- No local DNS pinning or private network access protection in the browser
- Modern browsers (Firefox 130+, Safari 18+) implement Private Network Access checks that can block this
- Corporate DNS resolvers may cache longer than attacker TTL, breaking the rebind
User-Agent guard bypass via Fetch API
User-Agent header starts with "Mozilla" and rejects the request if so — a naive browser-detection heuristic. The attacker's JavaScript uses the Fetch API with a custom User-Agent: Other header, which Firefox and Safari allow per the Fetch specification. This bypasses the only server-side protection.- Ray version < 2.52.0 with the User-Agent-based guard
- Browser permits User-Agent override in Fetch (Firefox, Safari)
- This is a single-header check — trivial to bypass when the browser cooperates
Job submission → arbitrary command execution
/api/jobs/ with an entrypoint field containing an arbitrary shell command (e.g., reverse shell, credential harvester). Ray executes it as the user running the Ray head process — typically the developer's own user account, with full access to their home directory, SSH keys, cloud credentials, and any mounted secrets.- Ray Dashboard API has no authentication (default config, auth is opt-in even in 2.52.0)
- If the developer enabled the new token-based auth (added in 2.52.0), this step fails — but auth is disabled by default
Pivot to production Ray clusters and cloud infrastructure
- Developer machine has credentials for production infrastructure (extremely common for ML engineers)
- MFA on cloud providers may slow lateral movement
- Credential rotation policies may limit window
The supporting signals.
| In-the-Wild Exploitation | KEV-listed. While this specific CVE targets the DNS rebinding vector, the broader Ray unauthenticated API attack surface is under active mass exploitation via the ShadowRay 2.0 campaign (Nov 2025), which compromised 200,000+ exposed Ray servers globally. |
|---|---|
| Proof-of-Concept | Public PoC exists. Full exploit chain documented in GHSA-q279-jhrf-cc6v including DNS rebinding via nccgroup/singularity, User-Agent bypass payload, and job submission JSON. Researchers: @JLLeitschuh (Socket, DNS rebinding + PoC) and @avilum (Oligo, fetch bypass theory). |
| EPSS Score | 0.00369 (low probability) — EPSS underweights browser-mediated attack chains; do not rely on this score given KEV listing. |
| KEV Status | Listed. CISA KEV inclusion confirms observed exploitation in the wild. |
| CVSS Vector | CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H — 9.4 CRITICAL per GHSA. Note: UI:P (passive user interaction required) is the key limiter; no vendor-assigned baseline exists. |
| Affected Versions | All Ray versions < 2.52.0. This includes the entire 2.x line back to when the Dashboard API was introduced. |
| Fixed Version | Ray 2.52.0 (fix commit 70e7c72). Token-based authentication added but disabled by default — patching alone does not enable auth. |
| Exposure Data | Per Oligo/ShadowRay research and Shodan enumeration, thousands of Ray dashboards are publicly exposed on port 8265. The Echelon Shadow AI Radar tracks live exposed Ray instances. This CVE targets *local* instances via browser, not directly exposed ones. |
| Disclosure Date | 2025-11-26 (coordinated disclosure via GitHub Security Advisory). |
| Reporting Researchers | Jonathan Leitschuh (@JLLeitschuh, Socket) — DNS rebinding chain and full PoC. Avi Lumelsky (@avilum, Oligo Security) — original User-Agent fetch bypass theory and ShadowRay research lineage. |
noisgate verdict.
The single most decisive factor is the KEV listing combined with the role multiplier: Ray is canonically deployed on ML engineer workstations and AI compute clusters that hold cloud credentials, SSH keys, and proprietary models — compromising one developer machine can cascade to production GPU infrastructure and training data. While browser-specific friction (Firefox/Safari only, DNS rebinding prerequisites) prevents a CRITICAL assessment, the KEV listing and documented exploitation ecosystem floor this at HIGH.
Why this verdict
- KEV floor: CISA KEV listing confirms in-the-wild exploitation. The broader ShadowRay 2.0 campaign demonstrates that threat actors are actively targeting Ray infrastructure at scale — this CVE extends that threat to developer workstations previously considered unreachable.
- Role multiplier: Ray is deployed on (a) developer workstations running local clusters, (b) production AI/ML compute clusters, and (c) high-value GPU infrastructure holding proprietary models, training data, and cloud credentials. This CVE targets role (a), but a compromised developer machine is a direct pivot to roles (b) and (c). The blast radius is host → cloud-infrastructure → fleet. Because ≥10% of Ray installations are developer workstations with production credentials, the verdict floor is HIGH.
- Browser friction limits CRITICAL: Only Firefox and Safari are affected (~30-35% combined desktop share). Chrome (~65%) is immune due to an implementation quirk. Enterprise browser policies often mandate Chrome/Edge, further narrowing the vulnerable population. This friction prevents escalation to CRITICAL.
- DNS rebinding friction: Modern browser versions increasingly implement Private Network Access (PNA) checks that block requests from public origins to loopback addresses. Firefox 130+ and Safari 18+ have partial PNA support. Corporate DNS resolvers with longer cache TTLs also degrade rebinding reliability.
- No authentication by design: Ray's Dashboard API has historically had zero authentication. Even the 2.52.0 fix adds token auth as *opt-in, disabled by default*. This means patching alone doesn't fully remediate — defenders must also enable auth.
Why not higher?
CRITICAL would require the attack to be reliably exploitable across all browsers and without user interaction. This CVE requires the victim to use Firefox or Safari (~35% of desktop users), visit a malicious page, and have DNS rebinding succeed — three compounding friction points that materially reduce the exploitable population. Chrome's immunity alone eliminates the majority of potential targets in enterprise environments that standardize on Chromium-based browsers.
Why not lower?
MEDIUM is ruled out by the KEV listing (active exploitation confirmation), the public PoC with a fully documented attack chain, and the high-value role multiplier. A compromised ML engineer's workstation is not an isolated incident — it is a beachhead into production AI infrastructure, cloud accounts, and proprietary intellectual property. The ShadowRay campaign lineage demonstrates that threat actors have the motivation, tooling, and operational playbook to exploit Ray at scale.
What to do — in priority order.
- Enable Ray token-based authentication immediately — Even after patching to 2.52.0, authentication is disabled by default. Enable the new
RAY_TOKENenvironment variable or--tokenflag on all Ray head nodes. This blocks unauthenticated job submission regardless of the DNS rebinding vector. Deploy within the noisgate mitigation SLA of 30 days for HIGH, but given KEV listing, target hours. - Enforce Chrome/Edge via enterprise browser policy — Chrome is immune to this CVE due to blocking User-Agent header modification in Fetch. Push GPO/MDM policy restricting Firefox and Safari on developer workstations that run Ray. This eliminates the attack surface for the majority of the fleet immediately.
- Block DNS rebinding at the corporate resolver — Configure internal DNS resolvers to reject external domain responses that resolve to RFC1918 or loopback addresses (DNS rebinding protection). Tools like
dnsmasq --stop-dns-rebindor Cloudflare Gateway DNS policies can enforce this network-wide. - Bind Ray Dashboard to localhost with firewall rules — Ensure Ray Dashboard (port 8265) is bound to
127.0.0.1and not0.0.0.0. While this CVE exploits localhost access via the browser, adding host-firewall rules to block non-loopback traffic to 8265 prevents the separate direct-exposure attack path (ShadowRay 2.0). - Rotate developer cloud credentials and SSH keys — Given active exploitation campaigns, assume developer machines may already be compromised. Rotate AWS/GCP/Azure credentials, SSH keys, kubeconfig tokens, and Anyscale API keys for any ML engineer who has run Ray < 2.52.0. Prioritize within the KEV override window (hours).
- Network segmentation alone — this attack comes through the developer's browser to localhost, bypassing all network-layer controls. Your firewall never sees the malicious traffic because it never leaves the machine.
- WAF / reverse proxy in front of Ray — the DNS rebinding attack targets the local Ray instance directly via loopback. A WAF protecting the production Ray cluster does not protect the developer's local instance.
- EDR browser isolation — most EDR products do not intercept or inspect Fetch API calls from the browser to localhost. The attack looks like normal local web traffic until the shell command executes.
Crowdsourced verification payload.
Run this script on any host where Ray may be installed (developer workstations, ML nodes). No special privileges required. Invoke with: bash check_cve_2025_62593.sh
#!/usr/bin/env bash
# CVE-2025-62593 Checker — Ray DNS Rebinding RCE
# Checks installed Ray version against patched version 2.52.0
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
PATCHED_VERSION="2.52.0"
# Try to get Ray version
if command -v ray &>/dev/null; then
RAY_VERSION=$(ray --version 2>/dev/null | grep -oP '\d+\.\d+\.\d+' | head -1)
elif python3 -c 'import ray' &>/dev/null; then
RAY_VERSION=$(python3 -c 'import ray; print(ray.__version__)' 2>/dev/null)
elif python -c 'import ray' &>/dev/null; then
RAY_VERSION=$(python -c 'import ray; print(ray.__version__)' 2>/dev/null)
else
echo "UNKNOWN — Ray is not installed on this host."
exit 2
fi
if [ -z "$RAY_VERSION" ]; then
echo "UNKNOWN — Could not determine Ray version."
exit 2
fi
echo "Detected Ray version: $RAY_VERSION"
echo "Patched version: >= $PATCHED_VERSION"
# Version comparison using sort -V
LOWER=$(printf '%s\n%s' "$RAY_VERSION" "$PATCHED_VERSION" | sort -V | head -1)
if [ "$RAY_VERSION" = "$PATCHED_VERSION" ] || [ "$LOWER" = "$PATCHED_VERSION" ]; then
# Also check if auth is enabled
if ray status &>/dev/null 2>&1; then
if env | grep -q 'RAY_TOKEN'; then
echo "PATCHED — Ray $RAY_VERSION with token auth enabled."
else
echo "PATCHED — Ray $RAY_VERSION installed, but token auth may not be enabled. Enable RAY_TOKEN for defense-in-depth."
fi
else
echo "PATCHED — Ray $RAY_VERSION (not currently running)."
fi
exit 0
else
echo "VULNERABLE — Ray $RAY_VERSION is below $PATCHED_VERSION. CVE-2025-62593 applies."
echo "ACTION: Upgrade to Ray >= $PATCHED_VERSION and enable token authentication."
exit 1
fiIf you remember one thing.
Sources
- GitHub Security Advisory GHSA-q279-jhrf-cc6v
- GitHub Advisory Database — CVE-2025-62593
- Oligo Security — ShadowRay 2.0 Campaign Analysis
- The Hacker News — ShadowRay 2.0 Coverage
- NVD — CVE-2025-62593 Detail
- Vulmon — CVE-2025-62593
- Echelon Shadow AI Radar — Live Exposed AI Infrastructure
- Dark Reading — ShadowRay 2.0 AI Clusters
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.