
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) 옆에 고정하고 LOOM_COGNITO_USER_POOL_ID를 설정하지 않은 상태로 SQLite에서 백엔드를 실행했습니다.
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)를 반환합니다. 토큰은 절대 읽히지 않습니다.
저는 루프백 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는 uvicorn이 바인딩된 상태에서 curl 52였고, 그다음 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는 해당 태그를 얕은 복제하고, 두 백엔드를 빌드한 다음, 스택을 정리합니다. SQLite. Cognito 환경 변수 없음. 패치된 서비스에는 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)