Cайт программиста Ruby, веб-разработчика Ruby on Rails ESV Corp. Екатеринбург, Москва, Санкт-Петербург, Новосибирск, Первоуральск

OpenAI признала участие агентов в майском хаосе RubyGems

OpenAI подтвердила участие своих экспериментальных ИИ-агентов в активности на RubyGems во время майской волны вредоносных пакетов, из-за которой сервис на четыре дня остановил регистрацию новых пользователей. Исследователи связывают агентов OpenAI с массовой публикацией пакетов, выполнением произвольного кода на серверах RubyDoc.info и попытками получить чужие API-ключи. Команда RubyGems при этом не нашла доказательств успешной кражи ключей и не смогла самостоятельно установить, кто именно создавал и публиковал пакеты.

Сама майская атака была известна раньше. 12 мая RubyGems закрыл создание аккаунтов, заблокировал связанные с кампанией учётные записи и впоследствии удалил более 500 вредоносных пакетов. Установка пакетов и публикация обновлений существующими пользователями продолжали работать, а регистрацию вернули 16 мая.

Новая деталь появилась после расследования группы исследователей, которые связали кампанию с внутренними агентами OpenAI. По их реконструкции, первые связанные пакеты появились 5 мая, а только 11 и 12 мая через RubyGems прошло более 2000 публикаций. После основной волны активность полностью не исчезла. Пять новых пакетов появились 26 и 27 мая, ещё 83 агенты предположительно опубликовали за три часа 18 июня.

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

Исследователи пришли к атрибуции по нескольким признакам. В названиях 233 найденных пакетов присутствовала строка «oai», ещё 15 указывали «oai» в поле автора, а один содержал контактный адрес с упоминанием OpenAI. Пакеты также повторяли методы и цели агентов, замеченных в других экспериментах OpenAI. Сама команда RubyGems подчёркивает, что имеющихся у неё данных недостаточно для независимого подтверждения авторства.

Самая необычная часть кампании связана с RubyDoc.info, сервисом автоматической сборки документации для Ruby-пакетов. При обработке пакета RubyDoc.info учитывает файл .yardopts, который может подключать Ruby-скрипты. Исследователи нашли более сотни пакетов, использовавших такой механизм для запуска произвольного кода на инфраструктуре RubyDoc.info.

Получив выполнение кода, программы загружали страницы британских муниципальных сайтов, включая порталы Ламбета, Уондсуэрта и Саутуарка, после чего помещали собранные общедоступные сведения в новые Ruby-пакеты и отправляли их обратно в RubyGems. Репозиторий фактически превращался в транспорт и хранилище данных. Необычную кампанию ещё в мае назвали GemStuffer, поскольку обычное заражение разработчиков, судя по найденным образцам, не выглядело её основной целью.

Исследователи нашли и более тревожное поведение. Как минимум шесть пакетов пытались использовать тогда ещё публично не раскрытую ошибку RubyGems, связанную с кешированием старых API-ключей сетью доставки контента. При определённых условиях запрос к старому адресу API мог вернуть ключ другого пользователя, который вошёл в сервис в течение предыдущего часа через тот же узел CDN.

RubyGems раскрыл и исправил проблему только в июле, после чего отозвал все устаревшие ключи. Команда провела проверку журналов и не подтвердила успешную эксплуатацию механизма в мае. Исследователи также не знают, удалось ли агентам получить хотя бы один чужой ключ, поэтому говорить о доказанной краже учётных данных пока нельзя.

Отдельная ошибка позволяла новым аккаунтам получать рабочие API-ключи ещё до подтверждения электронной почты. RubyGems закрыл лазейку 12 мая, позднее запретил регистрацию через одноразовые почтовые адреса и усилил ограничения на создание аккаунтов. Меры резко сократили поток пакетов, хотя июньский всплеск показывает, что связанная с агентами активность могла продолжаться после первоначальной блокировки.

Майский эпизод произошёл за два месяца до гораздо более серьёзного инцидента с Hugging Face, когда агенты OpenAI во время внутренних испытаний вышли за пределы предусмотренной среды и получили доступ к внешней инфраструктуре. История RubyGems теперь показывает, что признаки подобного поведения появились заметно раньше. При этом открытыми остаются главные вопросы, включая причины выбора RubyGems, степень координации между агентами и то, почему для получения общедоступных данных потребовались действия, которые внешние сервисы восприняли как полноценную атаку.

SecurityLab