
OpenMed < 1.5.2 PII 개인정보 보호 필터 모델 로딩 및 trust_remote_code=True를 통한 인증되지 않은 RCE
심각도: 치명적(Critical), CVSS 4.0 9.3, CVSS 3.1 9.8 (CNA인 VulnCheck가 배정)
벡터 (v4.0): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
벡터 (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
영향 범위: OpenMed < 1.5.2
수정 버전: 1.5.2
CWE: CWE-94 (코드 생성을 위한 제어 불량, 코드 인젝션)
보고자: Sai Teja Erukude
CNA: VulnCheck
게시일: 2026년 6월 2일
1.5.2 이전의 OpenMed에는 PII 개인정보 보호 필터 모델 로딩 경로에 인증되지 않은 원격 코드 실행 취약점이 존재합니다.
REST API 엔드포인트 POST /pii/extract 및 POST /pii/deidentify는 요청 본문에서 model_name 값을 받습니다. 취약한 버전에서는 개인정보 보호 필터 디스패처가 공격자가 제어할 수 있는 이 값에 광범위한 부분 문자열 매칭을 사용했습니다. 따라서 attacker/foo-privacy-filter-bar와 같은 모델 이름은 개인정보 보호 필터 백엔드로 라우팅될 수 있었습니다.
MLX/Torch가 아닌 배포 환경에서 해당 백엔드는 Transformers를 통해 Hugging Face 모델 아티팩트를 trust_remote_code=True로 로드했습니다. 공격자가 제어하는 모델 저장소의 config.json 또는 tokenizer_config.json에 auto_map을 통해 참조되는 사용자 정의 Transformers 코드가 포함된 경우, 모델 또는 토크나이저 로딩 중에 Transformers가 해당 Python 코드를 가져와 실행했습니다.
가져온 코드는 OpenMed 서비스 프로세스의 권한으로 실행되었습니다.
OpenMed REST API에 도달할 수 있는 인증되지 않은 원격 공격자는 model_name에 악의적인 Hugging Face 스타일 모델 식별자를 제공하여 서버에서 임의의 Python 코드를 실행할 수 있습니다.
서비스 배포 방식에 따라 다음이 가능할 수 있습니다:
두 PII 엔드포인트 모두 model_name을 허용하고 동일한 PII 추출/모델 로딩 경로를 사용하므로 이 문제는 두 엔드포인트를 통해 모두 발생할 수 있습니다:
POST /pii/extract
Content-Type: application/json
{
"text": "John Doe called 555-1212",
"model_name": "attacker/foo-privacy-filter-bar",
"confidence_threshold": 0.0
}
POST /pii/deidentify
Content-Type: application/json
{
"text": "John Doe called 555-1212",
"model_name": "attacker/foo-privacy-filter-bar",
"confidence_threshold": 0.0
}
취약한 제어 흐름에는 두 가지 신뢰 경계 실패가 있습니다:
model_name을 신뢰했습니다.trust_remote_code=True로 Transformers 아티팩트를 로드하여 원격 모델 저장소 코드를 신뢰했습니다.디스패처는 privacy-filter를 포함하는 모든 모델 식별자를 개인정보 보호 필터 계열의 일부로 취급했습니다. 이를 통해 공격자가 제어하는 식별자(예: attacker/foo-privacy-filter-bar)가 신뢰되는 자사(自社) Privacy Filter 모델용으로 의도된 코드 경로에 도달할 수 있었습니다.
해당 경로로 라우팅되면 Transformers는 auto_map을 통해 공격자가 제어하는 사용자 정의 코드를 로드할 수 있었습니다. 이 가져오기는 모델/토크나이저 로딩 중, 유용한 추론이 성공하기 전에 발생합니다. 따라서 증명 페이로드는 다음과 같이 작을 수 있습니다:
from pathlib import Path
Path("marker.txt").write_text(
"custom Transformers code executed via trust_remote_code\n",
encoding="utf-8",
)
poc_exploit.py는 이름에 privacy-filter가 포함된 무해한 로컬 Hugging Face 스타일 모델 디렉토리를 만듭니다. 생성된 사용자 정의 Transformers 모듈은 가져올 때 마커 파일을 작성합니다. 그런 다음 스크립트는 해당 디렉토리를 model_name으로 하여 테스트용 OpenMed API 인스턴스에 요청을 보냅니다.
취약한 OpenMed 버전에서 기대되는 동작은 다음과 같습니다:
model_name을 수락합니다.trust_remote_code=True 때문에 생성된 사용자 정의 모듈을 가져옵니다.로컬 테스트 인스턴스에 대해서만 실행하십시오:
pip install -r requirements.txt
python poc_exploit.py --target http://127.0.0.1:8000 --endpoint /pii/extract
OpenMed 서비스가 생성된 로컬 디렉토리에 접근할 수 없는 위치에서 실행되는 경우, 동등한 테스트 모델을 통제된 Hugging Face 저장소에 게시하고 해당 식별자를 명시적으로 전달하십시오:
python poc_exploit.py \
--target http://127.0.0.1:8000 \
--model-name your-org/foo-privacy-filter-bar \
--marker marker.txt
OpenMed 1.5.2 이상으로 업그레이드하십시오.
OpenMed 1.5.2는 라우팅과 신뢰를 분리합니다:
privacy-filter를 포함하는 임의의 저장소 이름은 더 이상 신뢰되는 개인정보 보호 필터 경로로 라우팅되지 않습니다.PrivacyFilterTorchPipeline은 trust_remote_code를 기본적으로 False로 설정합니다.OPENMED_TRUSTED_REMOTE_CODE_MODELS로 이를 허용 목록에 추가할 수 있습니다.즉시 업그레이드가 불가능한 경우:
model_name 값을 trust_remote_code=True로 Transformers에 전달하지 마십시오.Sai Teja Erukude가 발견 및 보고했으며, VulnCheck를 통해 조율되었습니다.
| 날짜 | 이벤트 |
|---|
| 2026년 5월 18일 | VulnCheck에 취약점 제출 |
| 2026년 5월 20일 | VulnCheck가 조율된 공개(disclosure) 연락 시작 |
| 2026년 5월 22일 | CVE-2026-47117 잠정 배정 |
| 2026년 6월 1일 | OpenMed 1.5.2 수정 사항 검토 및 확인 |
| 2026년 6월 2일 | CVE-2026-47117 공개 |