npm-пакет с 27 000 загрузок незаметно похищал токены OpenAI

Вредоносный npm-пакет под названием codexui-android в течение неизвестного периода времени незаметно похищал токены аутентификации OpenAI у установивших его разработчиков. Имея около 27 000 еженедельных загрузок, пакет представлялся как легитимный пользовательский интерфейс для модели Codex от OpenAI. Под этой привычной внешностью скрывалась скрытая операция по сбору учетных данных, которую исследователи безопасности теперь классифицируют как хрестоматийную атаку на цепочку поставок npm, нацеленную на токены OpenAI в больших масштабах.

Это открытие — еще одно резкое напоминание о том, что реестры пакетов не являются безопасными по своей сути, а популярность сама по себе не служит показателем надежности.

Как codexui-android скрывал кражу токенов внутри легитимно выглядящего пакета

Атака опиралась на простой, но эффективный обман: создать то, чем разработчики действительно захотят пользоваться, а затем добавить вредоносную логику, незаметно работающую в фоновом режиме. Пакет codexui-android предлагал функциональный интерфейс для Codex от OpenAI, что означало, что разработчики устанавливали его, тестировали и оставляли в своих проектах, часто даже не задаваясь вопросом, что пакет делает на сетевом уровне.

Такой подход известен как атака с использованием троянизированного пакета. Вредоносный код был встроен в то, что казалось полезным инструментом, обходя естественный скептицизм, который вызвал бы явно нефункциональный или плохо собранный пакет. Пакет похищал refresh-токены OpenAI — долгоживущие учетные данные, которые позволяют приложениям запрашивать новые токены доступа, не требуя от пользователя повторного входа в систему.

Название codexui-android также следовало соглашению об именовании, предполагавшему легитимность. Оно заимствовало узнаваемость бренда продукта OpenAI Codex, добавляя специфичный для платформы суффикс, который делал его похожим на специализированный инструмент, близкий к мобильной разработке. У разработчиков, ищущих в npm инструментарий, связанный с Codex, не было бы очевидных причин не доверять ему.

Что украденные refresh-токены OpenAI на самом деле позволяют сделать злоумышленникам

Refresh-токены — это не просто пароли. Во многих системах аутентификации они, по сути, являются мастер-ключами. Когда злоумышленник получает действительный refresh-токен, он может многократно генерировать новые токены доступа, сохраняя постоянный доступ к учетной записи даже после завершения исходного сеанса или смены пароля.

Для аккаунтов OpenAI такой доступ может обернуться несанкционированным использованием платных кредитов API, доступом к сохраненным запросам или данным точно настроенных моделей, потенциальной утечкой проприетарного кода, переданного через API, а в организационном контексте — горизонтальным доступом к командным ресурсам, привязанным к той же учетной записи.

В средах разработки риск быстро нарастает. Инженеры часто работают с ключами API и токенами, имеющими повышенные разрешения. Один скомпрометированный refresh-токен в конвейере CI/CD или общей среде разработки может дать злоумышленнику постоянную точку опоры, которую трудно обнаружить и еще труднее полностью устранить. Этот каскадный эффект зеркально отражает то, что произошло в инциденте с Dropbox Sign, где похищенные учетные данные открыли пути во взаимосвязанные системы далеко за пределами первоначальной точки компрометации.

Почему экосистема npm облегчает масштабирование атак на цепочку поставок

Реестр npm содержит более двух миллионов пакетов. Публикация нового пакета требует минимальной проверки личности, а открытый характер реестра — именно то, что делает его таким полезным для мирового сообщества разработчиков. Это же делает его постоянной мишенью для атак на цепочку поставок.

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

Более широкая проблема атак на цепочку поставок npm не нова, но нацеливание на инструментарий ИИ знаменует собой эволюцию. По мере того как разработчики интегрируют API больших языковых моделей в производственные системы, токены, аутентифицирующие эти интеграции, становятся целями повышенной ценности. Злоумышленники явно осознают этот сдвиг. Пакеты, имитирующие инструменты разработки ИИ, представляют собой новую категорию угроз, противодействовать которой в масштабе сообщество безопасности все еще пытается.

Эшелонированная защита для разработчиков: изоляция учетных данных, сетевая сегментация и не только

Инцидент с codexui-android указывает на несколько конкретных практик, способных снизить подверженность атакам такого класса.

Изоляция учетных данных — самая непосредственная мера защиты. Токены API и refresh-токены должны иметь как можно более узкую область действия, храниться в менеджерах секретов, а не в переменных окружения или файлах конфигурации, и регулярно ротироваться. Если токен украден, ограниченная область действия означает ограниченный ущерб.

Аудит зависимостей должен быть стандартной частью любого рабочего процесса разработки. Инструменты вроде npm audit, наряду со сторонними платформами анализа состава программного обеспечения, могут помечать пакеты с необычным поведением или известными уязвимостями. Фиксация версий зависимостей в файлах package-lock и проверка изменений перед принятием обновлений также снижает подверженность вредоносным обновлениям версий.

Мониторинг сетевого исходящего трафика может выявлять попытки эксфильтрации, пропущенные инструментами аудита. Если среда разработки или конвейер CI/CD настроены на оповещение о неожиданных исходящих соединениях, пакет, пытающийся «позвонить домой» с украденными токенами, становится обнаружимым.

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

Наконец, проверка собственных установленных пакетов на предмет всего, что касается потоков аутентификации, — стоящее упражнение прямо сейчас. Инцидент с codexui-android вряд ли является единичным. Проверьте, что находится в вашем node_modules, проверьте, какие разрешения имеют ваши токены API, и относитесь с повышенным вниманием к любому пакету, который затрагивает хранение учетных данных.

Атаки на цепочку поставок успешны, потому что они эксплуатируют доверие в больших масштабах. Восстановление этого уровня безопасности, по одной зависимости за раз, начиная с наиболее чувствительных учетных данных в вашем стеке, — наиболее практичный ответ, доступный отдельным разработчикам сегодня.