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). |
| المصادقة | بدون مصادقة |
| الترخيص | 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. في هذا الإصدار يُرجع oauth2_client_secret من SQLite. يذكر نص CVE أيضاً إعادة كتابة سياسة دور IAM على أدوار الوكيل المُدارة؛ هذا المسار يتطلب AWS وهو خارج نطاق مختبر loopback هذا.يتطلب v1.6.1 وجود LOOM_ALLOW_UNAUTHENTICATED_LOCAL_DEV بالإضافة إلى عميل loopback. نفس الطلب يُرجع 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 ومن صف IdP نشط. كلاهما فارغ: فيُرجع UserInfo(sub="local", username="local-dev", groups=["t-admin", "g-admins-super"], scopes=ALL_SCOPES). لا يُقرأ الرمز المميز أبداً.
أقمت FastAPI جاهزاً على loopback 127.0.0.1:18180 (v1.6.0) و 18181 (v1.6.1). بدون واجهة أمامية. بدون AWS. كان GET /api/auth/me بدون مصادقة على 1.6.0 يُرجع 200 مع تلك المجموعات. وكان POST /api/mcp/servers بدون مصادقة مع oauth2_client_secret=CVE-2026-103956-WITNESS يُرجع 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؛ أول /health على v1.6.0 كان curl 52 بينما uvicorn مرتبط، ثم 200؛ مخطط إنشاء MCP تطابق من أول 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. بدون LOOM_ALLOW_UNAUTHENTICATED_LOCAL_DEV على الخدمة المُرقَّعة.
قم بالترقية إلى 1.6.1 أو أحدث. توصي AWS بـ 1.7.0 لمشاكل SSRF/الرمز الشقيقة. تجاوز 1.6.1 اختياري ومقتصر على loopback. حتى ذلك الحين، أكمل إعداد Cognito أو IdP خارجي قبل أن تصبح الواجهة الخلفية قابلة للوصول خارج loopback، وأبقِ LOOM_ALLOW_UNAUTHENTICATED_LOCAL_DEV غير معيّن على أي شيء منشور.
backend/app/dependencies/auth.py (get_current_user)