flawopen.com/AI Security/berriai-litellm-ghsa-7hp6-salt-key-session-token-privilege-escalation
LiteLLM: Rechteausweitung durch Salt-Key-Wiederverwendung (GHSA-7hp6)
LiteLLM verwendete denselben Verschlüsselungspfad für gespeicherte Geheimnisse und UI-/CLI-Sitzungstoken. Ein angemeldeter internal_user konnte kontrollierte Identitätsdaten durch diesen Pfad einschleusen und proxy_admin erreichen; diese Rolle konnte MCP-stdio-Befehlsausführung aufrufen. Der Patch bindet Sitzungstoken an ein eigenes Präfix und authentifizierten AES-GCM-Kontext. Ein CVE oder bestätigte Ausnutzung in freier Wildbahn ist nicht bekannt.[1], [2]
Ein Gebäude nutzt dasselbe Siegel für einen Lagerumschlag und einen Administrationsausweis. Ein Besucher kann den Inhalt des Umschlags beeinflussen; später hält ein Wachmann ihn für einen echten Ausweis. LiteLLM versieht Sitzungsausweise nun mit einem eigenen Kennzeichen und bindet es kryptografisch an das Siegel.[1], [2]
Kernkonzepte & Begriffe
Salt Key- In LiteLLM konfiguriertes Schlüsselmaterial für Verschlüsselungshelfer. Die Schwachstelle verwendete denselben Pfad, ohne den Chiffretext an seinen Zweck zu binden.[1], [2]
Authentifizierte Zusatzdaten (AAD)- Daten wie ein Tokenpräfix, die AES-GCM zusammen mit dem Chiffretext authentifiziert. Änderung oder Weglassen führt zum Fehlschlag der Authentifizierung.[2]
internal_user und proxy_admin- LiteLLM-Rollen. Laut Advisory konnte ein angemeldeter internal_user zu proxy_admin, der Administrationsrolle, aufsteigen.[1]
MCP stdio- Ein Model-Context-Protocol-Transport, der einen lokalen Prozess startet und über Standardein- und -ausgabe kommuniziert. Laut Advisory konnte proxy_admin darüber Befehlsausführung erreichen.[1]
Framework-Zuordnungen
- Konzeptionelle Zuordnung von FlawOpen zu MITRE CWE; weder ein Anbieter noch ein CVE-Datensatz hat diese Schwachstellen-ID dieser Forschungsdemonstration zugewiesen. CWE-345
Schritt-für-Schritt Angriffsablauf
Ein Konto mit wenigen Rechten erreicht die Schlüsselverwaltung
Ausgangspunkt laut Advisory ist ein angemeldeter internal_user. Anonymer Zugriff ist nicht nötig, aber diese Rolle muss bereits bestehen.[1]
Administrativer Zugriff erreicht MCP stdio
Mit proxy_admin konnte der Akteur laut Advisory Befehle über den MCP-stdio-Endpunkt ausführen. Das ist Prozessfähigkeit auf dem Host, keine vom Modell ausgeführte Anweisung.[1]
Ursachenanalyse
Das BerriAI-Advisory GHSA-7hp6-4w63-5g45 beschreibt eine Verwechslung von Authentifizierungszwecken. LiteLLM nutzte denselben Werte-Verschlüsselungshelfer für gespeicherte Geheimnisse und UI-/CLI-Sitzungstoken; auch die Sitzungsprüfung entschlüsselte über denselben Schlüsselpfad. Ein angemeldeter internal_user konnte einen API-Schlüssel mit kontrollierten serialisierten Identitätsdaten in der Metadaten anfordern. Die Verwaltungsroute verschlüsselte und lieferte diesen Wert zurück. Als Bearer-Token vorgelegt, konnte der Chiffretext vom Sitzungspfad entschlüsselt und als gefälschte proxy_admin-Identität interpretiert werden; damit war Befehlsausführung über MCP stdio erreichbar. Der Upstream-Fix f7cd90f ändert Ausgabe und Prüfung: litellm_login_-Präfix, AES-GCM-AAD für dieses Präfix und eigener Decoder. Der Salt Key bleibt Schlüsselmaterial; getrennt wird der kryptografisch authentifizierte Tokenzweck samt Decoder. Chiffretext für gespeicherte Werte gilt damit nicht als Sitzungstoken. Das Advisory nennt CVSS 3.1 9.9 Critical; Versionen nach 1.91.0 sind standardmäßig betroffen, 1.87.0–1.90.x nur bei EXPERIMENTAL_UI_LOGIN=true. Genannte Fixes sind 1.100.4, 1.101.3, 1.102.2, 1.103.1 und 1.104.0rc2 in den jeweiligen Branches. EXPERIMENTAL_UI_LOGIN=false ist eine temporäre Abhilfe, deaktiviert aber auch CLI SSO und Claude-Code-Gateway-Login. Es ist kein CVE bekannt und keine Ausnutzung in freier Wildbahn bestätigt. Der Codevergleich zeigt den Upstream-Wechsel der Authentifizierungsdomäne, keinen Exploit und keine vollständige Authentifizierung.[1], [2], [3], [4]
Quellcode: Verwundbar vs. Sicher
Der Upstream-Patch ersetzt die allgemeinen Wert-Helfer beim Erstellen und Prüfen von Sitzungstoken. encrypt_bearer_token authentifiziert das Präfix als AES-GCM-AAD; decrypt_bearer_token verlangt dasselbe Präfix und dieselben Zusatzdaten. Chiffretext für gespeicherte Werte kann so nicht als Login-Token dienen. Dies ist ein gekürzter Ausschnitt des Commits, keine eigenständige Authentifizierung. Ein gemeinsam verwendeter Salt-Schlüssel belegt allein keinen eigenen Schlüssel je Verwendungszweck; die hier nachgewiesene Trennung entsteht durch den authentifizierten Tokentyp und den passenden Decoder.[2], [3]
Quelltextauszug: litellm/proxy/auth/auth_checks.py und litellm/proxy/common_utils/encrypt_decrypt_utils.py — gekürzte Ausschnitte aus dem Upstream-Commit f7cd90f
# Vor dem Patch wurde Chiffretext gespeicherter Werte auch als Sitzungstoken ausgegeben.
return encrypt_value_helper(valid_token.model_dump_json(exclude_none=True))
# Die Sitzungsauthentifizierung entschlüsselte ihn mit dem allgemeinen Werte-Helper.
decrypted_token = decrypt_value_helper(hashed_token, key="ui_hash_key")
# Nach dem Patch haben Sitzungstoken einen eigenen Typ und eigene AAD.
LITELLM_SESSION_TOKEN_PREFIX = "litellm_login_"
return encrypt_bearer_token(
valid_token.model_dump_json(exclude_none=True),
prefix=LITELLM_SESSION_TOKEN_PREFIX,
)
# Die Authentifizierung verwendet den passenden zweckgebundenen Decoder.
decrypted_token = decrypt_bearer_token(
hashed_token, prefix=LITELLM_SESSION_TOKEN_PREFIX
)
Checkliste für Engineering & Systemsicherheit
- ✓Jede LiteLLM-Instanz auf eine behobene Version des jeweiligen Branches aktualisieren und das tatsächlich aufgelöste Paket oder Image prüfen; keine beweglichen Tags voraussetzen.[1], [3], [4]
- ✓Bei Versionen 1.87.0–1.90.x prüfen, ob EXPERIMENTAL_UI_LOGIN aktiviert war; laut Advisory betrifft es dort nur diesen Fall.[1]
- ✓Falls ein sofortiges Upgrade unmöglich ist,
EXPERIMENTAL_UI_LOGIN=falsevorübergehend setzen und den dokumentierten Ausfall von CLI SSO und Claude-Code-Gateway-Login einplanen.[1] - ✓Regressionstest ergänzen: gespeicherter Chiffretext wird vom Sitzungsdecoder abgelehnt, ein gültiges, nicht abgelaufenes Sitzungstoken bleibt akzeptiert.[2]
- ✓Den Zweck des Chiffretexts binden: Präfix beim Ausstellen und Prüfen als AES-GCM-AAD authentifizieren; generische Entschlüsselungsausgabe nicht als Identitätstoken akzeptieren.[2]
- ✓Schlüsselverwaltung und MCP-stdio-Konfiguration auf notwendige Rollen beschränken und den Proxy mit geringsten Betriebssystemrechten ausführen.[1]
- ✓FlawOpen-Analyse: Instrumentieren Sie das Authentifizierungs-Audit der Bereitstellung so, dass Principal, aufgelöste Rolle, Tokentyp, Zeitstempel und Request-ID erfasst werden, jedoch keine Bearer-Tokens oder Chiffretexte; testen Sie das Ereignisschema. Ergänzen Sie einen Alarmtest für LiteLLM-Proxyprozesse, die MCP-stdio-Unterprozesse starten, und korrelieren Sie bei einer Untersuchung Authentifizierungs- und Prozessereignisse. Dies sind Erkennungsempfehlungen für die Bereitstellung, keine vom Anbieter bestätigten Logsignale.
- ✓Als GHSA-7hp6-4w63-5g45 nachverfolgen: Das Advisory nennt keine CVE, und die geprüften Quellen bestätigen keine Ausnutzung in freier Wildbahn.[1]
Quellen
- BerriAI LiteLLM security advisory GHSA-7hp6-4w63-5g45
- LiteLLM upstream session-token fix f7cd90f
- LiteLLM v1.100.4 release notes: UI and CLI session-token format
- LiteLLM v1.104.0 release notes: session-token format and upgrade behavior
- MITRE CWE-345: Insufficient Verification of Data Authenticity
- MITRE CWE-269: Improper Privilege Management
- MITRE CWE-441: Unintended Proxy or Intermediary