深刻度: 高、CVSS 4.0 8.7、CVSS 3.1 8.8(CNA である VulnCheck により割り当て)
ベクター (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
ベクター (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
影響を受けるバージョン: SpeechBrain < 1.1.1
修正バージョン: 1.1.1 / コミット 22a6166
CWE: CWE-502(信頼できないデータのデシリアライゼーション)
発見および報告者: Sai Teja Erukude
公開日: 2026年8月27日
1.1.1 より前の SpeechBrain は、チェックポイント復元時に CKPT.yaml チェックポイントメタデータを解析する際に、PyYAML の安全でないローダーを使用しています。
SpeechBrain のチェックポイントディレクトリを提供または改変できる攻撃者は、CKPT* チェックポイントディレクトリ内に悪意のある CKPT.yaml ファイルを配置することができます。被害者が Checkpointer.recover_if_possible() を呼び出すと、SpeechBrain はチェックポイント候補を列挙し、すべての候補メタデータファイルを次の方法で解析します:
yaml.load(fi, Loader=yaml.Loader)
yaml.Loader は !!python/object/apply のような Python オブジェクト構築タグをサポートしているため、攻撃者が制御するチェックポイントメタデータは、チェックポイントの検出中に Python コードを実行する可能性があります。
悪意のあるチェックポイントは、選択または復元される必要はありません。コード実行は、SpeechBrain がチェックポイント候補を列挙している間に発生します。
攻撃者は、SpeechBrain を実行している Python プロセスのコンテキストで任意の Python コードを実行する可能性があります。
これは、ユーザーが信頼できないチェックポイントディレクトリ、モデルアーティファクト、またはアーカイブからダウンロード、展開、再開、またはトレーニング/推論を実行するワークフローに影響を与える可能性があります。
ホストプロセスに応じて、以下が可能になる場合があります:
影響を受けるコンポーネントは、SpeechBrain のチェックポイント復元/一覧表示フローです:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
チェックポイント一覧表示中、SpeechBrain は CKPT.yaml を含む CKPT* という名前の子ディレクトリをスキャンします。各候補のメタデータファイルは、最終的なチェックポイント選択の前に解析されます。
安全でない解析は speechbrain.utils.checkpoints.checkpoints.py で発生します:
meta = yaml.load(fi, Loader=yaml.Loader)
PoCは2つのチェックポイントを作成します:
CKPT+poisoned-metadata: CKPT.yaml にPyYAMLのobject-applyペイロードを含む、古い悪意のあるチェックポイント。CKPT+benign-newer: 最新性によって選択されるべき、より新しい良性のチェックポイント。良性のチェックポイントが選択されますが、候補のリストアップ中に悪意のあるチェックポイントのメタデータが依然として実行されます。これは、チェックポイントの復元とは独立した、メタデータのパース時のコード実行を実証しています。
package_builder.py は、攻撃者が制御するチェックポイントレイアウトを作成します。
run_poc.py は検証を実行し、Checkpointer.recover_if_possible() を呼び出し、実行の証拠を出力します。
ローカルのテスト環境でのみ実行してください:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
脆弱なバージョンで想定されるエビデンス:
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
重要な証拠は、benign_checkpoint_selected: True と
marker_after_recovery: True が同時に現れることです。これは、悪意のある
古いチェックポイントが復元用に選択されなかったものの、そのメタデータが
SpeechBrain がチェックポイント候補を列挙する際に依然として解析され
実行されたことを示しています。
ペイロードは意図的に無害です。ローカルのマーカー文字列を書き込むだけです:
speechbrain_checkpoint_yaml_loader_rce_triggered
シェルを起動したり、ネットワークサービスに接続したり、シークレットを読み取ったり、データを削除したり、PoCディレクトリ外のファイルを変更したりすることはありません。
SpeechBrain 1.1.1 以降にアップグレードしてください。
恒久的なコード修正は、チェックポイントメタデータにPyYAMLの安全なローダーを使用することです:
yaml.safe_load(fi)
または:
yaml.load(fi, Loader=yaml.SafeLoader)
チェックポイントのメタデータには unixtime や end-of-epoch などのスカラー値のみが必要であるため、この解析パスでは Python オブジェクトの構築を有効にすべきではありません。
即時のパッチやアップグレードが利用できない場合:
CKPT.yaml 内の予期しないタグやフィールドを検証するか、拒否してください。発見および報告:Sai Teja Erukude。
開示は VulnCheck を通じて調整されました。
exploit_walkthrough.md