
SpeechBrain < 1.1.1 Checkpoint-Metadaten RCE durch unsicheres PyYAML-Parsing von CKPT.yaml.
Schweregrad: Hoch, CVSS 4.0 8.7, CVSS 3.1 8.8 (zugewiesen von VulnCheck, der CNA)
Vektor (v4.0): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Vektor (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Betroffen: SpeechBrain < 1.1.1
Behoben in: 1.1.1 / Commit 22a6166
CWE: CWE-502 (Deserialisierung nicht vertrauenswürdiger Daten)
Entdeckt und gemeldet von: Sai Teja Erukude
Veröffentlicht: 27. August 2026
SpeechBrain vor 1.1.1 verwendet den unsicheren Loader von PyYAML beim Parsen von CKPT.yaml-Checkpoint-Metadaten während der Checkpoint-Wiederherstellung.
Ein Angreifer, der ein SpeechBrain-Checkpoint-Verzeichnis bereitstellen oder verändern kann, kann eine bösartige CKPT.yaml-Datei in einem CKPT*-Checkpoint-Verzeichnis platzieren. Wenn ein Opfer Checkpointer.recover_if_possible() aufruft, listet SpeechBrain Checkpoint-Kandidaten auf und parst jede Kandidaten-Metadatendatei mit:
yaml.load(fi, Loader=yaml.Loader)
Da yaml.Loader Python-Objektkonstruktions-Tags wie
!!python/object/apply unterstützt, können von Angreifern kontrollierte Checkpoint-Metadaten
Python-Code während der Checkpoint-Erkennung ausführen.
Der bösartige Checkpoint muss nicht ausgewählt oder wiederhergestellt werden. Die Codeausführung erfolgt, während SpeechBrain Checkpoint-Kandidaten auflistet.
Ein Angreifer kann beliebigen Python-Code im Kontext des Python-Prozesses ausführen, der SpeechBrain ausführt.
Dies kann Workflows beeinträchtigen, in denen Benutzer Trainings-/Inferenz-Checkpoints aus nicht vertrauenswürdigen Checkpoint-Verzeichnissen, Modellartefakten oder Archiven herunterladen, entpacken, fortsetzen oder ausführen.
Je nach Hosting-Prozess kann dies ermöglichen:
Die betroffene Komponente ist SpeechBrains Checkpoint-Wiederherstellungs-/Auflistungsablauf:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
Beim Auflisten von Checkpoints durchsucht SpeechBrain untergeordnete Verzeichnisse mit dem Namen CKPT*, die CKPT.yaml enthalten. Jede Kandidaten-Metadatendatei wird vor der endgültigen Checkpoint-Auswahl geparst.
Der unsichere Parse-Vorgang findet in speechbrain.utils.checkpoints.checkpoints.py statt:
meta = yaml.load(fi, Loader=yaml.Loader)
The PoC erstellt zwei Checkpoints:
CKPT+poisoned-metadata: ein älterer bösartiger Checkpoint, dessen CKPT.yaml
eine PyYAML-Object-Apply-Payload enthält.CKPT+benign-newer: ein neuerer gutartiger Checkpoint, der anhand des
Aktualitätsdatums ausgewählt werden sollte.Der gutartige Checkpoint wird ausgewählt, aber die Metadaten des bösartigen Checkpoints werden während der Kandidatenauflistung dennoch ausgeführt. Dies demonstriert eine Codeausführung zur Metadaten-Parse-Zeit, unabhängig von der Checkpoint-Wiederherstellung.
package_builder.py erstellt das vom Angreifer
kontrollierte Checkpoint-Layout.
run_poc.py führt die Validierung aus, ruft
Checkpointer.recover_if_possible() auf und gibt Ausführungsnachweise aus.
Nur in einer lokalen Testumgebung ausführen:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
Erwartete Nachweise bei anfälligen Versionen:
speechbrain_version: 1.1.0
installed_package: True
recovery_error: None
benign_checkpoint_selected: True
marker_before_recovery: False
marker_after_recovery: True
marker_contents:
speechbrain_checkpoint_yaml_loader_rce_triggered
success: True
Der wichtige Beleg ist, dass benign_checkpoint_selected: True und
marker_after_recovery: True gemeinsam auftreten. Dies zeigt, dass der
bösartige ältere Checkpoint nicht für die Wiederherstellung ausgewählt wurde, aber seine Metadaten
dennoch geparst und ausgeführt wurden, während SpeechBrain Checkpoint-Kandidaten auflistete.
Die Payload ist absichtlich harmlos. Sie schreibt lediglich diese lokale Marker-Zeichenkette:
speechbrain_checkpoint_yaml_loader_rce_triggered
Es startet keine Shell, verbindet sich mit keinem Netzwerkdienst, liest keine Geheimnisse, löscht keine Daten und ändert keine Dateien außerhalb des PoC-Verzeichnisses.
Aktualisieren Sie auf SpeechBrain 1.1.1 oder höher.
Der dauerhafte Code-Fix besteht darin, PyYAMLs sicheren Loader für Checkpoint-Metadaten zu verwenden:
yaml.safe_load(fi)
oder:
yaml.load(fi, Loader=yaml.SafeLoader)
Checkpoint-Metadaten benötigen nur skalare Werte wie unixtime und
end-of-epoch, daher sollte die Konstruktion von Python-Objekten für diesen
Parse-Pfad nicht aktiviert werden.
Wenn kein sofortiger Patch oder Upgrade verfügbar ist:
CKPT.yaml.Entdeckt und gemeldet von Sai Teja Erukude.
Die Offenlegung wurde über VulnCheck koordiniert.
exploit_walkthrough.md