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 환경 변수와 활성 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 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는 해당 태그를 shallow clone하고 두 백엔드를 빌드한 뒤 스택을 정리합니다. 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)