ChatGPT: общий ссылкой чат запускал код атакующего в сессии жертвы

Ссылка на общий чат в 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