flawopen.com/AI Security/berriai-litellm-ghsa-7hp6-salt-key-session-token-privilege-escalation
LiteLLM: salt key के पुनः उपयोग से विशेषाधिकार वृद्धि (GHSA-7hp6)
LiteLLM, संग्रहीत secrets और UI/CLI session tokens के लिए एक ही encryption path का उपयोग करता था। प्रमाणित internal_user अपने नियंत्रण वाले identity data को इस path से गुजारकर proxy_admin तक पहुंच सकता था; इस role से MCP stdio के जरिए command execution उपलब्ध था। सुधार अलग prefix और authenticated AES-GCM context से token के उद्देश्य को बांधता है। कोई CVE या वास्तविक हमलों में पुष्टि की गई exploitation रिपोर्ट नहीं है।[1], [2]
एक इमारत storage envelope को बंद करने और administrator badge जारी करने के लिए एक ही मुहर इस्तेमाल करती है। आगंतुक envelope की सामग्री प्रभावित कर सकता है, और guard बाद में उसे असली badge समझ लेता है। LiteLLM का सुधार session badge को अलग पहचान देता है और उस पहचान को cryptographically मुहर से जोड़ता है।[1], [2]
इस पेज के मुख्य शब्द
Salt key- LiteLLM में सेट किया गया key material, जिसका encryption helpers उपयोग करते हैं। इस दोष में अलग उद्देश्यों के लिए यही path इस्तेमाल हुआ, पर ciphertext को उसके उद्देश्य से नहीं बांधा गया।[1], [2]
Authenticated Additional Data (AAD)- Token prefix जैसे data, जिसे AES-GCM ciphertext के साथ authenticate करता है। इसे बदलने या छोड़ने पर authentication विफल होता है।[2]
internal_user और proxy_admin- LiteLLM roles। Advisory के अनुसार प्रमाणित internal_user, administrative proxy_admin role तक बढ़ सकता था।[1]
MCP stdio- Model Context Protocol transport जो local process शुरू करता है और standard input/output से संदेश भेजता है। Advisory के अनुसार proxy_admin इस endpoint से commands चला सकता था।[1]
फ्रेमवर्क मैपिंग
- MITRE CWE के लिए FlawOpen की वैचारिक मैपिंग; किसी विक्रेता या CVE रिकॉर्ड ने इस शोध प्रदर्शन को यह कमजोरी ID नहीं दी है। CWE-345
हमले का चरण-दर-चरण प्रवाह
कम विशेषाधिकार वाला खाता key management तक पहुंचता है
Advisory की शुरुआती शर्त प्रमाणित internal_user है। Anonymous access जरूरी नहीं, लेकिन actor के पास यह role पहले से होना चाहिए।[1]
Administrative access MCP stdio तक पहुंचता है
Advisory के अनुसार proxy_admin MCP stdio endpoint से commands चला सकता था। यह host पर process capability है, model द्वारा स्वयं command चलाना नहीं।[1]
मूल कारण विश्लेषण (Root Cause)
BerriAI की GHSA-7hp6-4w63-5g45 advisory दो अलग उद्देश्यों के authentication को मिलाने की समस्या बताती है। LiteLLM stored secrets और UI/CLI session tokens दोनों के लिए generic value-encryption helper उपयोग करता था; session authentication भी उसी key path से values decrypt करती थी। प्रमाणित internal_user अपने नियंत्रण वाले serialized identity data को key metadata में रखकर API key मांग सकता था; management path उस value को encrypt करके लौटाता था। यदि ciphertext bearer token के रूप में दिया जाता, session path उसे decrypt कर forged proxy_admin identity के रूप में समझ सकता था। इससे MCP stdio command execution तक पहुंच संभव थी। Upstream fix f7cd90f token minting और verification बदलता है: litellm_login_ prefix, उससे जुड़ा AES-GCM AAD, और dedicated decoder। Salt key अभी भी key material है; सत्यापित सुरक्षा सीमा token का authenticated purpose और matching decoder है। इसलिए stored-value ciphertext session token के रूप में validate नहीं होता। Advisory CVSS 3.1 9.9 Critical बताती है; 1.91.0 के बाद के versions default रूप से प्रभावित हैं और 1.87.0–1.90.x केवल EXPERIMENTAL_UI_LOGIN=true होने पर। शाखाओं के लिए सूचीबद्ध fixed versions 1.100.4, 1.101.3, 1.102.2, 1.103.1 और 1.104.0rc2 हैं। अस्थायी उपाय EXPERIMENTAL_UI_LOGIN=false vulnerable login path बंद करता है, पर CLI SSO और Claude Code gateway login भी तोड़ता है। Advisory कोई CVE नहीं देती और वास्तविक exploitation की पुष्टि नहीं करती। Code pair upstream authentication boundary का बदलाव दिखाता है; यह exploit या पूर्ण authentication implementation नहीं है।[1], [2], [3], [4]
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
Upstream fix session token बनाते और authenticate करते समय generic value helpers को बदलता है। encrypt_bearer_token prefix को AES-GCM AAD के रूप में authenticate करता है; decrypt_bearer_token वही prefix और AAD मांगता है। इसलिए storage ciphertext को login token की तरह उपयोग नहीं किया जा सकता। यह cited commit का छोटा excerpt है, standalone authentication code नहीं। साझा salt key अपने-आप यह साबित नहीं करती कि हर उद्देश्य के लिए अलग key है; यहाँ प्रमाणित अलगाव authenticated token type और उससे मेल खाने वाले decoder से आता है।[2], [3]
सोर्स अंश: litellm/proxy/auth/auth_checks.py और litellm/proxy/common_utils/encrypt_decrypt_utils.py — upstream commit f7cd90f के संक्षिप्त अंश
# fix से पहले: stored value का ciphertext session token के रूप में भी जारी होता था।
return encrypt_value_helper(valid_token.model_dump_json(exclude_none=True))
# session authentication generic value helper से decrypt करता था।
decrypted_token = decrypt_value_helper(hashed_token, key="ui_hash_key")
# fix के बाद: session tokens का अपना type और AAD है।
LITELLM_SESSION_TOKEN_PREFIX = "litellm_login_"
return encrypt_bearer_token(
valid_token.model_dump_json(exclude_none=True),
prefix=LITELLM_SESSION_TOKEN_PREFIX,
)
# authentication उसी उद्देश्य के अनुरूप decoder इस्तेमाल करता है।
decrypted_token = decrypt_bearer_token(
hashed_token, prefix=LITELLM_SESSION_TOKEN_PREFIX
)
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓हर LiteLLM deployment को उसकी release branch के fixed version पर upgrade करें और floating tag के बजाय resolved package/image जांचें।[1], [3], [4]
- ✓1.87.0–1.90.x में जांचें कि EXPERIMENTAL_UI_LOGIN enabled था या नहीं; advisory के अनुसार केवल वही configuration प्रभावित है।[1]
- ✓तुरंत upgrade संभव न हो तो अस्थायी रूप से
EXPERIMENTAL_UI_LOGIN=falseकरें और CLI SSO तथा Claude Code gateway login पर असर की योजना बनाएं।[1] - ✓Regression test जोड़ें: session decoder stored-value ciphertext अस्वीकार करे, लेकिन valid और unexpired session token स्वीकार करे।[2]
- ✓Ciphertext के purpose को bind करें: mint और verify दोनों में prefix को AES-GCM AAD के रूप में authenticate करें; generic decrypt output को identity token न मानें।[2]
- ✓Key management और MCP stdio configuration को जरूरी roles तक सीमित करें; proxy को न्यूनतम OS privileges से चलाएं।[1]
- ✓FlawOpen विश्लेषण: डिप्लॉयमेंट के auth audit में principal, resolved role, token type, timestamp और request ID दर्ज करें, लेकिन bearer token या ciphertext नहीं; event schema का परीक्षण करें। LiteLLM proxy द्वारा MCP stdio child process शुरू करने पर alert test जोड़ें और जाँच के समय auth तथा process events को correlate करें। ये डिप्लॉयमेंट-पक्ष की detection सिफारिशें हैं, विक्रेता द्वारा पुष्ट log signals नहीं।
- ✓इसे GHSA-7hp6-4w63-5g45 के रूप में track करें: advisory में CVE नहीं है और स्रोत real-world exploitation की पुष्टि नहीं करते।[1]
स्रोत
- 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