
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 (vergeben 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)
Gemeldet von: Sai Teja Erukude
CNA: VulnCheck
Veröffentlicht: 27. August 2026
SpeechBrain vor verwendet PyYAMLs unsicheren Loader beim Parsen von -Checkpoint-Metadaten während der Checkpoint-Wiederherstellung.
1.1.1CKPT.yamlEin Angreifer, der ein SpeechBrain-Checkpoint-Verzeichnis bereitstellen oder modifizieren 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 vom Angreifer kontrollierte Checkpoint-Metadaten während der Checkpoint-Erkennung Python-Code ausführen.
Der bösartige Checkpoint muss nicht ausgewählt oder wiederhergestellt werden. Die Codeausführung erfolgt, während SpeechBrain Checkpoint-Kandidaten aufzählt.
Ein Angreifer kann beliebigen Python-Code im Kontext des Python-Prozesses ausführen, der SpeechBrain ausführt.
Dies kann Workflows betreffen, in denen Benutzer Checkpoint-Verzeichnisse, Modellartefakte oder Archive aus nicht vertrauenswürdigen Quellen herunterladen, entpacken, fortsetzen oder Training/Inferenz daraus ausführen.
Abhängig vom Hosting-Prozess kann dies Folgendes ermöglichen:
Die betroffene Komponente ist der Checkpoint-Wiederherstellungs-/Auflistungsablauf von SpeechBrain:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
Während der Checkpoint-Auflistung scannt SpeechBrain Unterverzeichnisse mit dem Namen CKPT*, die CKPT.yaml enthalten. Jede Kandidaten-Metadatendatei wird vor der endgültigen Checkpoint-Auswahl geparst.
Das unsichere Parsen erfolgt in speechbrain.utils.checkpoints.checkpoints.py:
meta = yaml.load(fi, Loader=yaml.Loader)
Der PoC erstellt zwei Checkpoints:
CKPT+poisoned-metadata: ein älterer bösartiger Checkpoint, dessen CKPT.yaml ein PyYAML-Objekt-Apply-Payload enthält.CKPT+benign-newer: ein neuerer harmloser Checkpoint, der nach Aktualität ausgewählt werden sollte.Der harmlose Checkpoint wird ausgewählt, aber die bösartigen Checkpoint-Metadaten werden während der Kandidatenauflistung trotzdem ausgeführt. Dies demonstriert eine Codeausführung zum Zeitpunkt des Metadaten-Parsings, 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 auf verwundbaren 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 Nachweis ist, dass benign_checkpoint_selected: True und marker_after_recovery: True zusammen auftreten. Dies zeigt, dass der bösartige ältere Checkpoint nicht für die Wiederherstellung ausgewählt wurde, seine Metadaten aber dennoch geparst und ausgeführt wurden, während SpeechBrain Checkpoint-Kandidaten auflistete.
Das Payload ist absichtlich harmlos. Es schreibt nur diese lokale Markierungszeichenfolge:
speechbrain_checkpoint_yaml_loader_rce_triggered
Es startet keine Shell, verbindet sich nicht mit einem Netzwerkdienst, liest keine Geheimnisse, löscht keine Daten und ändert keine Dateien außerhalb des PoC-Verzeichnisses.
Upgrade auf SpeechBrain 1.1.1 oder höher.
Die dauerhafte Code-Korrektur 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 Skalarwerte wie unixtime und end-of-epoch, daher sollte die Python-Objektkonstruktion für diesen Parse-Pfad nicht aktiviert sein.
Falls ein sofortiger Patch oder ein Upgrade nicht verfügbar ist:
CKPT.yaml ab.Entdeckt und gemeldet von Sai Teja Erukude, koordiniert über VulnCheck.
exploit_walkthrough.md