Ссылка на общий чат в ChatGPT могла выполнить код атакующего в сессии вошедшего пользователя и вытянуть его приватные переписки. Цепочку показала исследовательская фирма Parameter: 18 октября она отправила отчёт через программу bug bounty OpenAI, через восемь дней вендор выпустил исправление и присвоил проблеме уровень P1 — высшую категорию серьёзности. Публичный разбор Parameter вышел 28 октября, уже после патча.
Приманкой был обычный чат ChatGPT, открытый по публичной ссылке. Передать её можно так же, как любую настоящую: письмом, сообщением в мессенджере, тикетом в поддержку или постом в соцсети. Жертве не нужно было ничего устанавливать, вступать в рабочее пространство или входить через страницу атакующего. В самой надёжной версии атаки достаточно было открыть ссылку и один раз нажать кнопку Preview в ChatGPT. В более поздней версии Parameter настроила страницу так, что Preview срабатывал сам, — тогда хватало одного открытия ссылки.
Что получал атакующий
Код выполнялся внутри сессии жертвы с теми же правами, что и настоящий сайт ChatGPT. В тесте он получил список недавних разговоров, открыл приватный чат, который атакующему никогда не передавали, и отправил небольшую его часть на сервер под контролем исследователей. Код обращался напрямую к API ChatGPT, доступным авторизованному пользователю, а не копировал то, что оказалось на экране. Поскольку он работал с полным веб-доступом жертвы, охват не ограничивался этими чатами.
«По сути, мы могли выполнить любое действие от имени аккаунта ChatGPT жертвы», — написали исследователи.
Это был контролируемый тест. Parameter не сообщает о реальном использовании уязвимости и проверяла чтение приватного чата между собственными отдельными аккаунтами, а не на настоящих пользователях.
Как ссылка вырвалась из песочницы
ChatGPT умеет превращать блок HTML в чате в небольшую веб-страницу через функцию Preview. Поскольку страница может содержать любой код, ChatGPT запускает её в изолированном фрейме на отдельном веб-адресе, откуда нельзя прочитать основную страницу ChatGPT вокруг. Эта песочница устояла. Вход нашёлся через вторую функцию того же разговора.
В общем чате был интерактивный график, и при его отрисовке в основную страницу ChatGPT подгружалась математическая библиотека MathLive. После загрузки в ней оставался обработчик, принимавший сообщения об экранной клавиатуре. Сообщение между фреймами браузера безопасно только тогда, когда получатель проверяет отправителя. Parameter выяснила, что этот обработчик принимал сообщение клавиатуры от любого отправителя и что в нём разрешалось передавать необработанный HTML. Preview мог таким образом перешагнуть границу и передать HTML атакующего доверенной основной странице.
Этот HTML создавал новый фрейм, который браузер считал частью chatgpt.com. Скрипт, загруженный с YouTube, затем поставлял код, выполнявшийся внутри. Политика безопасности контента ChatGPT ограничивает источники скриптов на странице: встроенный код она блокировала, но скрипты с YouTube пропускала — поэтому этот шаг и сработал.
Что исправила OpenAI
По словам Parameter, OpenAI воспроизвела и выполнение кода, и доказательство чтения приватного чата, подняла серьёзность с P2 до P1 и выкатила исправление в двух версиях веб-фронтенда ChatGPT. К 26 октября обе версии отклоняли сообщения, на которых держалась атака. За отчёт OpenAI заплатила в общей сложности $5 000.
Исследователи связали проблему с тремя дизайнерскими решениями, совпавшими в одной точке:
- MathLive реагировала на сообщение, менявшее её настройки, не проверяя, какой фрейм его отправил.
- В этом сообщении разрешалось передавать необработанный HTML как данные раскладки клавиатуры.
- Из этого HTML можно было создать фрейм без песочницы, наследовавший идентичность chatgpt.com.
Шаг с YouTube был лишь последним обходным манёвром, а не причиной. Если бы заблокировали только его, недоверенный Preview всё равно мог бы протолкнуть HTML на основной сайт.
Пользователям ChatGPT ничего делать не нужно: исправление на стороне OpenAI, устанавливать или сбрасывать нечего.
Почему общий чат — это поверхность атаки
Случай показывает, что ссылка на разговор ChatGPT — не безобидный текст, а исполняемая страница. Для администратора и владельца бизнеса практический вывод простой: сотрудник, которому прислали «посмотри наш чат», нажимает ссылку в том же браузере, где открыт рабочий аккаунт. Здесь нагрузка шла из общего чата, но тот же класс проблем — доверие данным из чужого фрейма и слишком широкая политика источников скриптов — встречается и в других веб-приложениях. Похожие истории с исполнением кода на стороне клиента разбирались, например, в материале про XSS в WordPress до PHP-кода без аутентификации.
Отдельно стоит держать в голове, что цепочка обошла песочницу не через дыру в самой песочнице, а через доверчивый обработчик сообщений. Такой же принцип «получатель не проверяет отправителя» лежит в основе многих критических уязвимостей корпоративных систем — от CVE-2026-110264 в GitLab с CVSS 10.0 до проблем в VPN-шлюзах, которые закрывают экстренными патчами. Разница в том, что здесь атакующему не нужен доступ к инфраструктуре: хватило одной ссылки, отправленной пользователю.
Частые вопросы
Кого касается эта уязвимость?
Всех, кто открывает ссылки на общие чаты ChatGPT, будучи авторизованным в сервисе. По данным Parameter, реальных атак не зафиксировано, а исправление уже развёрнуто на стороне OpenAI.
Нужно ли что-то обновлять или менять пароль?
Нет. Исправление на стороне OpenAI, устанавливать или сбрасывать пользователю нечего. В отчёте нет указаний на то, что кто-то пострадал.
Сколько времени заняло исправление?
Отчёт Parameter передала 18 октября, исправление OpenAI выпустила через восемь дней. К 26 октября обе версии веб-фронтенда ChatGPT отклоняли сообщения, на которых строилась атака.
Насколько серьёзна уязвимость?
OpenAI присвоила ей уровень P1 — свою высшую категорию. Изначально проблема шла как P2, но после воспроизведения и выполнения кода, и чтения приватного чата оценку подняли.
Что именно мог сделать атакующий?
Выполнить в сессии жертвы код с правами настоящего сайта ChatGPT: получить список недавних разговоров, открыть приватный чат и отправить его фрагмент на свой сервер. Исследователи отмечают, что в теории могли выполнить любое действие от имени аккаунта.
Достаточно ли было одного клика?
В основной версии — открыть ссылку и один раз нажать Preview. В более поздней версии Parameter Preview открывался автоматически, и хватало самого перехода по ссылке.
Почему помог скрипт с YouTube?
Политика безопасности контента ChatGPT блокировала встроенный код, но разрешала скрипты с YouTube. Это был последний обходной шаг, а не корневая причина: без него недоверенный Preview всё равно мог передать HTML на основной сайт.
Что было корнем проблемы?
Три решения, совпавшие вместе: MathLive принимала сообщение об изменении настроек без проверки отправителя, в сообщении можно было передать необработанный HTML, а из этого HTML создавался фрейм без песочницы с идентичностью chatgpt.com.
Сколько заплатили исследователям?
OpenAI выплатила за отчёт в общей сложности $5 000.
Источник: thehackernews.com