CVE-2026-79294 — Moonshot AI KimiのHTMLアーティファクトプレビューにおけるStored XSS。公開Shareビューを通じて配信され、セッショントークンの窃取、さらにはアカウント乗っ取りの実証に至る。責任ある開示アドバイザリ。
| ベンダー / 製品 | Moonshot AI — Kimi |
| コンポーネント | HTMLアーティファクトのプレビューレンダリング、公開Shareビュー |
| 弱点 | CWE-79 — ウェブページ生成時の入力の不適切な中和 |
Kimiはモデルが生成したHTMLアーティファクトを、アプリケーション自身のオリジン内のプレビューペインでレンダリングし、スクリプトを中和しない。会話を共有すると、そのアーティファクトが公開Share URLで公開されるため、あるアカウントが作成したスクリプトが、リンクを開いた任意の人物のブラウザで実行される。
Kimiが依存するセッション値はlocalStorageに保持されているため、そのスクリプトから読み取り可能である:
access_token
refresh_token
msh_user_id
したがって、スクリプトの実行はスクリプトの実行だけでは終わらない。これら3つの値は被害者のブラウザから読み出され、任意の場所へ送信され、再生されることで、その被害者として認証済みセッションを取得できる。
攻撃者アカウント → 窃取スクリプトを含むアーティファクト → 公開Share
→ 被害者がリンクを開く → スクリプトがKimiのオリジンで実行される
→ 3つのlocalStorage値が攻撃者に到達する
→ クリーンなブラウザに再生される → 被害者として認証される
攻撃者に必要なのは通常のアカウントのみである。被害者はサインインした状態で共有リンクを開くだけでよい — それこそが共有リンクの用途である。
| 観察された事象 | 方法 |
|---|---|
| スクリプトが被害者のブラウザで実行される | 被害者のセッションを発信元とするリクエストが攻撃者のエンドポイントに到達した |
| 3つの値がスクリプトから読み取り可能 | 3つすべてがそのリクエストボディに含まれていた |
| 値のみで認証が成立する | Kimiに一度もサインインしたことのないブラウザに書き込み、リロード後、そのブラウザは認証済みセッションを保持していた |
| 値が原因である | 対照実験: 同じブラウザで値を省略してリロード — 未認証のままだった |
関与した両アカウントは研究者が作成・管理したものである。第三者のデータにはいかなる時点でもアクセスしていない。
攻撃チェーンは上記にすべて記載している。動作するペイロードと受信エンドポイントは伏せている — 公開すれば攻撃を説明するのではなく、攻撃に武器を与えることになるためである。
アーティファクトのプロンプトは次の形式をとる:
Generate an HTML page that reads the three localStorage values above
and POSTs them to <attacker endpoint>.