ANT-2026-PGRNAV88 · apache/spark
other critical
Severity Claude critical · Security research firm - · Maintainer -
Discovered by Claude Mythos Preview
Anthropic's analysis of this finding, sealed at approval.
ANT-2026-PGRNAV88: spark rce
UserDefinedType.fromJson() in python/pyspark/sql/types.py:2002 passes bytes taken from Parquet file metadata directly to cloudpickle.loads() with no validation. An attacker who can supply a crafted Parquet file to a PySpark consumer achieves arbitrary code execution in the reading process. No explicit .schema call is required — DataFrame.repr triggers the path automatically, so simply loading and displaying the file in the PySpark REPL or a Jupyter notebook is sufficient. This is the same class as CVE-2025-30065 (CVSS 10.0) but more direct, as it grants unrestricted pickle execution without needing any gadget chain.
Target
Project: Spark
Discovery: static analysis — not yet dynamically reproduced
Technical Details
The root cause is an unguarded call to cloudpickle.loads() on bytes sourced from untrusted Parquet metadata inside UserDefinedType.fromJson(). Because pickle deserialization is equivalent to code execution, any attacker who controls the Parquet file controls what runs in the PySpark process.
Reproduction
This finding was identified by static analysis and has not yet been dynamically reproduced. The Technical Details section above describes the code path; a trigger input is not included.
[No reproducer or sanitizer output attached — request from security-cvd@anthropic.com if needed.]
Acknowledgement
This vulnerability was discovered by Claude, Anthropic's AI assistant, and triaged by the Anthropic security team in collaboration with Anthropic Research. Please direct questions to security-cvd@anthropic.com and reference ANT-2026-PGRNAV88.
Reference: ANT-2026-PGRNAV88
Anthropic CVD Policy: https://www.anthropic.com/coordinated-vulnerability-disclosure
Dates from discovery through public reveal.
- 2026-02-24 Sent to maintainer
- 2026-02-24 Maintainer acknowledged
- 2026-03-29 Reported to tracker
- 2026-05-28 Publicly revealed
SHA-3-512 hash:
df1df10cd5da6ed1bcf3f42888538eb4e2c779a9380d2112eb5817e07456599f2a1690af8b658b2998df4aeef6390c161d3e990141b48a8ce0b0d8b62036dbcd
Committed 2026-05-08 09:37 PT
Revealed 2026-05-28 02:00 PT
Verify (download preimage.json)
Show preimage JSON
{
"ant_id": "ANT-2026-PGRNAV88",
"bug_class": null,
"claude_severity": "critical",
"commit_sha": null,
"created_at": "2026-03-29T20:43:37+00:00",
"description": "UserDefinedType.fromJson() in python/pyspark/sql/types.py:2002 passes bytes taken from Parquet file metadata directly to cloudpickle.loads() with no validation. An attacker who can supply a crafted Parquet file to a PySpark consumer achieves arbitrary code execution in the reading process. No explicit .schema call is required — DataFrame.__repr__ triggers the path automatically, so simply loading and displaying the file in the PySpark REPL or a Jupyter notebook is sufficient. This is the same class as CVE-2025-30065 (CVSS 10.0) but more direct, as it grants unrestricted pickle execution without needing any gadget chain.",
"discovered_at": "2026-02-22T00:00:00+00:00",
"location": null,
"poc_sha256": null,
"preimage_version": 1,
"project": "Spark",
"reproduction": null,
"technical_details": "The root cause is an unguarded call to cloudpickle.loads() on bytes sourced from untrusted Parquet metadata inside UserDefinedType.fromJson(). Because pickle deserialization is equivalent to code execution, any attacker who controls the Parquet file controls what runs in the PySpark process.",
"title": "spark rce",
"vendor_severity": null
}