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 | Critical: 10.0 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| Product | Loom for AWS |
| Affected | < 1.6.1. Lab pin v1.6.0 (8c658d61). Fixed in v1.6.1 (ccad5665). |
| Auth | unauthenticated |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 only |
हमलावर शून्य क्रेडेंशियल्स के साथ एजेंट कंट्रोल प्लेन का मालिक बन जाता है।
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) के बगल में पिन किया और बैकएंड को SQLite पर LOOM_COGNITO_USER_POOL_ID अनसेट के साथ चलाया।
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 स्कीमा पहले 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 उन टैग्स को शैलो-क्लोन करता है, दोनों बैकएंड बनाता है, फिर स्टैक को ध्वस्त कर देता है। SQLite। कोई Cognito env नहीं। पैच किए गए सर्विस पर कोई LOOM_ALLOW_UNAUTHENTICATED_LOCAL_DEV नहीं।
1.6.1 या बाद के संस्करण में अपग्रेड करें। AWS सहोदर SSRF/टोकन मुद्दों के लिए 1.7.0 की सिफारिश करता है। 1.6.1 बायपास ऑप्ट-इन और केवल लूपबैक है। तब तक, बैकएंड लूपबैक से आगे पहुंचने योग्य होने से पहले Cognito या बाहरी IdP पूरा करें, और किसी भी डिप्लॉय किए गए सिस्टम पर LOOM_ALLOW_UNAUTHENTICATED_LOCAL_DEV अनसेट रखें।
backend/app/dependencies/auth.py (get_current_user)