Case study · AI model security · GenAI supply chain

The package you named is clean.
The one it pulled was not.

Eight pyannote speaker-diarization models we watched on Sep 7, 2026 name one clean package as their library. Between them they drew about 26.6 million downloads in the 30 days to Oct 8, 2026. One hop below that package sat lightning 2.6.5, with a HIGH-severity remote code execution reachable through a checkpoint file, and no manifest mentions it. CyberXYZ connected GitHub's advisory to these models by reading the whole install. Lightning fixed it in 2.6.6 on Sep 10, 2026.

Updated Oct 8, 2026: lightning 2.6.6, released Sep 10, 2026, fixes CVE-2026-58659, and a fresh install of these models now resolves to it. This page first said no fix had shipped; it now describes the exposure window, Jul 15 to Sep 10. We also removed two signals from the verdict card (PyYAML and tensorboardX flagged as new runtime dependencies of lightning 2.6.5). Both were our own false positives: PyYAML was already a dependency of 2.6.4, and tensorboardX is only an optional extra. Download and model counts now carry dates, and the timeline shows when we connected the advisory to these models.

Vulnerable by inheritance · case study

One clean line in a manifest,
and the RCE it never mentioned.

Speaker diarization is the unglamorous layer under call transcription, meeting notes and compliance recording: who spoke, and when. pyannote's models are the default choice, pulled millions of times a month, and they name one Python package as their library. That package is clean. This is the story of what it brings with it.

8models affected, Sep 7
26.6Mdownloads, 30 days to Oct 8
1 hopbelow the manifest
7.8CVSS 3.1 · HIGH
  1. Jun 30, 2026

    A clean release

    pyannote-audio 4.0.7 ships. Its dependency list is short and ordinary, and one line in it reads lightning>=2.4: a floor, and no ceiling. The pyannote models we watch name pyannote-audio as their library. 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. Run pyannote-audio 4.0.7 through CyberXYZ on its own and it comes back with zero signals. It is, genuinely, clean.

  2. Jul 15, 2026

    The turn: a checkpoint that runs code

    GitHub publishes GHSA-qqmf-gpg7-g8gw (CVE-2026-58659, CVSS 3.1 7.8, HIGH). PyTorch Lightning's _load_state imports and executes whatever module name a checkpoint's _instantiator hyperparameter points at. A crafted checkpoint file, the very artifact people download and share to use these models, becomes arbitrary code execution on load, even with weights_only=True. Every release before 2.6.6 is affected, up to and including 2.6.5, the current release that day. No fixed release had shipped yet.

  3. Same day

    What a manifest scanner sees

    Nothing. The models never name lightning. Their one declared dependency has no advisory against it. A tool that reads requirements files, and stops there, reports eight clean models. That is not a bug in those tools; it is the boundary of what a manifest can tell you.

  4. Attacker

    A checkpoint is the payload

    Picture a call-center analytics team. Their transcription pipeline pulls a pyannote model, and a colleague shares a fine-tuned checkpoint that "works better on our accents". Checkpoints are just files; people trade them. An attacker who plants one, on a model hub, in a shared drive, in a pull request, sets its _instantiator hyperparameter to a module they control. The next time anyone loads it through the pipeline, lightning imports and executes that module. No exploit kit, no network trick: a file the victim wanted, opened by code they trusted, through a package they never knew they had.

  5. Sep 6, 2026

    The connection · the closure fires

    On Sep 3, GitHub reviewed the advisory and mapped it to the lightning package on PyPI. Around Sep 6, CyberXYZ connected it to these models. We resolve each model to the whole install, not the manifest: what pip install pyannote-audio actually puts on the machine, at the versions that resolve that day. The path is short:

    pyannote/segmentation-3.0 → pyannote-audio 4.0.7 → lightning 2.6.5

    Depth one. Required, not optional. The floor >=2.4 admits 2.6.5, the advisory range covers 2.6.5, and nothing pins it lower. The finding is version-confirmed: not "this package has had a CVE once", but "the version a fresh install lands on is the vulnerable one." That held from Jul 15 until Sep 10.

  6. Same day

    Eight models change colour

    On the AI Models surface the eight pyannote models we watched, rated CLEAN on their declared surface, moved to HIGH, with the reason recorded: one confirmed finding in the transitive closure. The prediction layer filed them under a single attack vector, vulnerable by inheritance, at 7.0 out of 10. Three more pyannote models we added on Sep 9 rated HIGH for the same reason, eleven in all. The declared-only rating is kept beside the new one, so the change is visible, not silent.

  7. Mapping

    MITRE ATLAS and ATT&CK

    This is an AI supply-chain technique first: ATLAS AML.T0010.003 (ML Supply Chain Compromise: Model) delivers the poisoned checkpoint, and AML.T0011.000 (User Execution: Unsafe ML Artifacts) is the moment it runs. The path into the machine is a classic software dependency: ATT&CK T1195.001 (Compromise Software Dependencies), executed through T1204.002 (User Execution: Malicious File) and T1059.006 (Python). The weakness class is CWE-470, unsafe reflection.

  8. At install

    The verdict · alert

    Ask the firewall about lightning@2.6.5 directly and it answers alert: the HIGH advisory matches that version, advisory XYZ score 4.2, and it suggests 2.6.6 instead. Not a block. A HIGH advisory with no public exploit and a local attack vector is a warning, and the platform says so rather than inflating it. The card below is that answer, re-checked on Oct 8, 2026.

  9. Sep 10, 2026

    The fix ships, and what to do

    Lightning releases 2.6.6 with the fix (commit d710d68). A fresh install now resolves to it, and our data rates the eight models CLEAN again. The exposure was real while it lasted: for 57 days, from Jul 15 to Sep 10, a fresh install of these models landed on a vulnerable lightning. If you pin lightning, or built an environment in that window, upgrade to lightning>=2.6.6, or add it as a constraint until pyannote-audio raises its floor, which still admits the vulnerable releases. Keep treating checkpoint files from anywhere you do not control as untrusted input, and load them only in an isolated environment. And read the whole install, because the exposure that matters most is usually the one nobody wrote down.

Matched below the manifest

GitHub's advisory, matched to
the version the install actually resolved.

app.cyberxyz.io/dashboard/ai-models · pyannote/segmentation-3.0 · reachability
transitive finding · depth 1Sep 7, 2026 · re-checked Oct 8, 2026

Alert: lightning@2.6.5 reached from pyannote/segmentation-3.0 via pyannote-audio 4.0.7

0/10
ADVISORY XYZ high advisory · verdict alert
SIGNALS
BLAST RADIUS0 models on Sep 7 · 0M downloads, 30 days to Oct 8
speaker-diarization-3.1 · 7.1Mwespeaker-voxceleb-resnet34-LM · 6.2Mspeaker-diarization-community-1 · 5.6M+5 more
STATEMENTEcosystem PyPI · decision alert · GHSA-qqmf-gpg7-g8gw / CVE-2026-58659 matches 2.6.5, the version a fresh install resolved until Sep 10 · pin lightning>=2.4 admits it · fixed in 2.6.6 (Sep 10, 2026)
SIGNALS · 1 of 1 fired
01Live Threat Intel · advisory matchHIGH

GHSA-qqmf-gpg7-g8gw · CWE-470 unsafe reflection · CVSS 3.1 7.8 · version-confirmed on 2.6.5 · EPSS 0.63% (Oct 8, 2026).

PACKAGE CONTEXT
version 2.6.5 · published May 27, 2026 · reached via pyannote-audio 4.0.7 at depth 1 on the required path · fixed in 2.6.6, published Sep 10, 2026 · source github.com/Lightning-AI/pytorch-lightning
PACKAGE lightningVERSION 2.6.5ECOSYSTEM PyPIDECISION ALERT

fig. 01 · the platform's verdict for lightning@2.6.5, re-checked Oct 8, 2026 · advisory XYZ 4.2, one signal, decision alert · two dependency signals shown here before Oct 8 were our own false positives and are removed

Indicators and mapping

What to look for,
and where it sits on the matrices.

indicators · observed, not projected
package
lightning < 2.6.6 · every release up to and including 2.6.5 · fixed in 2.6.6 (Sep 10, 2026)
advisory
GHSA-qqmf-gpg7-g8gw · CVE-2026-58659 · CVSS 3.1 7.8 (8.4 under CVSS 4.0) · CWE-470 unsafe reflection
sink
lightning._load_state imports the module named in a checkpoint's _instantiator hyperparameter
carrier
any .ckpt or .pt checkpoint whose hyperparameters carry a module path outside Lightning's own
path
pyannote model → pyannote-audio 4.0.7 (pin lightning>=2.4) → lightning 2.6.5 until Sep 10, 2.6.6 since · depth 1 · required · speaker-diarization-3.1's requirements.txt pins pyannote-audio==3.1.1, whose floor lightning>=2.0.1 also admitted 2.6.5
models
speaker-diarization-3.1 · wespeaker-voxceleb-resnet34-LM · segmentation-3.0 · speaker-diarization-community-1 · segmentation · voice-activity-detection · embedding · speaker-diarization (watched Sep 7, 2026) · added Sep 9 and rated the same: speaker-diarization-3.0 · overlapped-speech-detection · speaker-diarization-precision-2
detect
a resolved lightning below 2.6.6 where third-party checkpoints are loaded · an _instantiator value outside lightning.* or pytorch_lightning.*
mapping
ATLAS AML.T0010.003 · ML Supply Chain Compromise: Model ATLAS AML.T0011.000 · User Execution: Unsafe ML Artifacts ATT&CK T1195.001 · Compromise Software Dependencies ATT&CK T1204.002 · User Execution: Malicious File ATT&CK T1059.006 · Python CWE-470 · Unsafe Reflection

fig. 02 · indicators from the advisory, the registry and our fact table · no hashes or hosts: none were observed in an attack

Sources: GitHub Security Advisory GHSA-qqmf-gpg7-g8gw (published Jul 15, 2026; reviewed and mapped to the lightning package Sep 3, 2026), NVD CVE-2026-58659, the lightning 2.6.6 release (Sep 10, 2026), PyPI release metadata for pyannote-audio 4.0.7 and 3.1.1 and lightning 2.6.5 and 2.6.6, and the CyberXYZ AI-models fact table as of Sep 7, 2026, re-checked Oct 8, 2026. Hugging Face download counts are 30-day figures taken Oct 8, 2026. Figures reflect the platform's output for the versions named; they are not projections.

The full technical write-up, with the dependency path, the advisory timeline and why manifest scanners miss this class, is in the research note: Vulnerable by inheritance: pyannote and the RCE it never named.

See the whole install, not the manifest → How the platform reads a dependency tree