
CVE-2026-44338 प्रमाणीकरण बाईपास को प्रदर्शित करने वाला Docker-आधारित लैब, जो PraisonAI के पुराने Flask API में है। इसमें स्थानीय सुरक्षा अनुसंधान के लिए कमजोर और पैच की गई सेवाओं के साथ PoC स्क्रिप्ट शामिल है।
PraisonAI के लीगेसी Flask API सर्वर में प्रमाणीकरण बाइपास (CVE-2026-44338) के लिए स्थानीय Docker लैब।
यह लैब लीगेसी API रूट्स पर बिना प्रमाणीकरण के पहुंच की स्थिति को प्रदर्शित करता है। यह जानबूझकर पूर्ण PraisonAI डिप्लॉयमेंट के बजाय एक सुरक्षित रूट-स्तरीय पुनरुत्पादन का उपयोग करता है, ताकि प्रूफ प्रमाणीकरण दोष पर केंद्रित रहे और वास्तविक एजेंट वर्कफ़्लो या बाहरी LLM कॉल को ट्रिगर न करे।
CVE-2026-44338 PraisonAI संस्करण >= 2.5.6 और <= 4.6.33 को प्रभावित करता है।
कमजोर लीगेसी API सर्वर में, प्रमाणीकरण डिफ़ॉल्ट रूप से अक्षम था। परिणामस्वरूप, एक बिना प्रमाणीकरण वाला कॉलर जो API सर्वर तक पहुंच सकता था, बिना बियरर टोकन के /agents तक पहुंच सकता था और /chat वर्कफ़्लो रूट को ट्रिगर कर सकता था।
यह समस्या 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 में कमजोर व्यवहारv4.6.33 में, प्रमाणीकरण डिफ़ॉल्ट रूप से अक्षम था:
AUTH_ENABLED = False
AUTH_TOKEN = None
प्रमाणीकरण जांच तब खुली विफलता देती थी:
def check_auth():
if not AUTH_ENABLED:
return True
इसका मतलब है कि जब भी प्रमाणीकरण अक्षम था, अनुरोध स्वीकार किया जाता था, भले ही कॉलर ने Authorization हेडर न भेजा हो।
कमजोर प्रवाह था:
AUTH_ENABLED = False
↓
check_auth() returns True
↓
GET /agents की अनुमति है
POST /chat की अनुमति है
↓
बिना प्रमाणीकरण वाला कॉलर एजेंट मेटाडेटा तक पहुंच सकता है और वर्कफ़्लो ट्रिगर रूट तक पहुंच सकता है
संवेदनशील हिस्सा यह है कि /chat केवल एक स्थिति एंडपॉइंट नहीं था। यह एक उपयोगकर्ता संदेश स्वीकार करता था और फिर agents.yaml का उपयोग करके PraisonAI वर्कफ़्लो रनर को कॉल करता था।
v4.6.34 में फिक्स्ड व्यवहार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 लौटाते हैं
लैब में दो स्थानीय सेवाएं हैं:
| सेवा | URL | व्यवहार |
|---|---|---|
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