
OpenMed < 1.5.2 RCE non autenticata tramite caricamento del modello del filtro privacy PII e trust_remote_code=True
Gravità: Critica, CVSS 4.0 9.3, CVSS 3.1 9.8 (assegnato da VulnCheck, il CNA)
Vector (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
Vector (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Interessati: OpenMed < 1.5.2
Corretto in: 1.5.2
CWE: CWE-94 (Controllo improprio della generazione di codice, Iniezione di codice)
Segnalato da: Sai Teja Erukude
CNA: VulnCheck
Pubblicato: 2 giugno 2026
OpenMed precedente alla versione 1.5.2 contiene una vulnerabilità di esecuzione remota di codice non autenticata nel percorso di caricamento del modello privacy-filter PII.
Gli endpoint dell'API REST POST /pii/extract e POST /pii/deidentify accettano un valore model_name dal corpo della richiesta. Nelle versioni vulnerabili, il dispatcher del privacy-filter utilizzava un ampio matching per sottostringa su questo valore controllato dall'attaccante. Un nome di modello come attacker/foo-privacy-filter-bar poteva quindi essere instradato verso il backend del privacy-filter.
Nelle distribuzioni non MLX/Torch, quel backend caricava gli artefatti dei modelli Hugging Face tramite Transformers con trust_remote_code=True. Se il repository di modelli controllato dall'attaccante conteneva codice Transformers personalizzato referenziato tramite auto_map in config.json o tokenizer_config.json, Transformers importava ed eseguiva quel codice Python durante il caricamento del modello o del tokenizer.
Il codice importato veniva eseguito con i privilegi del processo del servizio OpenMed.
Un attaccante remoto non autenticato in grado di raggiungere l'API REST di OpenMed può eseguire codice Python arbitrario sul server fornendo un identificatore di modello in stile Hugging Face dannoso in model_name.
A seconda della distribuzione del servizio, ciò può consentire:
Il problema è raggiungibile tramite entrambi gli endpoint PII perché entrambi accettano model_name e utilizzano lo stesso percorso di caricamento del modello/estrazione 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
}
Il flusso di controllo vulnerabile presenta due fallimenti dei confini di fiducia:
model_name fornito dall'utente nella selezione del backend del privacy-filter.trust_remote_code=True.Il dispatcher trattava qualsiasi identificatore di modello contenente privacy-filter come parte della famiglia privacy-filter. Ciò consentiva a identificatori controllati dall'attaccante, ad esempio attacker/foo-privacy-filter-bar, di raggiungere un percorso di codice destinato a modelli Privacy Filter di prima parte fidati.
Una volta instradato lì, Transformers poteva caricare codice personalizzato controllato dall'attaccante tramite auto_map. Questa importazione avviene durante il caricamento del modello/tokenizer, prima che qualsiasi inferenza utile debba riuscire. Un payload dimostrativo può quindi essere minimo come:
from pathlib import Path
Path("marker.txt").write_text(
"custom Transformers code executed via trust_remote_code\n",
encoding="utf-8",
)
poc_exploit.py crea una directory di modelli locale innocua in stile Hugging Face il cui nome contiene privacy-filter. I moduli Transformers personalizzati generati scrivono un file marker quando vengono importati. Lo script invia quindi una richiesta a un'istanza di test dell'API OpenMed con quella directory come model_name.
Il comportamento atteso sulle versioni vulnerabili di OpenMed è:
model_name controllato dall'attaccante.trust_remote_code=True.Eseguire solo contro un'istanza di test locale:
pip install -r requirements.txt
python poc_exploit.py --target http://127.0.0.1:8000 --endpoint /pii/extract
Se il servizio OpenMed viene eseguito in un ambiente che non può accedere alla directory locale generata, pubblica un modello di test equivalente in un repository Hugging Face controllato e passa esplicitamente quell'identificatore:
python poc_exploit.py \
--target http://127.0.0.1:8000 \
--model-name your-org/foo-privacy-filter-bar \
--marker marker.txt
Aggiornare a OpenMed 1.5.2 o successivo.
OpenMed 1.5.2 separa l'instradamento dalla fiducia:
privacy-filter non vengono più instradati attraverso il percorso fidato del privacy-filter.PrivacyFilterTorchPipeline imposta trust_remote_code su False per impostazione predefinita.OPENMED_TRUSTED_REMOTE_CODE_MODELS.Se non è possibile un aggiornamento immediato:
model_name controllati dall'utente a Transformers con trust_remote_code=True.| Data | Evento |
|---|---|
| 18 maggio 2026 | Vulnerabilità inviata a VulnCheck |
| 20 maggio 2026 | VulnCheck ha avviato l'attività di divulgazione coordinata |
| 22 maggio 2026 | CVE-2026-47117 assegnato in via provvisoria |
| 1 giugno 2026 | Correttivo OpenMed 1.5.2 revisionato e confermato |
| 2 giugno 2026 | CVE-2026-47117 pubblicato |
Scoperta e segnalata da Sai Teja Erukude, coordinata tramite VulnCheck.