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
관련 논문
adamsreview: Claude Code용 멀티 에이전트 PR 코드 리뷰 파이프라인
Claude Code에서 최대 7개의 병렬 서브 에이전트가 각각 다른 관점으로 PR을 리뷰하고, 자동 수정까지 해주는 오픈소스 플러그인이다. 기존 /review나 CodeRabbit보다 실제 버그를 더 많이 잡는다고 주장하지만 커뮤니티에서는 복잡도와 실효성에 대한 회의론도 나왔다.
Claude를 User Space IP Stack으로 써서 Ping에 응답시키면 얼마나 빠를까?
Claude Code에게 IP 패킷을 직접 파싱하고 ICMP echo reply를 구성하도록 시켜서 실제로 ping에 응답하게 만든 실험으로, 'Markdown이 곧 코드이고 LLM이 프로세서'라는 아이디어를 네트워크 스택 수준까지 밀어붙인 재미있는 사례다.
AI Agent를 위한 Git: re_gent
AI 코딩 에이전트(Claude Code 등)가 수행한 모든 툴 호출을 자동으로 추적하고, 어떤 프롬프트가 어느 코드 줄을 작성했는지 blame까지 가능한 버전 관리 도구다.
Agent-Native CLI를 위한 설계 원칙 10가지
AI 에이전트가 CLI 도구를 더 잘 사용할 수 있도록 설계하는 원칙들을 정리한 글로, 에이전트가 CLI를 도구로 활용하는 빈도가 높아지면서 이 설계 방식이 실용적으로 중요해지고 있다.
Agent-harness-kit: MCP 기반 멀티 에이전트 워크플로우 오케스트레이션 프레임워크
여러 AI 에이전트가 서로 역할을 나눠 협업할 수 있도록 조율하는 scaffolding 도구로, Vite처럼 설정 없이 빠르게 멀티 에이전트 파이프라인을 구성할 수 있다.
Tilde.run – AI Agent를 위한 트랜잭션 기반 버전 관리 파일시스템 샌드박스
AI 에이전트가 실제 프로덕션 데이터를 건드려도 롤백할 수 있는 격리된 샌드박스 환경을 제공하는 도구로, GitHub/S3/Google Drive를 하나의 버전 관리 파일시스템으로 묶어준다.