
مختبر يعتمد على Docker يوضح ثغرة تجاوز المصادقة CVE-2026-44338 في واجهة Flask API القديمة لـ PraisonAI. يشمل الخدمات الضعيفة والمصححة مع نص PoC للبحث الأمني المحلي.
مختبر Docker محلي لـ CVE-2026-44338، وهو تجاوز للمصادقة في خادم Flask API القديم في PraisonAI.
يوضح هذا المختبر حالة الوصول غير المصادق عليه على مسارات API القديمة. يستخدم عن قصد إعادة إنتاج آمنة على مستوى المسار بدلاً من نشر PraisonAI كامل، بحيث يظل الإثبات مركزًا على ثغرة المصادقة ولا يؤدي إلى تشغيل سير عمل الوكلاء الحقيقي أو استدعاءات LLM الخارجية.
يؤثر CVE-2026-44338 على إصدارات PraisonAI >= 2.5.6 و <= 4.6.33.
في خادم API القديم المعرض للخطر، تم تعطيل المصادقة بشكل افتراضي. نتيجة لذلك، يمكن للمتصل غير المصادق الذي يمكنه الوصول إلى خادم API الوصول إلى /agents وتشغيل مسار سير العمل /chat بدون رمز حامل (bearer token).
تم إصلاح المشكلة في PraisonAI 4.6.34 عن طريق تغيير السلوك الافتراضي ليتطلب المصادقة ما لم يتم تعطيلها صراحةً.
في الإصدار الضعيف، استخدم خادم API القديم إعدادات افتراضية غير آمنة للمصادقة:
AUTH_ENABLED = False
AUTH_TOKEN = None
def check_auth():
if not AUTH_ENABLED:
return True
نظرًا لأن check_auth() أعاد True عند تعطيل المصادقة، فإن المسارات المحمية تُترك مفتوحة.
تضمنت المسارات المتأثرة:
GET /agentsPOST /chatيغير الإصدار المُصحح الوضع الافتراضي بحيث يتم تمكين المصادقة ما لم يتم تعطيلها صراحةً من خلال التكوين.
لم تكن المشكلة الأساسية بدائية استغلال معقدة. لقد جاءت من الإعدادات الافتراضية غير الآمنة في خادم Flask API القديم.
في v4.6.33، تم تعطيل المصادقة افتراضيًا:
AUTH_ENABLED = False
AUTH_TOKEN = None
ثم فشل فحص المصادقة بطريقة مفتوحة:
def check_auth():
if not AUTH_ENABLED:
return True
هذا يعني أنه تم قبول الطلب كلما تم تعطيل المصادقة، حتى لو لم يرسل المتصل رأس Authorization.
التدفق الضعيف كان:
AUTH_ENABLED = False
↓
check_auth() تُرجع True
↓
يتم السماح بـ GET /agents
يتم السماح بـ POST /chat
↓
يمكن للمتصل غير المصادق الوصول إلى بيانات تعريف الوكيل والوصول إلى مسار تشغيل سير العمل
الجزء الحساس هو أن /chat لم يكن مجرد نقطة نهاية للحالة. كان يقبل رسالة مستخدم ثم يستدعي مشغل سير العمل PraisonAI باستخدام agents.yaml.
في v4.6.34، تم تغيير السلوك الافتراضي ليتطلب المصادقة ما لم يعطلها المشغل صراحةً:
AUTH_ENABLED = os.environ.get("PRAISONAI_API_AUTH", "enabled").strip().lower() != "disabled"
AUTH_TOKEN = os.environ.get("PRAISONAI_API_TOKEN") or None
يحسن الإصدار المُصحح أيضًا سلوك التعامل مع الرمز:
secrets.compare_digest()127.0.0.1 افتراضيًا بدلاً من كشف نفسه على جميع الواجهاتالتدفق المُصحح هو:
AUTH_ENABLED = True افتراضيًا
↓
يجب أن يتضمن الطلب رمز Bearer صالح
↓
الرمز المفقود أو غير الصالح يُرجع 401
↓
/agents و /chat لم يعد بإمكان الوصول المجهول
يعكس هذا المختبر ذلك الاختلاف على مستوى المصدر:
vuln -> المصادقة معطلة افتراضيًا، الطلبات غير المصادقة تُرجع 200
patched -> المصادقة مطلوبة افتراضيًا، الطلبات غير المصادقة تُرجع 401
يحتوي المختبر على خدمتين محليتين:
| الخدمة | الرابط | السلوك |
|---|---|---|
vuln | http://127.0.0.1:8081 | يعيد إنتاج سلوك المصادقة المفتوح الضعيف |
patched | http://127.0.0.1:8082 | يتطلب مصادقة رمز الحامل |
كلا الخدمتين مرتبطتان بـ 127.0.0.1 فقط.
يستخدم مسار /chat مشغلًا وهميًا بدلاً من سير عمل PraisonAI حقيقي. يوفر هذا دليلاً قابلاً للملاحظة على أن الطلب غير المصادق يصل إلى مسار تشغيل سير العمل دون التسبب في آثار جانبية خارجية.
.
├── docker-compose.yml
├── vuln
│ ├── Dockerfile
│ └── start_server.py
├── patched
│ ├── Dockerfile
│ └── start_server.py
├── poc
│ └── poc.py
└── .gitignore
└── README.md
docker compose up --build -d
python3 poc/poc.py
الخدمة الضعيفة تسمح بالوصول غير المصادق:
=== vuln ===
[unauthenticated] GET /agents
status: 200
[unauthenticated] POST /chat
status: 200
verdict: LIKELY_VULNERABLE
الخدمة المُصححة تمنع الوصول غير المصادق:
=== patched ===
[unauthenticated] GET /agents
status: 401
[unauthenticated] POST /chat
status: 401
verdict: NOT_VULNERABLE_OR_PROTECTED
الملخص النهائي المتوقع:
vuln: LIKELY_VULNERABLE
patched: NOT_VULNERABLE_OR_PROTECTED
تحقق من المسار الضعيف:
curl -i http://127.0.0.1:8081/agents
الاستجابة الضعيفة المتوقعة:
HTTP/1.1 200 OK
تحقق من المسار المُصحح:
curl -i http://127.0.0.1:8082/agents
الاستجابة المُصححة المتوقعة:
HTTP/1.1 401 UNAUTHORIZED
يجب أن تظهر سجلات الخادم الفرق بوضوح:
vuln: "GET /agents HTTP/1.1" 200
patched: "GET /agents HTTP/1.1" 401
docker compose down -v
هذا المختبر مخصص للبحث الأمني المحلي فقط.
لا يقوم PoC بما يلي:
تنبيه GitHub: GHSA-6rmh-7xcm-cpxj https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-6rmh-7xcm-cpxj
NVD: CVE-2026-44338 https://nvd.nist.gov/vuln/detail/CVE-2026-44338
OSV: GHSA-6rmh-7xcm-cpxj https://osv.dev/vulnerability/GHSA-6rmh-7xcm-cpxj
المصدر الضعيف: PraisonAI v4.6.33 src/praisonai/api_server.py
https://raw.githubusercontent.com/MervinPraison/PraisonAI/v4.6.33/src/praisonai/api_server.py
المصدر المُصحح: PraisonAI v4.6.34 src/praisonai/api_server.py
https://raw.githubusercontent.com/MervinPraison/PraisonAI/v4.6.34/src/praisonai/api_server.py