
Ответное advisory по ответственному раскрытию для CVE-2026-79294 — хранимая XSS в предпросмотре HTML-артефактов Moonshot AI Kimi через публичное представление Share, позволяющая похитить токен сессии и захватить аккаунт.
CVE-2026-79294 — Stored XSS в предварительном просмотре HTML-артефактов Moonshot AI Kimi, доставляемый через публичное представление Share, приводящий к эксфильтрации токена сессии и продемонстрированному захвату учётной записи. Рекомендация по ответственному раскрытию.
| Поставщик / продукт | Moonshot AI — Kimi |
| Компоненты | Рендеринг предварительного просмотра HTML-артефактов; публичное представление Share |
| Слабость | CWE-79 — Ненадлежащая нейтрализация входных данных при генерации веб-страницы |
Kimi отображает сгенерированные моделью HTML-артефакты в панели предварительного просмотра внутри собственного origin приложения, не нейтрализуя скрипты. При публикации беседы этот артефакт становится доступен по публичному URL Share, поэтому скрипт, созданный одной учётной записью, выполняется в браузере любого, кто открывает ссылку.
Значения сессии, на которые опирается Kimi, хранятся в localStorage и поэтому доступны для чтения этому скрипту:
access_token
refresh_token
msh_user_id
Следовательно, выполнение скрипта не ограничивается самим выполнением скрипта. Эти три значения можно прочитать из браузера жертвы, отправить куда угодно и воспроизвести для получения аутентифицированной сессии от имени этой жертвы.
учётная запись атакующего → артефакт со скриптом эксфильтрации → публичный Share
→ жертва открывает ссылку → скрипт выполняется в origin Kimi
→ три значения localStorage попадают к атакующему
→ воспроизводятся в чистом браузере → аутентификация от имени жертвы
Атакующему нужна обычная учётная запись. Жертве достаточно лишь открыть ссылку Share, будучи авторизованной — для этого ссылки Share и предназначены.
| Наблюдение | Как |
|---|---|
| Скрипт выполняется в браузере жертвы | Запрос достиг конечной точки атакующего, исходя из сессии жертвы |
| Три значения доступны для чтения скриптом | Все три присутствовали в теле этого запроса |
| Значения аутентифицируют сами по себе | Записаны в браузер, который никогда не входил в Kimi; после перезагрузки этот браузер имел аутентифицированную сессию |
| Причина — именно эти значения | Контроль: тот же браузер, значения опущены, перезагрузка — остался неаутентифицированным |
Обе задействованные учётные записи были созданы и контролировались исследователем. Данные третьих лиц не были доступны ни на каком этапе.
Цепочка полностью задокументирована выше. Рабочая полезная нагрузка и принимающая конечная точка не раскрываются — их публикация вооружила бы атаку, а не описала её.
Промпт артефакта имеет вид:
Generate an HTML page that reads the three localStorage values above
and POSTs them to <attacker endpoint>.