Mintlify 공급망 공격으로 X, Vercel, Cursor, Discord 수백 개 기업 해킹 가능했던 사건
We pwned X, Vercel, Cursor, and Discord through a supply-chain attack
TL;DR Highlight
AI 문서 플랫폼 Mintlify는 엔드포인트 검증 미흡으로 고객사 도메인(discord.com, docs.x.com 등)에서 악성 JavaScript를 실행할 수 있는 XSS 취약점을 초래했다.
Who Should Read
자사 도메인에 서드파티 SaaS(문서 플랫폼, 위젯 등)를 프록시하거나 임베딩하는 프론트엔드/인프라 엔지니어, 그리고 CSP(Content Security Policy) 설정을 관리하는 보안 담당 개발자.
Core Mechanics
- Mintlify는 AI 기반 문서 플랫폼으로, 고객사가 자체 도메인(discord.com, docs.x.com 등)에서 Mintlify를 프록시해서 사용한다. 모든 Mintlify 사이트에는 내부 기능용 /_mintlify/* 경로가 존재하는데, 이 경로가 문제의 시작점이었다.
- /_mintlify/static/[subdomain]/[파일경로] 엔드포인트가 요청한 subdomain이 현재 호스트와 일치하는지 검증하지 않았다. 즉, discord.com에서 공격자의 Mintlify 문서에 올린 파일을 그대로 가져올 수 있었다.
- 대부분의 파일 타입은 차단됐지만 SVG 파일은 통과했다. SVG에는 JavaScript를 삽입할 수 있고, 브라우저에서 직접 열면 스크립트가 실행된다. 공격자가 자기 Mintlify 문서에 악성 SVG를 올린 뒤 discord.com/_mintlify/static/evil/payload.svg 같은 URL로 접근하면, discord.com 오리진에서 JS가 실행되는 것.
- 이 XSS가 discord.com 오리진에서 실행되므로 Discord 세션 쿠키 탈취, 개발자 애플리케이션/웹훅 조작, Discord API를 통한 서버 삭제·DM 전송, 심지어 저장된 결제 정보로 Nitro 구매까지 가능했다.
- 영향 범위가 Mintlify를 사용하는 거의 모든 고객사로 확대됐다. X(Twitter), Vercel, Cursor, Discord 등 수백 개 기업이 포함된다. 하나의 SaaS 취약점이 모든 고객사에 전파되는 전형적인 공급망 공격 패턴.
- Discord는 제보 후 2시간 만에 개발자 문서를 내리고 레거시 플랫폼으로 롤백했다. 바운티는 Discord $4,000, Mintlify 측 합산 약 $11,000 수준으로, 커뮤니티에서는 피해 규모 대비 너무 적다는 비판이 많았다.
- 공동 연구자 Eva가 발견한 별도 취약점에서는 Mintlify 서버 자체에서 RCE(원격 코드 실행)까지 가능했다. Node.js의 코드 생성 함수(eval 류)가 제대로 제한되지 않은 것이 원인.
- 발견자는 16세 고등학생으로, Discord 버그 바운티 리더보드 1위에 올라있으며 약 100건의 취약점을 제보한 경력이 있다.
Evidence
- discord.com 오리진에서 JS가 실행되면 세션 쿠키 탈취·계정 탈취·개발자 앱 조작·결제 정보 악용까지 가능한데 바운티가 $4,000이라니 터무니없다는 의견이 많았다. 링크 하나만 클릭하면 끝나는 공격인데도.
- "VC 투자 받은 AI 스타트업이 보안 검증도 안 된 채 대기업 고객을 확보하고, 실제로는 기본적인 XSS도 못 막는 수준"이라는 비판이 있었다. Mintlify가 복잡한 캐싱 아키텍처 블로그를 올렸지만 정작 보안 기본기가 없다는 지적.
- 인프라 관점에서 '핵심 도메인(discord.com)에서 서드파티로 직접 프록시하는 건 항상 나쁜 아이디어, dev-docs.discord.com 같은 별도 서브도메인으로 CNAME 처리했으면 피해 범위가 제한됐을 것'이라는 실무적 조언이 올라왔다.
- 공개 38일 후 실제로 이 공격 표면을 활용한 피싱 인프라가 발견됐다는 보고가 있었다. discord.flawing.top/blog/* 패턴의 URL 101개, openopenbox301.vercel.app의 피싱 URL 20개 등 121개 IOC가 수집됐다고.
- SVG 파일에 스크립트를 넣을 수 있는 것 자체가 설계 실수라는 의견도 있었다. 실제로 Discord·Facebook Messenger·Google Hangouts 등 대부분의 메신저가 SVG 업로드나 미리보기를 차단하고 있다.
How to Apply
- 자사 도메인에서 서드파티 SaaS를 프록시할 때는 반드시 별도 서브도메인(예: docs.example.com)을 사용하고, 메인 도메인(example.com)의 쿠키가 공유되지 않도록 도메인을 분리해라. 쿠키의 Domain 속성과 SameSite 설정도 점검.
- CSP(Content Security Policy) 헤더에서 script-src를 엄격하게 설정해서, 인라인 스크립트와 SVG 내 스크립트 실행을 차단해라. 특히 서드파티 콘텐츠를 서빙하는 경로에는 sandbox CSP를 적용하는 것이 효과적.
- 사용자 업로드나 외부 소스의 SVG 파일을 서빙할 때는 Content-Type을 image/svg+xml 대신 Content-Disposition: attachment로 강제하거나, SVG를 래스터 이미지(PNG)로 변환해서 제공하는 방식을 고려해라.
- Node.js 서버를 운영한다면 --disallow-code-generation-from-strings 플래그를 기본으로 적용해서 eval(), new Function() 등을 통한 RCE 벡터를 원천 차단해라.
Code Example
# CSP 헤더 예시 - 서드파티 프록시 경로에 적용
# nginx 설정
location /_mintlify/ {
add_header Content-Security-Policy "default-src 'none'; img-src 'self'; style-src 'self'; script-src 'none'; sandbox;";
proxy_pass https://upstream.mintlify.app;
}
# Node.js 실행 시 코드 생성 차단
node --disallow-code-generation-from-strings server.jsTerminology
관련 논문
OpenKnowledge – Obsidian/Notion의 오픈소스 AI-first 대안
Git 기반 동기화와 Claude/Codex/Cursor 연동을 내장한 로컬 우선 마크다운 에디터로, AI 에이전트의 두 번째 뇌(LLM Wiki)로 활용할 수 있는 오픈소스 도구다.
Unfireable Safety Kernel: AI 에이전트를 위한 Execution-Time AI Alignment
AI 에이전트가 자신의 안전장치를 우회할 수 없도록, 에이전트 프로세스 바깥에 수학적으로 증명된 강제 통제 게이트를 배치하는 아키텍처
RubyLLM: 주요 AI 프로바이더를 모두 지원하는 Ruby 프레임워크
OpenAI, Claude, Gemini 등 주요 AI 프로바이더를 단일 인터페이스로 통합한 Ruby 프레임워크로, Rails 통합과 에이전트 기능까지 지원해 Ruby 개발자가 AI 기능을 빠르게 붙일 수 있다.
Qwen-AgentWorld: 범용 에이전트를 위한 Language World Model
Alibaba Qwen 팀이 AI 에이전트가 행동 결과를 미리 시뮬레이션할 수 있는 'Language World Model'을 공개했다. 에이전트 훈련과 실행 경로 검증에 새로운 패러다임을 제시하는 연구다.
SHERLOC: Code Repair Agent를 위한 구조화된 Diagnostic Localization 프레임워크
버그 위치만 알려주는 게 아니라 '왜, 어떻게 고쳐야 하는지'까지 진단 리포트를 생성해서 코드 수정 에이전트의 성능을 높이는 training-free 프레임워크
peerd – 브라우저에서 완전히 실행되는 AI Agent Harness
백엔드 서버 없이 Chrome/Firefox 확장 프로그램으로만 동작하는 AI 에이전트 실행 환경으로, 브라우저 탭을 직접 조작하고 WASM Linux VM까지 구동할 수 있어 프라이버시와 보안을 동시에 챙길 수 있다.