- 16歳の高校生が Mintlifyプラットフォームの脆弱性 を利用し、X、Vercel、Cursor、Discordなど主要企業のドキュメントサイトで クロスサイトスクリプティング(XSS) 攻撃が可能だった事例を整理して公開した。この脆弱性により、バグバウンティとして11,000ドルを受領
- Mintlifyの内部パス
/_mintlify/static/[subdomain]/[...route] は、ドメイン検証なしで外部ファイルを読み込める構造 になっていた
- 攻撃者は SVGファイルにJavaScriptを埋め込み、Discordなど主要サービスのドメイン上で悪意あるスクリプトを実行できた
- 脆弱性は Mintlifyを利用するほぼすべての顧客企業 に影響し、リンクを1回クリックするだけでアカウント乗っ取りが可能だった
- この事件は、サプライチェーンセキュリティにおける単一の脆弱性が大規模被害につながり得ることを示す事例 と評価されている
Discordでの発見
- 2025年11月、Discordが AIベースのドキュメントプラットフォームMintlify に移行したことで、脆弱性探索が始まった
- 既存のカスタムプラットフォームからMintlifyへ移行した直後、研究者は新しいドキュメントシステムの構造を分析した
- Discordのドキュメントドメイン(
discord.mintlify.app)が、Mintlifyの内部パス(/_mintlify/*)をそのまま公開していた
- このパスは、認証など主要機能のために必須でアクセス可能である必要があった
Mintlifyプラットフォーム構造
- Mintlifyは Markdownベースのドキュメント作成 を支援し、それを自動でWebドキュメントに変換するサービス
- すべてのドキュメントサイトは
*.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が個別の脆弱性に対して追加報奨を支給
- この事例は、サプライチェーンセキュリティの重要性と単一プラットフォーム脆弱性の波及力 を示す代表的なケースとして残る
1件のコメント
Hacker Newsの意見
このエクスプロイトは本当に恐ろしい事例だと思う
たった1つのリンク、たとえば https://discord.com/_mintlify/static/evil/exploit.svg のようなリンクをクリックするだけで、Discordドメイン上でJavaScriptが実行される
その結果、セッションクッキーやトークンが盗まれてアカウントが完全に乗っ取られたり、開発者アプリやWebhookを操作されたり、API経由でサーバーを削除されたり、決済情報を使ってNitroを購入されたりと、被害は大きい
この被害規模を考えると、4,000ドルのバグバウンティはあまりにも少ない報酬に感じる
セッションクッキーを常にHTTP-onlyに設定していれば、この種の攻撃にはずっと強くなる
フロントエンド開発者の中に、こうした基本的なセキュリティ概念を知らない人が多いのは驚きだ
ブラックマーケットではもっと高い価値が付いたはずだ
SVGファイルにスクリプトを入れられるという事実自体がセキュリティ上の失策だったと思う
インタラクティブなデモやゲームをSVG1つで実装できるのはすごいが、そのぶん脆弱性の温床にもなる
だから多くのプラットフォームはSVGのアップロードを禁止したり、プレビューを遮断したりしている
DiscordでもSVGをアップロードするとコードがそのまま表示され、Facebook MessengerやWeChatなどでも共有できない
ファイルサイズが小さく解像度非依存という利点があるにもかかわらず、依然としてラスタ画像フォーマットのほうが広く使われている現実は残念だ
RailsのActive StorageはデフォルトでSVGをサニタイズしないので注意が必要だ
関連内容は OWASP文書 を参照
<script>タグを単純に無視するようにすれば解決するのか気になるただ、それだけでは十分でないかもしれない
ラスタ形式ではこうした問題はほとんどない
今回の事件は、最近のAIスタートアップ生態系の一面を示しているように思う
VC資金で成長したAIドキュメント系スタートアップが、セキュリティ検証もないまま大口顧客を獲得し、最終的に何百万人もを危険にさらした
Mintlifyは少し前に複雑なキャッシュアーキテクチャを誇るブログを書いていたが、実際には基本的なセキュリティすら分かっていないように見える
こうした状況で脆弱性を見つけた人が受け取るのは、わずか5,000ドルだ
最近のAIベースの開発文化がどれほど脆いかを示す事例だと思う
複雑な依存関係チェーンと、多数のサードパーティDLLが入り乱れる地獄が根本原因だ
DiscordがAPIドキュメントを discord.com で直接提供していなければ、この問題は起きなかったはずだ
CDNだけで十分ではないのかと思う
顧客アカウントを完全に乗っ取れるバグなのに、報奨金が少なすぎる
今の時代にXSSを許している理由もない
Anubisでも今年2件の反射型XSSが見つかっている
サードパーティ依存関係は必ず点検すべきだ
関連するセキュリティ告知は こちら と こちら を参照
大手SNSクラスでもない限り、金銭的利益につなげにくいからだ
こうした脆弱性を見つけた16歳のハッカーを正社員かパートタイムで雇って、常時セキュリティ点検をさせたらどうかと思う
年5万ドル払うだけでも会社のセキュリティは飛躍的に強化されそうだ
バグバウンティは結果に応じて報酬が決まるので、より効率的だ
ただ、報酬が低いと研究者が第三者に売る誘惑が生まれる
XSS、IAM、シェルエクスプロイトなど、それぞれ特化分野があるため、1人ですべてをカバーするのは難しい
16歳がこれを見つけたなんてすごい
ただ、XSSを**サプライチェーン攻撃(supply chain attack)**と呼ぶのは少し違和感がある
Mintlifyのような中間層で問題が起きると、最終利用者には防ぐ手段がない
信頼されたチェーンの中で悪意あるコードが届けられるわけで、一種のサプライチェーンレベルのXSSと見ることもできる
協力者のレポートには、より深刻なRCE脆弱性も含まれている
詳細は このブログ を参照
こういう事例を見ると、
1️⃣ Content Security Policy(CSP) は必ず設定すべきだ
2️⃣ NodeJSサーバーでは
--disallow-code-generation-from-stringsオプションをデフォルトで使うべきだVercelのようなサービスプロバイダーは、CSP未使用時に警告を出すべきだ
追加で参考になるNodeJSのセキュリティフラグは この記事 にまとまっている
ユーザー認証がかかったメインドメインでサードパーティサービスをプロキシするのは最悪の選択だ
Mintlifyは dev-docs.discord.com のような別サブドメインに分離すべきだった
顧客に求められても、セキュリティ上のリスクが大きすぎるからだ
ただしSEOのため、メインドメインにドキュメントを置きたがる需要は多い
Mintlifyにとっても今回の件はかなりのストレスだろう
サードパーティ用のサブドメインを使い、メインアプリの認証クッキーはhost-onlyに制限すべきだ
可能なら完全に別ドメイン(例: discorddocs.com)を使うほうがさらに安全だ
しかしセキュリティリスクと比べると、あまりにも危険な選択だ
もうSVGファイルは絶対に開かない
16歳がこれを見つけたなんて本当に伝説級だ