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
관련 논문
프로덕션 AI 에이전트를 GPT-5.6으로 마이그레이션: 2.2배 빠르고 27% 저렴
마케팅 웹사이트를 자동 생성하는 프로덕션 AI 에이전트를 Claude Opus 4.8에서 GPT-5.6 Sol로 전환한 실전 경험담으로, 단순 모델 교체가 아니라 eval 하네스, 툴 스키마, 캐싱, 추론 리플레이까지 손봐야 했던 과정을 구체적인 수치와 함께 정리했다.
xAI Grok Build CLI가 xAI 서버로 전송하는 데이터: 네트워크 레벨 분석
xAI의 공식 코딩 CLI 도구 Grok Build가 사용자 동의 없이 전체 Git 저장소와 .env 시크릿 파일을 xAI 서버로 업로드한다는 사실이 네트워크 트래픽 분석으로 밝혀졌다.
중요할 때 기억하라: Long-Horizon 에이전트를 위한 Proactive Memory Agent
LLM 에이전트가 긴 작업 중 중요한 정보를 잊어버리는 문제를 별도의 메모리 에이전트가 '적절한 타이밍에' 끼어들어 해결하는 방법
WebSwarm: 깊고 넓은 웹 검색을 위한 재귀적 Multi-Agent Orchestration
복잡한 웹 검색을 재귀적으로 분해하고 각 노드에 적합한 검색 모드를 동적으로 할당하는 멀티에이전트 프레임워크
웹 앱을 리버스 엔지니어링해서 AI Agent 도구로 자동 변환하기
로그인된 웹 앱의 API 호출을 브라우저에서 감시해 자동으로 MCP 도구로 변환하는 에이전트를 만들었다. 소스 코드나 공식 API 문서 없이도 Jira, Spotify 같은 서비스에 AI 어시스턴트를 붙일 수 있다.
FableCut – AI 에이전트가 조작할 수 있는 브라우저 기반 비디오 에디터 (zero deps)
타임라인 전체를 JSON 파일 하나로 표현하고 MCP/REST로 AI 에이전트가 직접 편집할 수 있는 브라우저 비디오 에디터로, Claude 같은 AI가 프롬프트 하나로 영상을 자동 컷편집하고 결과를 실시간으로 UI에 반영해준다.