CVE-2026-103956 - Loom for AWS - गंभीर - प्रमाणीकरण बायपास - जब कोई IdP कॉन्फ़िगर नहीं किया गया हो तो अनधिकृत सुपर-एडमिन
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cve-2026-103956-loom-unauth
Loom for AWS < 1.6.1 - AWS Labs
जब Cognito सेट नहीं होता और कोई बाहरी IdP सक्रिय नहीं होता, तो get_current_user हर अनुरोध को t-admin / g-admins-super दे देता है। इसमें वे अनुरोध भी शामिल हैं जिनमें कोई Authorization हेडर नहीं होता। IdP सेटअप से पहले एक नई डिप्लॉयमेंट एक खुला एडमिन पैनल है।
| ID | CVE-2026-103956 |
| CWE | CWE-306 / CWE-1188 |
| CVSS | गंभीर: 10.0 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| उत्पाद | Loom for AWS |
| प्रभावित | < 1.6.1। लैब पिन v1.6.0 (8c658d61)। v1.6.1 (ccad5665) में ठीक किया गया। |
| प्रमाणीकरण | बिना प्रमाणीकरण |
| वर्ग | प्रमाणीकरण बायपास / बिना प्रमाणीकरण सुपर-एडमिन (ATO) |
| पहुँच | रिमोट (बिना प्रमाणीकरण) |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
हमलावर शून्य क्रेडेंशियल के साथ एजेंट कंट्रोल प्लेन का मालिक बन जाता है।
GET /api/auth/me username=local-dev, sub=local, समूह t-admin और g-admins-super लौटाता है। GROUP_SCOPES में हर स्कोप उस पहचान के साथ आता है।POST /api/mcp/servers 201 है। MCP, A2A, एजेंट, मेमोरी, सुरक्षा, सेटिंग्स, क्रेडेंशियल और एडमिन ऑडिट उसी डिपेंडेंसी के पीछे हैं।GET /api/mcp/servers/{id}/export admin:write है। इस पिन पर यह SQLite से oauth2_client_secret लौटाता है। CVE टेक्स्ट प्रबंधित एजेंट भूमिकाओं पर IAM रोल-पॉलिसी रीराइट का भी उल्लेख करता है; उस पथ के लिए AWS चाहिए और यह इस लूपबैक लैब के बाहर है।v1.6.1 के लिए LOOM_ALLOW_UNAUTHENTICATED_LOCAL_DEV और एक लूपबैक क्लाइंट आवश्यक है। वही अनुरोध 401 (No identity provider configured) है।
AWS ने CVE-2026-103956 को GHSA-vgmj-998f-r8mp और बुलेटिन 2026-124-AWS के साथ पोस्ट किया। मैंने awslabs/loom v1.6.0 (8c658d61) को v1.6.1 (ccad5665) के साथ पिन किया और LOOM_COGNITO_USER_POOL_ID सेट न करके SQLite के साथ बैकएंड चलाया।
backend/app/dependencies/auth.py में get_current_user Cognito env और एक सक्रिय IdP पंक्ति की जाँच करता है। दोनों खाली: यह UserInfo(sub="local", username="local-dev", groups=["t-admin", "g-admins-super"], scopes=ALL_SCOPES) लौटाता है। टोकन कभी पढ़ा ही नहीं जाता।
मैंने लूपबैक 127.0.0.1:18180 (v1.6.0) और 18181 (v1.6.1) पर स्टॉक FastAPI खड़ा किया। कोई फ्रंटएंड नहीं। कोई AWS नहीं। 1.6.0 पर बिना प्रमाणीकरण GET /api/auth/me उन समूहों के साथ 200 था। oauth2_client_secret=CVE-2026-103956-WITNESS के साथ बिना प्रमाणीकरण POST /api/mcp/servers 201 था। GET /api/mcp/servers/1/export ने सीक्रेट वापस दे दिया। 1.6.1 पर वही /api/auth/me 401 था।
SUCCESS CVE-2026-103956 me-http=200 me-user=local-dev me-sub=local me-groups=t-admin,g-admins-super mcp-create=201 export-has-secret=yes list-has-witness=yes patched-me-http=401 CVE-2026-103956-WITNESS
गलत मोड़ पहले ही दर्ज हो चुके हैं: public.ecr.aws/docker/library/python:3.13-slim को Docker Hub python:3.13-slim के लिए छोड़ दिया गया था; v1.6.0 पर पहला /health curl 52 था जबकि uvicorn बाइंड हो रहा था, फिर 200; MCP create schema पहले POST पर मेल खा गया, कोई 422 पुनःप्रयास नहीं। एक रिवर्स शेल। नाटक। ओरेकल /api/auth/me और निर्यात किया गया सीक्रेट है।
cd lab
./run.sh
केवल http://127.0.0.1:18180 (v1.6.0) और http://127.0.0.1:18181 (v1.6.1) को लक्षित करें। run.sh उन टैग्स को shallow-clone करता है, दोनों बैकएंड बनाता है, फिर स्टैक को हटा देता है। SQLite। कोई Cognito env नहीं। पैच किए गए सेवा पर कोई LOOM_ALLOW_UNAUTHENTICATED_LOCAL_DEV नहीं।
1.6.1 या बाद के संस्करण में अपग्रेड करें। संबंधित SSRF/टोकन समस्याओं के लिए AWS 1.7.0 की सिफारिश करता है। 1.6.1 बायपास opt-in और केवल loopback तक सीमित है। तब तक, बैकएंड के loopback से आगे पहुंचने योग्य होने से पहले Cognito या किसी बाहरी IdP को पूरा करें, और किसी भी डिप्लॉय की गई चीज़ पर LOOM_ALLOW_UNAUTHENTICATED_LOCAL_DEV को unset रखें।
backend/app/dependencies/auth.py (get_current_user)