Skip to content
RayGHSA-q279-jhrf-cc6v

Ray is vulnerable to Critical RCE via Safari & Firefox Browsers through DNS Rebinding Attack

CriticalCVE-2025-62593 · Published Nov 26, 2025 · updated Sep 10, 2026

GitHub advisory

Affected versions

PackageAffectedFixed in
ray
PyPI
< 2.52.02.52.0
Details and references

# Summary Developers working with Ray as a development tool can be exploited via a critical RCE vulnerability exploitable via Firefox and Safari. Due to the longstanding [decision](https://docs.ray.io/en/releases-2.51.1/ray-security/index.html) by the Ray Development team to not implement any sort of authentication on critical endpoints, like the `/api/jobs` & `/api/job_agent/jobs/` has once again led to a severe vulnerability that allows attackers to execute arbitrary code against Ray. This time in a development context via the browsers Firefox and Safari. This vulnerability is due to an insufficient guard against browser-based attacks, as the current defense uses the `User-Agent` header starting with the string "Mozilla" as a defense mechanism. This defense is insufficient as the fetch specification allows the `User-Agent` header to be modified. Combined with a DNS rebinding attack against the browser, and this vulnerability is exploitable against a developer running Ray who inadvertently visits a malicious website, or is served a malicious advertisement ([malvertising](https://en.wikipedia.org/wiki/Malvertising)). # Details The mitigations implemented to protect against browser based attacks against local Ray nodes are insufficient. ## Current Mitigation Strategies ```python def is_browser_request(req: Request) -> bool: """Checks if a request is made by a browser like user agent. This heuristic is very weak, but hard for a browser to bypass- eg, fetch/xhr and friends cannot alter the user-agent, but requests made with an http library can stumble into this if they choose to user a browser like user agent. """ return req.headers["User-Agent"].startswith("Mozilla") def deny_browser_requests() -> Callable: """Reject any requests that appear to be made by a browser""" def decorator_factory(f: Callable) -> Callable: @functools.wraps(f) async def decorator(self, req: Request): if is_browser_request(req): return Response( text="Browser requests not allowed", status=aiohttp.web.HTTPMethodNotAllowed.status_code, ) return await f(self, req) return decorator return decorator_factory ``` https://github.com/ray-project/ray/blob/f39a860436dca3ed5b9dfae84bd867ac10c84dc6/python/ray/dashboard/optional_utils.py#L129-L155 ```python @aiohttp.web.middleware async def browsers_no_post_put_middleware(self, request, handler): if ( # A best effort test for browser traffic. All common browsers # start with Mozilla at the time of writing. dashboard_optional_utils.is_browser_request(request) and request.method in [hdrs.METH_POST, hdrs.METH_PUT] ): return aiohttp.web.Response( status=405, text="Method Not Allowed for browser traffic." ) return await handler(request) ``` https://github.com/ray-project/ray/blob/e7889ae542bf0188610bc8b06d274cbf53790cbd/python/ray/dashboard/http_server_head.py#L184-L196 This is because the fundamental assumption that the `User-Agent` header can't be manipulated is incorrect. In Firefox and in Safari, the `fetch` API allows the `User-Agent` header to be set to a different value. Chrome is not vulnerable, ironically, because of a [bug](https://issues.chromium.org/issues/40450316), bringing it out of spec with the `fetch` specification. Exploiting this vulnerability requires a DNS rebinding attack against the browser. Something trivially done by modern tooling like [nccgroup/singularity](https://github.com/nccgroup/singularity). # PoC Please note, this full PoC will be going live at time of disclosure. 1. Launch Ray `ray start --head --port=6379` 2. Ensure that the ray dashboard/service is running on port `8265` 3. Launch an internet facing version of NCCGroup/Singularity following the [setup guide here](https://github.com/ncc

CVSS 4.0
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
Severity from
GitHub (reviewed advisory)
Weakness
CWE-352, CWE-94
Also known as
CVE-2025-62593, PYSEC-2026-520

More Ray advisories

All Ray
DateAdvisory
Nov 272025Ray's New Token Authentication is Disabled By Default
CVE-2025-34351Criticalno fix yet
Feb 20Ray dashboard DELETE endpoints allow unauthenticated browser-triggered DoS (Serve shutdown / job deletion)
CVE-2026-27482Medium5.9fixed in 2.54.0
Mar 17Ray Dashboard is vulnerable to path traversal through its static file handling mechanism
CVE-2026-32981High7.5fixed in 2.8.1
Apr 24Ray: Remote Code Execution via Parquet Arrow Extension Type Deserialization
CVE-2026-41486Highfixed in 2.55.0
Jul 24Ray: Arbitrary code execution via ray.data.read_webdataset default decoder: pickle.loads(value) and torch.load(weights_only=False)
CVE-2026-57516High8.8fixed in 2.56.0
Mar 62025ray vulnerable to Insertion of Sensitive Information into Log File
CVE-2025-1979Medium6.4fixed in 2.43.0

Critical advisories by email

Wednesdays: the week’s critical and high advisories in the AI and data stack, with the fixed versions. Only in weeks that have some.

Double opt-in. Unsubscribe any time.