
Cloud Vulnerability DB
A community-led vulnerabilities database
CVE-2026-41486 is a Remote Code Execution (RCE) vulnerability in Anyscale Ray Data caused by unsafe deserialization of Arrow extension type metadata when reading Parquet files. Ray Data registers custom PyArrow extension types (ray.data.arrow_tensor, ray.data.arrow_tensor_v2, ray.data.arrow_variable_shaped_tensor) globally; when PyArrow reads a Parquet file containing one of these types, it invokes __arrow_ext_deserialize__ on the field's metadata bytes, which Ray passes directly to cloudpickle.loads(), enabling arbitrary code execution during schema parsing. Affected versions are Ray 2.49.0 through 2.54.0; the vulnerability was patched in Ray 2.55.0. It was first published on April 21, 2026, and carries a CVSS v3.1 score of 8.8 (High) and a CVSS v4.0 score of 8.9 (High) (GitHub Advisory, Ray Security Advisory).
The root cause is unsafe deserialization of untrusted data (CWE-502) combined with improper code injection (CWE-94). The vulnerable _deserialize_with_fallback function in python/ray/data/_internal/tensor_extensions/arrow.py attempted cloudpickle.loads() first on any metadata bytes received from a Parquet field, with no validation or integrity check. Because Ray registers its extension types globally in PyArrow, any Parquet read operation in the process — including ray.data.read_parquet(), pyarrow.parquet.read_table(), and pandas.read_parquet() — is affected. The vulnerability was originally introduced in commit f6d21db1a4 (PR #54831, July 2025) and first shipped in Ray 2.49.0, reintroducing a class of deserialization flaw that had been fixed in May 2024 (issue #41314, PR #45084). Exploitation occurs during schema parsing, before any row data is read, meaning the payload executes immediately upon opening a crafted file (GitHub Advisory, Fix PR #62056).
Successful exploitation results in arbitrary Python code execution as the Ray worker process user, leading to full server compromise. All three CIA pillars are critically impacted: an attacker can exfiltrate sensitive data (confidentiality), modify or corrupt data and models in the pipeline (integrity), and disrupt or terminate Ray worker processes (availability). Because Ray is commonly deployed in distributed AI/ML compute environments, a compromised worker could serve as a pivot point for lateral movement across the cluster, potentially affecting subsequent systems with equally high confidentiality, integrity, and availability impact as reflected in the CVSS v4.0 subsequent system metrics (GitHub Advisory, Ray Security Advisory).
No public proof-of-concept exploit code has been observed, and there is no evidence of in-the-wild exploitation at this time (GitHub Advisory). The EPSS score is approximately 0.045% (14th percentile), indicating a low current probability of exploitation in the next 30 days. The vulnerability is not listed in the CISA Known Exploited Vulnerabilities (KEV) catalog. Exploitation requires user interaction — a Ray Data pipeline must be directed to read a crafted Parquet file — but requires no authentication or cluster access from the attacker, lowering the barrier for targeted attacks against Ray Data users (GitHub Advisory).
ray.data.arrow_tensor, ray.data.arrow_tensor_v2, or ray.data.arrow_variable_shaped_tensor) as the field's Arrow extension type name.cloudpickle.dumps() and embed the resulting bytes as the extension type's metadata in the Parquet file's schema.ray.data.read_parquet(), pandas.read_parquet(), or pyarrow.parquet.read_table()), PyArrow invokes __arrow_ext_deserialize__ on the metadata bytes during schema parsing._deserialize_with_fallback passes the metadata bytes to cloudpickle.loads(), deserializing and executing the attacker's payload as the Ray worker process user before any row data is read (GitHub Advisory, Fix PR #62056)./bin/bash, curl, wget, python, nc) during Parquet file reads, particularly before any data processing output is produced.cloudpickle.loads() or __arrow_ext_deserialize__ in tensor_extensions/arrow.py; anomalous Parquet files with extension type metadata that is not valid JSON (binary/non-printable bytes in schema metadata fields).ray.data.arrow_tensor, ray.data.arrow_tensor_v2, or ray.data.arrow_variable_shaped_tensor and non-JSON (binary cloudpickle) metadata bytes (GitHub Advisory, Fix PR #62056).Primary remediation: Upgrade Ray to version 2.55.0 or later, which replaces cloudpickle.loads() with json.loads() as the default deserialization path for Arrow extension type metadata (Ray 2.55.0 Release, Fix PR #62056).
Workarounds for users unable to upgrade immediately:
RAY_DATA_AUTOLOAD_CLOUDPICKLE_TENSOR_METADATA=1 re-enables cloudpickle deserialization — use this only with files from fully trusted sources.RAY_DATA_AUTOLOAD_CLOUDPICKLE_TENSOR_METADATA=1 in environments where Parquet files from untrusted sources may be processed.The vulnerability was reported by security researcher shakevsky and published by x01-emre via GitHub's security advisory process on April 21, 2026 (Ray Security Advisory). The fix was developed by Anyscale engineers and merged on March 27, 2026 (prior to public disclosure), with the patch shipped in Ray 2.55.0. The advisory notes this is a regression — a nearly identical vulnerability class was fixed in May 2024 and reintroduced in July 2025 via PR #54831, which has drawn attention to the importance of security review for deserialization code paths in AI/ML frameworks. Tenable's Nessus scanner (plugin 311475) added detection for this vulnerability shortly after disclosure.
Source: This report was generated using AI
Free Vulnerability Assessment
Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.
Get a personalized demo
"Best User Experience I have ever seen, provides full visibility to cloud workloads."
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
"We know that if Wiz identifies something as critical, it actually is."