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 name one clean Python package. One hop below it, lightning 2.6.5 carried a checkpoint-loading remote code execution until 2.6.6 fixed it on September 10, 2026. No manifest mentions it. Reading the whole install does.

CyberXYZ Security TeamThreat Intelligence
6 min read

Updated October 8, 2026: lightning 2.6.6, released September 10, 2026, fixes CVE-2026-58659, and a fresh install of these models now resolves to it. This post first said no fix had shipped; it now describes the exposure window, July 15 to September 10. Download and model counts now carry dates, and the timeline shows when we connected the advisory to these models. The companion case study also drops two verdict-card signals that were our own false positives.

If you pin lightning, upgrade to 2.6.6 or later

From July 15 to September 10, 2026, a fresh pip install pyannote-audio resolved lightning to 2.6.5, affected by CVE-2026-58659 (GHSA-qqmf-gpg7-g8gw, CVSS 3.1 7.8). A crafted checkpoint executes code on load. Lightning 2.6.6 fixes it, and a fresh install now resolves to it. If you pinned lightning, or built an environment in that window, upgrade to 2.6.6 or later, and keep treating third-party checkpoints as untrusted input.

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 names one Python package, pyannote-audio, as its library, and its current release, 4.0.7 (June 30, 2026), is clean by every advisory we hold. One of them, speaker-diarization-3.1, also ships a requirements.txt pinning pyannote-audio==3.1.1, whose own floor, lightning>=2.0.1, is just as open.

On July 15, 2026 GitHub published GHSA-qqmf-gpg7-g8gw, CVE-2026-58659, against PyTorch Lightning, and on September 3 reviewed it and mapped it to the lightning package on PyPI. The _load_state routine imports and executes whatever module name a checkpoint's _instantiator hyperparameter points at. Every release before 2.6.6 is affected, up to and including 2.6.5, the current release until September 10. pyannote-audio requires lightning>=2.4, a floor with no ceiling, so until then a fresh install landed on the vulnerable version. On September 10, 2026 Lightning shipped the fix (commit d710d68) in 2.6.6, and a fresh install resolves to it now.

The package you named is clean. The one it pulled was 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 until September 10 every fresh install resolved 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 connects it

Around September 6, three days after GitHub mapped the advisory to the lightning package, CyberXYZ connected it to these models by resolving each 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 moved from CLEAN to HIGH, with the reason recorded.

7
The fix ships

Lightning releases 2.6.6 on September 10. A fresh install resolves to it, and our data rates the eight models CLEAN again. Environments that pinned or cached an older lightning stay exposed until upgraded.

Indicators

TypeIndicatorContext
Packagelightning < 2.6.6Every release up to and including 2.6.5; fixed in 2.6.6, released September 10, 2026
AdvisoryGHSA-qqmf-gpg7-g8gwCVE-2026-58659, CVSS 3.1 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 (3.1.1, pinned by speaker-diarization-3.1, declares lightning>=2.0.1); both admit the vulnerable releases
Modelspyannote/*speaker-diarization-3.1, wespeaker-voxceleb-resnet34-LM, segmentation-3.0, speaker-diarization-community-1, segmentation, voice-activity-detection, embedding, speaker-diarization (the eight we watched on September 7, 2026; three more added September 9 rated the same)

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, advisory XYZ score 4.2, with the advisory named and 2.6.6 suggested instead. From around September 6 the fleet view rated the eight pyannote models HIGH under one attack vector, vulnerable by inheritance, and eleven by September 9. Since 2.6.6 shipped, every pyannote model we watch resolves lightning to the fixed release, and the eight read CLEAN again. CyberXYZ did not discover this vulnerability: GitHub published the advisory. What we added is the connection between that advisory and these models, through the install they actually resolve. The full step-by-step, with the platform's own verdict card, is in the case study.

Recommended actions

Now

Upgrade lightning to 2.6.6 or later wherever it is pinned or cached below that, or add lightning>=2.6.6 as a constraint until pyannote-audio raises its floor. Inventory environments built between July 15 and September 10, 2026 that 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: the fixed release has shipped, so constrain lightning to 2.6.6 or later in lockfiles and images. 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. OSV, GHSA-qqmf-gpg7-g8gw (fixed in 2.6.6)
  4. Lightning, release 2.6.6 (September 10, 2026), the fixed release
  5. MITRE ATLAS, AML.T0010.003 and AML.T0011.000
  6. MITRE ATT&CK, T1195.001
  7. 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.