Сбой в ChatGPT 20 марта: что произошло

Обновленная информация о наших выводах, предпринятых действиях и технических деталях ошибки.

March 20 ChatGPT Outage

Ранее на этой неделе мы отключили ChatGPT из-за ошибки в библиотеке с открытым исходным кодом, которая позволяла некоторым пользователям видеть заголовки из истории чатов другого активного пользователя. Также существовала вероятность того, что первое сообщение из недавно созданного диалога могло отображаться в истории чатов другого пользователя, если оба пользователя были активны примерно в одно и то же время.

Ошибка в настоящее время устранена. Нам удалось восстановить работу как сервиса ChatGPT, так и функции истории чатов (за исключением истории за несколько часов). Как и обещалось, ниже мы публикуем более подробные технические детали этой проблемы.

В ходе дальнейшего расследования мы также обнаружили, что эта же ошибка могла стать причиной непреднамеренного отображения информации, связанной с платежами, для 1,2% подписчиков ChatGPT Plus, которые были активны в течение определенного девятичасового окна. В часы, предшествовавшие отключению ChatGPT в понедельник, некоторые пользователи могли видеть имя и фамилию другого активного пользователя, его адрес электронной почты, платежный адрес, тип кредитной карты, последние четыре цифры (только их) номера кредитной карты, а также срок ее действия. Полные номера кредитных карт ни в какой момент не раскрывались. 

Мы полагаем, что число пользователей, чьи данные действительно стали видны кому-то другому, крайне мало. Чтобы получить доступ к этой информации, подписчику ChatGPT Plus нужно было выполнить одно из следующих действий:

  • Открыть электронное письмо с подтверждением подписки, отправленное в понедельник, 20 марта, в период с 1:00 до 10:00 по тихоокеанскому времени. Из-за ошибки некоторые письма с подтверждением подписки, сгенерированные в этот период, были отправлены не тем пользователям. В этих письмах содержались тип кредитной карты и последние четыре цифры номера кредитной карты другого пользователя, но полные номера карт там не отображались. Не исключено, что небольшое количество писем с подтверждением подписки могло быть адресовано некорректно и до 20 марта, хотя мы не зафиксировали ни одного подобного случая.
  • В ChatGPT нажать «Мой аккаунт», а затем «Управление подпиской» в период с 1:00 до 10:00 по тихоокеанскому времени в понедельник, 20 марта. В течение этого окна могли быть видны имя и фамилия, адрес электронной почты, платежный адрес, тип кредитной карты, последние четыре цифры (только они) номера кредитной карты и срок ее действия другого активного пользователя ChatGPT Plus. Не исключено, что это могло произойти и до 20 марта, хотя мы не подтвердили ни одного такого случая.

Мы связались с пострадавшими пользователями, чтобы уведомить их о возможном раскрытии их платежной информации. Мы уверены, что в настоящее время никакой угрозы для данных пользователей не существует. 

Все сотрудники OpenAI стремятся защищать конфиденциальность наших пользователей и обеспечивать безопасность их данных. Мы относимся к этой ответственности предельно серьезно. К сожалению, на этой неделе мы не оправдали этого обязательства и ожиданий наших пользователей. Мы еще раз приносим извинения нашим пользователям и всему сообществу ChatGPT и приложим все усилия для восстановления доверия.

Технические детали

Ошибка была обнаружена в клиентской библиотеке Redis с открытым исходным кодом — redis-py. Как только мы выявили эту проблему, мы связались с разработчиками Redis, предоставив патч для ее решения. Вот как возникала эта ошибка:  

  • Мы используем Redis для кэширования пользовательской информации на нашем сервере, чтобы не обращаться к базе данных при каждом запросе. 
  • Мы используем Redis Cluster для распределения этой нагрузки между несколькими экземплярами Redis. 
  • Мы используем библиотеку redis-py для взаимодействия с Redis из нашего сервера на Python, который работает с использованием Asyncio. 
  • Библиотека поддерживает общий пул соединений между сервером и кластером и после завершения работы повторно использует соединение для следующего запроса.
  • При использовании Asyncio запросы и ответы в redis-py работают как две очереди: вызывающий объект помещает запрос в очередь входящих сообщений и извлекает ответ из очереди исходящих сообщений, после чего возвращает соединение в пул.
  • Если запрос отменяется после того, как он был помещен в очередь входящих сообщений, но до того, как ответ был извлечен из очереди исходящих сообщений, возникает наша ошибка: соединение оказывается поврежденным, и следующий ответ, извлеченный из очереди для несвязанного запроса, может получить данные, оставшиеся в этом соединении. 
  • В большинстве случаев это приводит к неисправимой ошибке сервера, и пользователю приходится повторять запрос. 
  • Но в некоторых случаях поврежденные данные случайно совпадают с типом данных, который ожидал запрашивающий, поэтому то, что возвращается из кэша, кажется корректным, даже если оно принадлежит другому пользователю.
  • В понедельник, 20 марта, в 1:00 по тихоокеанскому времени мы непреднамеренно внесли в наш сервер изменение, которое вызвало всплеск отмен запросов Redis. Это создало небольшую вероятность для каждого соединения вернуть некорректные данные.

Эта ошибка проявлялась только в клиенте Asyncio redis-py для Redis Cluster и на данный момент уже исправлена.

Предпринятые нами действия

Поскольку наше расследование подходит к концу, нашей главной задачей является поддержка пользователей и информирование их о происходящем. 

Мы предприняли следующие шаги для улучшения наших систем:

  • Провели всестороннее тестирование исправления исходной ошибки.
  • Добавили избыточные проверки, чтобы гарантировать, что данные, возвращаемые кэшем Redis, соответствуют запрашивающему пользователю.
  • Провели программный анализ наших журналов (логов), чтобы убедиться, что все сообщения доступны только правильному пользователю.
  • Сопоставили несколько источников данных для точного определения пострадавших пользователей с целью их уведомления.
  • Улучшили логирование для оперативного выявления подобных ситуаций и окончательного подтверждения того, что они прекратились.
  • Повысили надежность и масштабируемость нашего кластера Redis, чтобы снизить вероятность ошибок соединения при экстремальных нагрузках.

Наши дальнейшие шаги

Разработчики Redis с открытым исходным кодом проявили себя великолепными партнерами, оперативно устранив ошибку и выпустив патч. Redis наряду с другим программным обеспечением с открытым исходным кодом играет важнейшую роль в наших исследованиях. Значение этого вклада трудно переоценить — мы не смогли бы масштабировать ChatGPT без Redis. Мы по-прежнему преданы идее постоянной поддержки сообщества Redis и внесения в него своего вклада.

Автор

OpenAI

Полный текст статьи читайте на OpenAI