9 ポイント 投稿者 GN⁺ 2025-12-19 | 1件のコメント | WhatsAppで共有
  • 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ファイルは許可 されていた

攻撃の実現

  • 攻撃者は JavaScriptが埋め込まれたSVGファイル を自分のMintlifyドキュメントにアップロード
  • Discordドメインで当該ファイルを呼び出す(https://discord.com/_mintlify/_static/.../lmao.svg)と、スクリプトが実行 された
  • これにより、Discordだけでなく Mintlifyを利用するすべての企業のドキュメントドメインでXSS実行が可能 だった

協力と報告

  • 研究者は他のセキュリティ研究者たちと協力して脆弱性を検証した
  • Discordは報告直後に 開発者向けドキュメント全体を2時間無効化 し、その後 従来のプラットフォームに復帰 した
  • MintlifyはDiscordを通じて脆弱性を認知した後、エンジニアリングチームと研究者の間でSlackチャンネルを開設 し、即時に修正作業を進めた

影響範囲

  • X(Twitter)、Vercel、Cursor、Discordなど、Mintlify顧客企業の大半が影響圏内 だった
  • 各企業の公式ドメイン上で、単一の悪意あるリンクによりアカウント乗っ取りの可能性 が存在した
  • サプライチェーン上の単一脆弱性が、数百社のセキュリティに連鎖的なリスク をもたらし得る

報奨金と結論

  • 研究チームは合計で 約11,000ドルのバグバウンティ を受領
    • Discordが4,000ドル、Mintlifyが個別の脆弱性に対して追加報奨を支給
  • この事例は、サプライチェーンセキュリティの重要性と単一プラットフォーム脆弱性の波及力 を示す代表的なケースとして残る

1件のコメント

 
GN⁺ 2025-12-19
Hacker Newsの意見
  • このエクスプロイトは本当に恐ろしい事例だと思う
    たった1つのリンク、たとえば https://discord.com/_mintlify/static/evil/exploit.svg のようなリンクをクリックするだけで、Discordドメイン上でJavaScriptが実行される
    その結果、セッションクッキーやトークンが盗まれてアカウントが完全に乗っ取られたり、開発者アプリやWebhookを操作されたり、API経由でサーバーを削除されたり、決済情報を使ってNitroを購入されたりと、被害は大きい
    この被害規模を考えると、4,000ドルのバグバウンティはあまりにも少ない報酬に感じる

    • クッキーやトークンを盗むには、HTTP-onlyではないクッキーか localStorage にトークンが入っている必要があるが、Discordがそういう構造なのか確信が持てない
      セッションクッキーを常にHTTP-onlyに設定していれば、この種の攻撃にはずっと強くなる
      フロントエンド開発者の中に、こうした基本的なセキュリティ概念を知らない人が多いのは驚きだ
    • 「4,000ドルは少なすぎる」という意見に同感
      ブラックマーケットではもっと高い価値が付いたはずだ
  • SVGファイルにスクリプトを入れられるという事実自体がセキュリティ上の失策だったと思う
    インタラクティブなデモやゲームをSVG1つで実装できるのはすごいが、そのぶん脆弱性の温床にもなる
    だから多くのプラットフォームはSVGのアップロードを禁止したり、プレビューを遮断したりしている
    DiscordでもSVGをアップロードするとコードがそのまま表示され、Facebook MessengerやWeChatなどでも共有できない
    ファイルサイズが小さく解像度非依存という利点があるにもかかわらず、依然としてラスタ画像フォーマットのほうが広く使われている現実は残念だ

    • すべてのSVGは、アップロード時とレンダリング時に徹底的にサニタイズされるべきだ
      RailsのActive StorageはデフォルトでSVGをサニタイズしないので注意が必要だ
    • XML外部エンティティ(XXE)の問題も似た事例だった
      関連内容は OWASP文書 を参照
    • メッセンジャーアプリが <script> タグを単純に無視するようにすれば解決するのか気になる
      ただ、それだけでは十分でないかもしれない
    • Flash時代のセキュリティバグを思い出させる状況だ
    • SVGのより大きな問題は、レンダリング結果がソフトウェアごとに異なる点だ
      ラスタ形式ではこうした問題はほとんどない
  • 今回の事件は、最近のAIスタートアップ生態系の一面を示しているように思う
    VC資金で成長したAIドキュメント系スタートアップが、セキュリティ検証もないまま大口顧客を獲得し、最終的に何百万人もを危険にさらした
    Mintlifyは少し前に複雑なキャッシュアーキテクチャを誇るブログを書いていたが、実際には基本的なセキュリティすら分かっていないように見える
    こうした状況で脆弱性を見つけた人が受け取るのは、わずか5,000ドルだ
    最近のAIベースの開発文化がどれほど脆いかを示す事例だと思う

    • 実際には、こうした攻撃に弱いのはAIスタートアップだけでなく、JavaScriptエコシステム全体の構造的問題でもある
      複雑な依存関係チェーンと、多数のサードパーティDLLが入り乱れる地獄が根本原因だ
    • ほとんどのXSSは単一ドメイン構成が原因だ
      DiscordがAPIドキュメントを discord.com で直接提供していなければ、この問題は起きなかったはずだ
    • ドキュメントサイトに、なぜ複雑なキャッシュ構成が必要なのか疑問だ
      CDNだけで十分ではないのかと思う
  • 顧客アカウントを完全に乗っ取れるバグなのに、報奨金が少なすぎる
    今の時代にXSSを許している理由もない

    • XSSはいまだになくなっておらず、CSPやTrusted Typesのような防御策も完璧ではない
      Anubisでも今年2件の反射型XSSが見つかっている
      サードパーティ依存関係は必ず点検すべきだ
      関連するセキュリティ告知は こちらこちら を参照
    • 一般的に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 のような別サブドメインに分離すべきだった

    • 自分もMintlifyに似た製品を運営しているが、コードベースへのアクセスやGit連携は提供していない
      顧客に求められても、セキュリティ上のリスクが大きすぎるからだ
      ただしSEOのため、メインドメインにドキュメントを置きたがる需要は多い
      Mintlifyにとっても今回の件はかなりのストレスだろう
    • この種の脆弱性の核心はドメイン分離の失敗
      サードパーティ用のサブドメインを使い、メインアプリの認証クッキーはhost-onlyに制限すべきだ
      可能なら完全に別ドメイン(例: discorddocs.com)を使うほうがさらに安全だ
    • 企業がドキュメントサイトをメインドメインに置く理由は、コード例に実際のAPIキーを自動挿入するためだ
      しかしセキュリティリスクと比べると、あまりにも危険な選択だ
  • もうSVGファイルは絶対に開かない
    16歳がこれを見つけたなんて本当に伝説級だ

    • それでも開く必要があるなら、サンドボックス化されたブラウザー環境でのみ開くべきだ