
SpeechBrain < 1.1.1 체크포인트 메타데이터에서 안전하지 않은 PyYAML 파싱으로 인한 CKPT.yaml의 RCE 취약점.
심각도: 높음, 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는 두 개의 체크포인트를 생성합니다:
CKPT+poisoned-metadata: CKPT.yaml에 PyYAML 객체 적용 페이로드가 포함된 오래된 악성 체크포인트입니다.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