// Безопасность

Вредоносный npm-пакет притворился инструментом bug bounty Twilio и воровал токены доступа

Вредоносный npm-пакет притворился инструментом bug bounty Twilio — обложка статьи

Исследователи ReversingLabs нашли в реестре npm пакет, который выдавал себя за санкционированный инструмент для участия в баг-баунти программе Twilio на HackerOne. На деле пакет tw-pkgprobe-7731 не имел к этой программе никакого отношения и собирал данные из окружения разработчика: переменные среды, конфигурации, а в отдельных версиях — напрямую токены доступа Twilio. Пакет опубликовали в середине августа 2026 года, а нашла его исследователь Lucija Valentić.

Что выдавало себя за легитимный инструмент

Пакет опубликовал аккаунт twdepprobe7731, который на момент публикации уже удалён из реестра npm. За примерно 45 минут в один день вышло сразу 11 версий пакета — верный признак того, что автор быстро дорабатывал функциональность прямо по ходу кампании, а не готовил единый релиз заранее. Описание пакета прямо ссылалось на программу Twilio HackerOne, что само по себе нарушает правила этой программы: авторизованные инструменты для баг-баунти не распространяются через публичный реестр под видом обычной npm-зависимости.

Как менялась функциональность от версии к версии

Версия 1.0.0 проверяла, похоже ли окружение на среду разработчика Twilio, и если да — собирала переменные окружения, данные о смонтированных дисках, временных папках и конфигурациях, отправляя всё через вебхук.

В версиях 1.0.1–1.0.3 пакет пошёл дальше: искал папки, связанные с Account String Identifier (SID) аккаунтов Twilio, сканировал установленные npm-пакеты и содержимое node_modules, а также внедрял собственные PoC-пакеты в проект жертвы.

Версия 1.0.4 стала самой прямолинейной: она вытаскивала конкретно process.env.ACCOUNT_SID и process.env.AUTH_TOKEN — то есть именно те переменные, которыми Twilio-приложения авторизуются в API и которые дают прямой доступ к аккаунту жертвы.

А версии 1.0.8, 1.1.0 и 1.1.1 неожиданно откатились к более простому поведению: вместо кражи токенов пакет занимался OSINT-разведкой хостов, связанных с Twilio, и запрашивал метаданные AWS по стандартному адресу 169.254.169.254/latest/meta-data/ — это тот самый внутренний эндпоинт облачных метаданных, через который при удачном стечении обстоятельств можно вытащить временные креды IAM-роли инстанса.

Почему исследователи не считают это работой профессионалов

В отчёте отдельно отмечено, что в пакете нет ни обфускации кода, ни тайпсквоттинга (расчёта на опечатку в названии похожего легитимного пакета), ни попытки сделать издательский аккаунт похожим на настоящий. Для сравнения, серьёзные supply-chain кампании обычно маскируют вредоносный код под легитимные обновления и годами выстраивают репутацию аккаунта, прежде чем закинуть в пакет что-то опасное. Здесь всё выглядит грубее: имя пакета в лоб ссылается на Twilio, а сама кампания напоминает скорее разведку или тестирование инструмента, чем отточенную атаку. Итоговая цель автора и его связь с настоящей программой Twilio HackerOne остаются неясными.

Экспертный комментарий

Отсутствие обфускации и мимикрии под легитимный аккаунт — не повод расслабляться. Скорее наоборот: если даже такой топорный, явно недоработанный пакет смог провисеть в реестре npm достаточно долго, чтобы набрать 11 версий за один день без немедленной блокировки, это лишний раз показывает, насколько плохо модерируется публичный реестр пакетов сам по себе. Профессиональная команда, которая захочет повторить тот же трюк аккуратнее — с обфускацией и правдоподобным именем аккаунта, — с высокой вероятностью продержится в реестре куда дольше.

Отдельно стоит обратить внимание на историю с запросом метаданных AWS в последних версиях. Это не случайная деталь: разработчики, которые тестируют интеграции с Twilio, регулярно делают это на облачных инстансах, и если такой инстанс настроен с чрезмерно широкой IAM-ролью, простой HTTP-запрос к внутреннему адресу метаданных может отдать временные учётные данные, дающие доступ куда шире, чем просто к Twilio-аккаунту.

Похожие случаи

Мы уже разбирали похожую схему на примере кампании PhantomRaven, где вредоносные npm-пакеты сами зарабатывали на программах bug bounty: в обоих случаях атакующие используют доверие разработчиков к экосистеме npm и к самой идее легитимного тестирования безопасности, просто чтобы получить доступ к чужому окружению без лишних вопросов.

Что делать

  • Если в проекте когда-либо устанавливался пакет tw-pkgprobe-7731, ротируйте ACCOUNT_SID и AUTH_TOKEN для всех связанных Twilio-аккаунтов немедленно, даже если версия пакета кажется «безобидной»: разные версии вели себя по-разному, и нет гарантии, что именно у вас установилась самая ранняя.
  • Проверьте IAM-роли облачных инстансов, где разработчики тестируют интеграции с внешними API: доступ к 169.254.169.254 не должен отдавать больше прав, чем реально нужно конкретному сервису.
  • Закажите аудит исходного кода и зависимостей проекта, если есть подозрение, что в него мог попасть подобный пакет: важно проверить не только сам факт установки, но и то, куда именно успели уйти данные.
  • Внедрите проверку зависимостей как часть процесса разработки — об этом наша услуга внедрения DevSecOps: чем раньше подозрительный пакет попадает под проверку, тем меньше шанс, что он доедет до продакшена.
  • Если есть основания полагать, что утечка токенов уже произошла, начинайте с реагирования на инцидент, а разбор самого вредоносного пакета доверьте анализу вредоносного ПО — это даст точную картину, что именно было собрано и куда отправлено, а не догадки по номеру версии.
← назад в блог