
CVE-2026-30950 के लिए POC जो AutoGpt में सेशन हाइजैकिंग की अनुमति देता है
CVE-2026-30950 के लिए प्रूफ-ऑफ-कॉन्सेप्ट प्रदर्शन, AutoGPT प्लेटफ़ॉर्म में एक प्रमाणित IDOR (अनुपलब्ध प्राधिकरण) जो किसी भी लॉग-इन उपयोगकर्ता को किसी अन्य उपयोगकर्ता के चैट सत्र को केवल एक PATCH अनुरोध के माध्यम से पुनः असाइन करने — और इस प्रकार हाईजैक करने — की अनुमति देता है, बिना सत्र तक किसी पूर्व पहुँच के।
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:L)autogpt-platform-backend >= 0.6.36चैट-सत्र API एक रूट उजागर करता है जो उपयोगकर्ता को अपने खाते को सत्र रिकॉर्ड से जोड़ने की अनुमति देता है। रूट JWT प्रमाणीकरण द्वारा संरक्षित है लेकिन यह कोई जाँच नहीं करता कि कॉल करने वाला वर्तमान में संशोधित किए जा रहे सत्र का स्वामी है — केवल यह कि वे कोई प्रमाणित उपयोगकर्ता हैं। पीड़ित के session_id और हमलावर के JWT के साथ एक सीधा कॉल सत्र का स्वामित्व हमलावर को स्थानांतरित कर देता है।
भेद्यता की तीन परतें हैं और बाईपास प्रत्येक परत पर स्थापित है:
# autogpt_platform/backend/backend/api/features/chat/routes.py:753-776
@router.patch(
"/sessions/{session_id}/assign-user",
dependencies=[Security(auth.requires_user)],
status_code=200,
)
async def session_assign_user(
session_id: str,
user_id: Annotated[str, Security(auth.get_user_id)],
) -> dict:
await chat_service.assign_user_to_session(session_id, user_id)
return {"status": "ok"}
रूट किसी भी प्रमाणित कॉलर को स्वीकार करता है। यह सेवा को नियंत्रण सौंपता है:
# autogpt_platform/backend/backend/copilot/service.py:291-303
async def assign_user_to_session(session_id: str, user_id: str) -> ChatSessionInfo:
session = await get_chat_session(session_id, None) # ← user_id=None
if not session:
raise NotFoundError(f"Session {session_id} not found")
session.user_id = user_id
session = await upsert_chat_session(session)
return session
सेवा जानबूझकर कॉलर की उपयोगकर्ता ID को आगे भेजने के बजाय डेटा एक्सेसर को user_id=None पास करती है। डेटा एक्सेसर तब None को एडमिन-मोड के रूप में मानता है और स्वामित्व फ़िल्टर को छोड़ देता है:
# autogpt_platform/backend/backend/copilot/model.py:355-366
session = await _get_session_from_cache(session_id)
if session:
if user_id is not None and session.user_id != user_id:
logger.warning(f"Session {session_id} user id mismatch")
return None
return session
जब user_id is None होता है, तो संयोजन शॉर्ट-सर्किट हो जाता है और बेमेल जाँच कभी नहीं की जाती — किसी भी कॉलर को कोई भी सत्र लौटा दिया जाता है। सेवा तब session.user_id को कॉलर की ID से अधिलेखित कर देती है और परिणाम Redis में कैश कर देती है, जिससे मूल स्वामी द्वारा बाद की खोजें उसी बेमेल जाँच द्वारा अस्वीकृत कर दी जाती हैं जिसे अभी बाईपास किया गया था।
चैट (कॉपायलट) सुविधा सक्षम के साथ autogpt-platform-backend >= 0.6.36 और < 0.6.51 चलाने वाला कोई भी AutoGPT प्लेटफ़ॉर्म इंस्टेंस शोषणीय है। शोषण के लिए आवश्यक है:
प्रति-सत्र प्रभाव, प्रत्येक हाईजैक किए गए सत्र के साथ बढ़ता हुआ:
CVSS स्कोर (C:H / I:N / A:L) प्रति-सत्र दायरे को दर्शाता है: हाईजैक किए गए सत्रों पर उच्च गोपनीयता प्रभाव, पहले से मौजूद संदेश सामग्री को कोई अखंडता क्षति नहीं, और वैध स्वामी पर उपलब्धता प्रभाव (लॉकआउट)।
यह रिपॉज़िटरी एक POC प्रदान करता है, जो प्रत्यक्ष ट्रिगर को कवर करता है: ज्ञात session_id के विरुद्ध हमलावर के JWT से एकल PATCH अनुरोध। सेटअप स्क्रिप्ट नए-बूटस्ट्रैप किए गए AutoGPT स्टैक में दो उपयोगकर्ता (हमलावर + पीड़ित) बनाती है और तैयार घोषित करने से पहले पूर्व-शर्तों की पुष्टि करती है।
setup/ — Docker Compose वातावरण।
setup.sh AutoGPT को अंतिम कमजोर टैग (autogpt-platform-beta-v0.6.50) पर setup/AutoGPT-src/ में क्लोन करता है, अपस्ट्रीम के docker-compose.yml से न्यूनतम सेवाएँ (rest_server, copilot_executor, database_manager, migrate, साथ ही उनकी ट्रांज़िटिव निर्भरताएँ: Postgres, Redis, RabbitMQ, Supabase Kong + GoTrue) चालू करता है, दो परीक्षण उपयोगकर्ता बनाता है, और सत्यापित करता है कि कमजोर एंडपॉइंट रूटेड है।teardown.sh स्टैक को बंद करता है और वॉल्यूम मिटा देता है।pocs/session_hijack.py — स्व-निहित शोषण। पीड़ित और हमलावर के रूप में लॉग इन करता है, पीड़ित के रूप में एक सत्र बनाता है, पुष्टि करता है कि हमलावर के पास शोषण-पूर्व पढ़ने की पहुँच नहीं है, एकल PATCH अनुरोध भेजता है, फिर सिद्ध करता है कि स्वामित्व स्थानांतरित हो गया है और पीड़ित लॉक आउट हो गया है।
आवश्यक शर्तें: Docker, Git, Python 3.10+ और uv।
cd setup
./setup.sh
पहली बार चलाने पर AutoGPT कमजोर टैग पर क्लोन होता है और बैकएंड इमेज बनती है (~3-5 मिनट)। बाद की बार तेज़ होती हैं। जब सेटअप पूरा होता है तो यह कॉपी-पेस्ट के लिए तैयार POC इनवोकेशन प्रिंट करता है।
POC चलाएँ:
uv run --no-project --with requests \
pocs/session_hijack.py \
--api-url http://localhost:58006 \
--auth-url http://localhost:58000 \
--attacker-email [email protected] \
--attacker-password 'Attacker123!' \
--victim-email [email protected] \
--victim-password 'Victim123!'
उच्च पोर्ट क्यों? अपस्ट्रीम की compose कंटेनर नाम (
supabase-db,rabbitmq, ...) हार्डकोड करती है और डिफ़ॉल्ट पोर्ट (5432, 8000, ...) प्रकाशित करती है। उपयोगकर्ता द्वारा पहले से चलाए जा रहे किसी भी अन्य Supabase / Postgres / RabbitMQ स्टैक के साथ सह-अस्तित्व के लिए,setup/docker-compose.override.ymlकंटेनरों का नाम बदलता है, नेटवर्क को एक अद्वितीय प्रोजेक्ट नाम (autogpt-cve-2026-30950) के अंतर्गत पृथक करता है, और दो बाह्य रूप से उजागर पोर्ट को 58000 श्रेणी में बढ़ा देता है। अन्य आंतरिक सेवाएँ केवल प्रोजेक्ट के डॉकर नेटवर्क से बंधती हैं।
अपेक्षित आउटपुट इसके साथ समाप्त होता है:
[PASS] AUTHENTICATED SESSION HIJACK CONFIRMED
टियर डाउन:
cd setup
./teardown.sh
setup/AutoGPT-src/ में क्लोन किया गया AutoGPT सोर्स टियरडाउन के दौरान संरक्षित रहता है ताकि दोबारा चलाने पर पुनः डाउनलोड न हो। इसे पूरी तरह मिटाने के लिए, setup/AutoGPT-src/ हटाएँ।