Back to all posts
High AI model security

Vulnerable by inheritance:
eight speaker models and the RCE they never named

pyannote's speaker-diarization models declare one clean Python package. One hop below it, lightning 2.6.5 carries a checkpoint-loading remote code execution. No manifest mentions it. Reading the whole install does.

CyberXYZ Security TeamThreat Intelligence
6 min read
If you load pyannote models, you run lightning 2.6.5

A fresh pip install pyannote-audio resolves lightning to 2.6.5, affected by CVE-2026-58659 (GHSA-qqmf-gpg7-g8gw, CVSS 7.8). A crafted checkpoint executes code on load. No fixed release has shipped. Treat third-party checkpoints as untrusted input until one does.

Summary

What happened

Speaker diarization is the layer under call transcription, meeting notes and compliance recording: who spoke, and when. pyannote's models are a default choice. Each declares exactly one Python dependency, pyannote-audio, whose current release 4.0.7 (June 30, 2026) is clean by every advisory we hold.

On July 15, 2026 GitHub published GHSA-qqmf-gpg7-g8gw, CVE-2026-58659, against PyTorch Lightning. The _load_state routine imports and executes whatever module name a checkpoint's _instantiator hyperparameter points at. Every released version through the current 2.6.5 is affected; the fix exists as a commit, not a release. pyannote-audio requires lightning>=2.4, a floor with no ceiling, so a fresh install lands on the vulnerable version today.

The package you named is clean. The one it pulls is not. A manifest cannot tell you the difference.

Why manifest scanners miss this

The models never name lightning, and pyannote-audio has no advisory against it. A scanner that reads requirements files and stops there reports eight clean models. That is the boundary of what a manifest can tell you, not a bug in those tools.

The attack chain

1
A clean loader ships

pyannote-audio 4.0.7 releases with lightning>=2.4. Checked alone, it fires no signal.

2
The advisory lands

GHSA-qqmf-gpg7-g8gw: a checkpoint's hyperparameters can name a module that lightning imports and runs on load.

3
The floor admits the vulnerable version

No upper bound, so every fresh install resolves lightning to 2.6.5, which the advisory covers.

4
A checkpoint is shared

A colleague passes along a fine-tuned checkpoint that works better on our accents. Checkpoints are files; people trade them.

5
Loading it runs the attacker's module

The pipeline loads the checkpoint through lightning. _load_state imports the module the file names. Code executes with the pipeline's privileges.

6
The closure catches it

CyberXYZ resolves each model to the whole install. The path from a pyannote model through pyannote-audio to lightning 2.6.5 is depth one, required, version-confirmed. Eight models move from CLEAN to HIGH, with the reason recorded.

Indicators

TypeIndicatorContext
Packagelightning <= 2.6.5Every released version; no fixed release as of September 7, 2026
AdvisoryGHSA-qqmf-gpg7-g8gwCVE-2026-58659, CVSS 7.8, CWE-470 unsafe reflection
Sinklightning._load_stateImports the module named in a checkpoint's _instantiator hyperparameter
Carrier*.ckpt / *.ptAny checkpoint whose hyperparameters carry a module path outside Lightning's own namespaces
Pinlightning>=2.4Declared by pyannote-audio 4.0.7; admits the vulnerable release
Modelspyannote/*speaker-diarization-3.1, wespeaker-voxceleb-resnet34-LM, segmentation-3.0, speaker-diarization-community-1, segmentation, voice-activity-detection, embedding, speaker-diarization

No hashes or hosts are listed because none were observed in an attack. These indicators describe the exposure, not an intrusion.

MITRE mapping

On MITRE ATLAS, the matrix for attacks on AI systems, this is a supply-chain compromise of the model artifact that ends in a user executing an unsafe artifact. On ATT&CK it is a software-dependency compromise triggered by a malicious file.

ATLAS · Initial AccessAML.T0010.003ML Supply Chain Compromise: Model
ATLAS · ExecutionAML.T0011.000User Execution: Unsafe ML Artifacts
Initial AccessT1195.001Compromise Software Dependencies
ExecutionT1204.002User Execution: Malicious File
ExecutionT1059.006Command and Scripting Interpreter: Python

How CyberXYZ sees it

We do not stop at the manifest. Every watched model is resolved to its transitive closure at the versions that install today, and each reachable package is checked against advisories only when the resolved version is in range and the path is required. Asked about pyannote-audio@4.0.7 alone, the engine fires nothing. Asked about lightning@2.6.5, it answers alert, XYZ score 4.2, with the advisory named. The fleet view now rates the eight pyannote models HIGH and files them under one attack vector: vulnerable by inheritance. The full step-by-step, with the platform's own verdict card, is in the case study.

Recommended actions

Now

Inventory environments that resolve lightning at any 2.x and load checkpoints from outside your control. Load third-party checkpoints only in isolation. Inspect _instantiator values in checkpoint hyperparameters; anything outside lightning.* or pytorch_lightning.* is suspect.

Short term: watch the upstream fix and constrain lightning the moment a fixed release ships. Long term: resolve your models to the whole install, not the manifest, and ask package maintainers to put ceilings on floor-only pins.


References

  1. GitHub Security Advisory, GHSA-qqmf-gpg7-g8gw
  2. NIST NVD, CVE-2026-58659
  3. MITRE ATLAS, AML.T0010.003 and AML.T0011.000
  4. MITRE ATT&CK, T1195.001
  5. CyberXYZ, Case study: pyannote and the package it never named
👋

Let's Talk

Want to learn how CyberXYZ protects your supply chain? We'd love to hear from you.