- 16살 고등학생이 Mintlify 플랫폼의 취약점을 이용해 X, Vercel, Cursor, Discord 등 주요 기업의 문서 사이트에서 교차 사이트 스크립팅(XSS) 공격이 가능했던 사례를 정리해 공개함. 이 취약점을 통해 버그바운티로 11,000 달러 수령
- Mintlify의 내부 경로 /_mintlify/static/[subdomain]/[...route]가 도메인 검증 없이 외부 파일을 불러올 수 있는 구조로 되어 있었음
- 공격자는 SVG 파일에 자바스크립트를 삽입해 Discord 등 주요 서비스 도메인에서 악성 스크립트를 실행할 수 있었음
- 취약점은 Mintlify를 사용하는 거의 모든 고객사에 영향을 미쳤으며, 단 한 번의 링크 클릭으로 계정 탈취가 가능했음
- 이 사건은 공급망 보안의 단일 취약점이 대규모 피해로 이어질 수 있음을 보여주는 사례로 평가됨
Discord에서의 발견
- 2025년 11월 Discord가 AI 기반 문서 플랫폼 Mintlify로 전환하면서 취약점 탐색이 시작됨
- 기존 커스텀 플랫폼에서 Mintlify로 이전한 직후, 연구자는 새 문서 시스템의 구조를 분석
- Discord의 문서 도메인(discord.mintlify.app)이 Mintlify의 내부 경로(/_mintlify/*)를 그대로 노출하고 있었음
- 이 경로는 인증 등 주요 기능을 위해 필수적으로 접근 가능해야 했음
Mintlify 플랫폼 구조
- Mintlify는 Markdown 기반 문서 작성을 지원하며, 이를 자동으로 웹 문서로 변환하는 서비스
- 모든 문서 사이트는 *.mintlify.app 하위 도메인 또는 커스텀 도메인에서 운영
- 내부적으로 /_mintlify/api/user, /_mintlify/markdown/, /_mintlify/static/ 등의 엔드포인트를 사용
취약점 탐색 과정
-
/_mintlify/_markdown/_sites/[subdomain]/[...route] 엔드포인트가 도메인 검증 없이 다른 문서의 파일을 반환함을 발견
- 단, 이 경로는 렌더링되지 않은 Markdown 텍스트만 반환해 코드 실행은 불가능했음
- 이후 Mintlify CLI 패키지를 분석해 /_mintlify/static/[subdomain]/[...route] 엔드포인트를 추가로 발견
- 이 경로는 정적 파일을 반환하며, 파일 확장자 화이트리스트를 적용
- HTML·JS 파일은 차단되었으나 SVG 파일은 허용되어 있었음
공격 실현
협업 및 보고
- 연구자는 다른 보안 연구자들과 협력해 취약점을 검증
- Discord는 보고 직후 개발자 문서 전체를 2시간 동안 비활성화하고, 이후 기존 플랫폼으로 복귀
- Mintlify는 Discord를 통해 취약점을 인지한 후, 엔지니어링 팀과 연구자 간 Slack 채널을 개설해 즉시 수정 작업 진행
영향 범위
- X(Twitter), Vercel, Cursor, Discord 등 Mintlify 고객사 대부분이 영향권
- 각 기업의 공식 도메인에서 단일 악성 링크로 계정 탈취 가능성 존재
- 공급망 단일 취약점이 수백 개 기업의 보안에 연쇄적 위험을 초래할 수 있음
보상 및 결론
- 연구팀은 총 약 11,000달러의 버그 바운티를 수령
- Discord가 4,000달러, Mintlify가 개별 취약점에 대해 추가 보상 지급
- 이 사례는 공급망 보안의 중요성과 단일 플랫폼 취약점의 파급력을 보여주는 대표적 사례로 남음