---
id: CVE-2026-41486
aliases:
  - GHSA-mw35-8rx3-xf9r
  - PYSEC-2026-2272
  - PYSEC-2026-2296
title: 'Ray: Remote Code Execution via Parquet Arrow Extension Type Deserialization'
summary: 'Ray: Remote Code Execution via Parquet Arrow Extension Type Deserialization'
severity: high
vendor: ray
product: ray
ecosystem: pip
affected:
  - 'ray >= 2.49.0, < 2.55.0'
patched:
  - ray 2.55.0
published: '2026-04-24'
updated: '2026-09-10'
sourceUpdated: '2026-09-10T03:51:02.380215690Z'
source: OSV
sourceUrl: 'https://osv.dev/vulnerability/GHSA-mw35-8rx3-xf9r'
references:
  - url: 'https://github.com/ray-project/ray/security/advisories/GHSA-mw35-8rx3-xf9r'
  - url: 'https://nvd.nist.gov/vuln/detail/CVE-2026-41486'
  - url: 'https://github.com/ray-project/ray/pull/54831'
  - url: 'https://github.com/ray-project/ray/pull/62056'
  - url: >-
      https://github.com/ray-project/ray/commit/c02bd31ae31996805868baa446a131a8d304525f
  - url: 'https://github.com/ray-project/ray'
  - url: 'https://github.com/ray-project/ray/releases/tag/ray-2.55.0'
tags:
  - osv
  - pip
epss: 0.00704
epssPercentile: 0.51245
ingestedAt: '2026-07-13T18:58:00.874Z'
---

## Overview

Ray Data registers custom Arrow extension types (`ray.data.arrow_tensor`, `ray.data.arrow_tensor_v2`, `ray.data.arrow_variable_shaped_tensor`) globally in PyArrow. When PyArrow reads a Parquet file containing one of these extension types, it calls `__arrow_ext_deserialize__` on the field's metadata bytes. Ray's implementation passes these bytes directly to `cloudpickle.loads()`, achieving arbitrary code execution during schema parsing, before any row data is read.

In May 2024, Ray fixed a related vulnerability in `PyExtensionType`-based extension types ([issue #41314](https://github.com/ray-project/ray/issues/41314), [PR #45084](https://github.com/ray-project/ray/pull/45084)). In July 2025, [PR #54831](https://github.com/ray-project/ray/pull/54831) introduced `cloudpickle.loads()` into the replacement extension types' deserialization path, reintroducing the same class of vulnerability.

## Impact

- **Affected versions**: Ray 2.49.0 through 2.54.0 (latest release as of March 2026). The vulnerable `_deserialize_with_fallback` function with `cloudpickle.loads()` was introduced in commit `f6d21db1a4` ([PR #54831](https://github.com/ray-project/ray/pull/54831), July 2025), first released in Ray 2.49.0.
- **Affected configurations**: Any process that uses Ray Data and reads Parquet files. The extension types are registered globally in PyArrow, so all Parquet reads in the process are affected, including `ray.data.read_parquet()`, `pyarrow.parquet.read_table()`, `pandas.read_parquet()`, etc.
- **Attacker prerequisites**: The attacker must place a crafted Parquet file where a Ray Data pipeline reads it. No authentication or cluster access is required. The Parquet file must contain a column with a `ray.data.arrow_tensor` (or v2, or variable-shaped) extension type name, which makes this a targeted attack against Ray Data users.

## Affected packages

- `ray >= 2.49.0, < 2.55.0`

## Remediation

Upgrade to a patched release:

- `ray 2.55.0`
