Description
Stanza is a Stanford NLP Python library for tokenization, sentence segmentation, NER, and parsing of many human languages. From 1.14.0 until 1.15.0, loading an attacker-supplied lemmatizer checkpoint can execute arbitrary code because stanza/models/lemma/trainer.py stores pos_dict as gzip-compressed pickle bytes and Trainer.load passes the decompressed stream to unrestricted pickle.loads. The outer torch.load call uses weights_only=True, but the nested bytes are treated as a primitive and are not inspected by that allowlist. The path is reachable during pipeline construction through a caller-influenced lemma_model_path, before inference begins. This issue is fixed in version 1.15.0.
Published: 2026-11-03
Score: 7.8 High
EPSS: n/a
KEV: No
Impact: Remote Code Execution
Action: Patch Now
AI Analysis

Impact

Stanza is a Stanford NLP Python library that offers tokenization, sentence segmentation, NER, and parsing for many languages. Versions 1.14.0 through 1.15.0 contain a flaw in the lemmatizer checkpoint loading routine: the library decompresses gzip‑compressed pickle data into a byte stream and passes that stream directly to pickle.loads, enabling an attacker who can supply a malicious lemmatizer checkpoint to execute arbitrary Python code. The vulnerability is a classic deserialization flaw (CWE‑502) compounded by the execution of code via bytecode injection (CWE‑94).

Affected Systems

The affected product is the Stanford NLP Stanza Python library. Any environment that installs Stanza 1.14.0, 1.14.1, or 1.15.0 (or any intermediate release) and constructs a pipeline that loads a lemmatizer model from a path supplied by an untrusted source is vulnerable. The issue is resolved in Stanza 1.15.0, so updating to this or later releases eliminates the problem.

Risk and Exploitability

The CVSS v3.1 score of 7.8 indicates high severity, but no EPSS data is available, and the vulnerability is not listed in the CISA KEV catalog. Exploitation requires delivery of a crafted lemmatizer checkpoint to the application’s filesystem and then triggering pipeline construction via the lemma_model_path argument. Because the deserialized object is executed with the same privileges as the running process, an attacker can achieve full code execution, compromising confidentiality, integrity, and availability of the host system. The likely attack vector is a local or remote attacker who can influence the model path during pipeline setup, for example through a web API that accepts user‑provided data.

Generated by OpenCVE AI on November 3, 2026 at 21:48 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade Stanza to version 1.15.0 or later, which removes the unchecked pickle.loads call.
  • Validate that any lemmatizer checkpoints are sourced from trusted, signed providers before loading; avoid loading checkpoints supplied by external users.
  • Restrict filesystem permissions on directories containing lemmatizer checkpoints and enforce path validation to prevent arbitrary file loading by untrusted actors.

Generated by OpenCVE AI on November 3, 2026 at 21:48 UTC.

Tracking

Sign in to view the affected projects.

Advisories
Source ID Title
Github GHSA Github GHSA GHSA-gh9r-c94j-cmp5 Stanza: RCE via pickle deserialization in the lemmatizer
History

Tue, 03 Nov 2026 23:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'none', 'Technical Impact': 'total'}, 'version': '2.0.3'}


Tue, 03 Nov 2026 22:15:00 +0000

Type Values Removed Values Added
First Time appeared Stanfordnlp
Stanfordnlp stanza
Vendors & Products Stanfordnlp
Stanfordnlp stanza

Tue, 03 Nov 2026 20:30:00 +0000

Type Values Removed Values Added
Description Stanza is a Stanford NLP Python library for tokenization, sentence segmentation, NER, and parsing of many human languages. From 1.14.0 until 1.15.0, loading an attacker-supplied lemmatizer checkpoint can execute arbitrary code because stanza/models/lemma/trainer.py stores pos_dict as gzip-compressed pickle bytes and Trainer.load passes the decompressed stream to unrestricted pickle.loads. The outer torch.load call uses weights_only=True, but the nested bytes are treated as a primitive and are not inspected by that allowlist. The path is reachable during pipeline construction through a caller-influenced lemma_model_path, before inference begins. This issue is fixed in version 1.15.0.
Title Stanza: RCE via pickle deserialization in the lemmatizer
Weaknesses CWE-502
CWE-94
References
Metrics cvssV3_1

{'score': 7.8, 'vector': 'CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H'}


Subscriptions

Stanfordnlp Stanza
cve-icon MITRE

Status: PUBLISHED

Assigner: GitHub_M

Published:

Updated: 2026-11-03T22:39:36.547Z

Reserved: 2026-10-23T19:37:27.176Z

Link: CVE-2026-115878

cve-icon Vulnrichment

Updated: 2026-11-03T22:36:43.196Z

cve-icon NVD

Status : Received

Published: 2026-11-03T21:17:02.377

Modified: 2026-11-03T23:17:30.297

Link: CVE-2026-115878

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-11-03T22:00:05Z

Weaknesses
  • CWE-502

    Deserialization of Untrusted Data

  • CWE-94

    Improper Control of Generation of Code ('Code Injection')