
CVE-2026-22038 का विस्तृत विश्लेषण, जो AutoGPT Stagehand ब्लॉक्स में एक उच्च-गंभीरता वाली भेद्यता है जो API कुंजियों को सादे पाठ (plaintext) में लॉग करती है, जिसमें मूल कारण, प्रभाव और निवारण शामिल है।
CVE ID: CVE-2026-22038
उत्पाद: AutoGPT प्लेटफ़ॉर्म (Stagehand एकीकरण)
प्रभावित संस्करण: autogpt-platform-beta-v0.6.45 तक के सभी संस्करण
पैच किया गया: autogpt-platform-beta-v0.6.46
भेद्यता प्रकार: CWE-532 — लॉग फ़ाइल में संवेदनशील जानकारी का सम्मिलन
गंभीरता: उच्च
रिपोर्टकर्ता: पनुगंती शिव आदित्य (@sivaadityacoder)
रिपोर्ट दिनांक: 19 दिसंबर, 2025
GitHub सलाह: GHSA-rc89-6g7g-v5v7
AutoGPT एक ओपन-सोर्स प्लेटफ़ॉर्म है जो उपयोगकर्ताओं को स्वायत्त AI एजेंट बनाने और चलाने की सुविधा देता है। इसमें एक Stagehand एकीकरण शामिल है जो ब्राउज़र ऑटोमेशन और OpenAI, Anthropic, और Groq जैसे LLM प्रदाताओं से जुड़ता है।
Stagehand ब्लॉक्स की कोड समीक्षा के दौरान, मैंने देखा कि क्रेडेंशियल ऑब्जेक्ट सीधे logger.info() कॉल में पास किए जा रहे थे। मैंने प्रत्येक लॉग स्टेटमेंट का पता लगाया और पाया कि को इनलाइन कॉल किया जा रहा था — जो Pydantic द्वारा प्रदान की गई सुरक्षा को स्पष्ट रूप से बायपास करता है।
.get_secret_value()SecretStrभेद्य फ़ाइल:
autogpt_platform/backend/backend/blocks/stagehand/blocks.py
तीन ब्लॉक प्रभावित हैं, प्रत्येक में समान पैटर्न है:
StagehandObserveBlock (पंक्तियाँ 185–188)
logger.info(f"OBSERVE: Stagehand credentials: {stagehand_credentials}")
logger.info(
f"OBSERVE: Model credentials: {model_credentials} for provider "
f"{model_credentials.provider} secret: {model_credentials.api_key.get_secret_value()}"
)
StagehandActBlock (पंक्तियाँ 285–288)
logger.info(f"ACT: Stagehand credentials: {stagehand_credentials}")
logger.info(
f"ACT: Model credentials: {model_credentials} for provider "
f"{model_credentials.provider} secret: {model_credentials.api_key.get_secret_value()}"
)
StagehandExtractBlock (पंक्तियाँ 373–376)
logger.info(f"EXTRACT: Stagehand credentials: {stagehand_credentials}")
logger.info(
f"EXTRACT: Model credentials: {model_credentials} for provider "
f"{model_credentials.provider} secret: {model_credentials.api_key.get_secret_value()}"
)
शोषण की पुष्टि करने के लिए, मैंने वैध क्रेडेंशियल के साथ प्रत्येक Stagehand ब्लॉक चलाया और एप्लिकेशन लॉग खोजे:
grep "secret:" /var/log/autogpt/application.log
आउटपुट ने पुष्टि की कि वास्तविक API कुंजियाँ प्लेनटेक्स्ट में दिखाई दीं:
[INFO] OBSERVE: Model credentials: ... secret: sk-proj-abc123xyz789...
[INFO] ACT: Model credentials: ... secret: sk-ant-api03-def456uvw...
[INFO] EXTRACT: Model credentials: ... secret: sk-1234567890abcdef...
AutoGPT कोडबेस API कुंजियों के लिए Pydantic के SecretStr प्रकार का सही ढंग से उपयोग करता है। जब एक SecretStr ऑब्जेक्ट को f-string में शामिल किया जाता है या सामान्य रूप से प्रिंट किया जाता है, तो यह ********** के रूप में प्रदर्शित होता है — वह सुरक्षा जानबूझकर है।
मूल कारण यह है कि डेवलपर्स ने logger.info() स्टेटमेंट के अंदर सीधे .get_secret_value() कॉल किया। यह स्पष्ट रूप से सीक्रेट को अनरैप करता है और कच्चे स्ट्रिंग मान को लॉगर को पास करता है, जिससे SecretStr की अंतर्निहित मास्किंग पूरी तरह से बायपास हो जाती है।
लॉग स्तर INFO है, जिसका अर्थ है कि ये स्टेटमेंट सामान्य उत्पादन वातावरण में निष्पादित होते हैं — न कि केवल स्थानीय डिबगिंग सत्रों में। हर बार जब इनमें से कोई ब्लॉक क्रेडेंशियल के साथ चलता है, तो सीक्रेट लॉग फ़ाइल में लिखा जाता है।
हमले का परिदृश्य:
secret:, sk-proj-, या sk-ant- जैसे पैटर्न के लिए लॉग खोजते हैं।curl https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer sk-proj-abc123xyz789..." \
-H "Content-Type: application/json" \
-d '{"model": "gpt-4", "messages": [{"role": "user", "content": "test"}]}'
उजागर क्रेडेंशियल: Stagehand / Browserbase API कुंजियाँ, OpenAI API कुंजियाँ, Anthropic API कुंजियाँ, Groq API कुंजियाँ, और Stagehand ब्लॉक्स में कॉन्फ़िगर किए गए कोई भी LLM प्रदाता क्रेडेंशियल।
autogpt-platform-beta-v0.6.46 में पैच logger.info() स्टेटमेंट से .get_secret_value() कॉल हटा देता है।
अनुशंसित दृष्टिकोण — सीक्रेट को लॉग से पूरी तरह हटाएँ:
# पहले (भेद्य):
logger.info(
f"OBSERVE: Model credentials: {model_credentials} for provider "
f"{model_credentials.provider} secret: {model_credentials.api_key.get_secret_value()}"
)
# बाद में (ठीक किया गया):
logger.info(
f"OBSERVE: Model credentials for provider {model_credentials.provider} (API key redacted)"
)
वैकल्पिक — रिडैक्ट करें, लॉग संरचना बनाए रखें:
def redact_secret(value: str) -> str:
if len(value) <= 8:
return "***"
return f"{value[:4]}...{value[-4:]}"
logger.info(
f"OBSERVE: Model credentials for provider {model_credentials.provider} "
f"secret: {redact_secret(model_credentials.api_key.get_secret_value())}"
)
रिडैक्शन दृष्टिकोण केवल पहले और अंतिम 4 अक्षर उजागर करता है — पूर्ण सीक्रेट प्रकट किए बिना यह पहचानने के लिए पर्याप्त है कि कौन सी कुंजी उपयोग की गई थी।
लॉग स्टेटमेंट में कभी भी .get_secret_value() कॉल न करें। यदि आपका फ्रेमवर्क आपको सीक्रेट-मास्किंग प्रकार (SecretStr, SecretBytes, आदि) देता है, तो उसे अपना काम करने दें। लॉगर के अंदर अनरैप विधि कॉल करना पूरे उद्देश्य को विफल कर देता है।
INFO उत्पादन-स्तर लॉगिंग है। क्रेडेंशियल के डिबग-शैली डंप कभी भी INFO तक नहीं पहुंचने चाहिए। यदि आपको वास्तव में पुष्टि करने की आवश्यकता है कि कौन से क्रेडेंशियल सक्रिय हैं, तो केवल गैर-संवेदनशील मेटाडेटा (प्रदाता नाम, कुंजी उपसर्ग, अंतिम 4 अक्षर) लॉग करें।
लॉग फ़ाइलें एक हमले की सतह हैं। उन्हें किसी भी अन्य संवेदनशील डेटा स्टोर की तरह व्यवहार करें — पहुंच प्रतिबंधित करें, उन्हें घुमाएँ, और ऑडिट करें कि क्या जाता है। एग्रीगेशन टूल (Splunk, ELK, Datadog) में अक्सर व्यापक पढ़ने की पहुंच होती है, इसलिए किसी भी लॉग लाइन में एक सीक्रेट प्रभावी रूप से उन सिस्टमों में भी एक सीक्रेट है।
समाधान हमेशा बग से सरल होता है। दो लॉग लाइनें हटाना (या उन्हें रिडैक्टेड समकक्षों से बदलना) इस एक्सपोज़र को पूरी तरह से बंद कर देता है। उत्पादन में छोड़े गए "अस्थायी डिबग लॉगिंग" से सुरक्षा ऋण सामान्य है और कोड समीक्षा से रोका जा सकता है।
SecretStr सुरक्षाएँ ऑप्ट-इन हैं, स्वचालित नहीं। डेवलपर्स को समझना चाहिए कि सुरक्षा तभी बनी रहती है जब तक कोई स्पष्ट रूप से मान को अनरैप नहीं करता। कोड समीक्षा को प्रमाणीकरण पथ के बाहर .get_secret_value() के किसी भी उपयोग को चिह्नित करना चाहिए।
| दिनांक | घटना |
|---|---|
| 19 दिसंबर, 2025 | Huntr और GitHub सुरक्षा सलाह के माध्यम से AutoGPT अनुरक्षकों को रिपोर्ट किया गया |
| 2025–2026 | अनुरक्षक निकोलस टिंडल ने रिपोर्ट स्वीकार की |
| अप्रैल 2026 से पहले | autogpt-platform-beta-v0.6.46 में पैच किया गया |
| 25 अप्रैल, 2026 | CVE-2026-22038 निर्धारित किया गया |