
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
CNA: VulnCheck
게시일: 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