Дозвіл: npm-пакет приховує хмарні та системні загрози

Дозвіл: Обкладинка npm «Авторизоване дослідження», що приховує зонди хмарних метаданих та стійкість СИСТЕМИ

TL, д-р

Між 15.06.2026 та 16.06.2026 один видавець npm опублікував шість пакетів — загалом 26 версій — які запускають скрипт під час встановлення на кожному npm installКожен пакет містить файл README, в якому його оголошують «доброякісним» артефактом дослідження HackerOne / GitHub Bug Bounty, який «ніколи» не торкається значень облікових даних і «не забезпечує збереження». Код не відповідає застереженню. На серверах непреривчастої інтеграції Linux інсталяційний перехоплювач аналізує середовище та перевіряє кінцеву точку метаданих хмарного екземпляра; на Windows він запитує підвищення прав доступу та виконується як SYSTEM, і відкриває канал команд до зовнішнього хоста. Єдиним індикатором, який зараз потрібно шукати, є хост C2. 173.255.233[.]239. Ступінь тяжкості: високаУражена екосистема: нммІмена змішуються з шумом залежностей безперервної інтеграції (metrics-pipeline-d8k2, event-metrics-q3x7, pkg-telemetry-r4f9, та троє братів і сестер).

Атака: як це працює

Кожен пакет у кластері зібраний однаково. package.json з'єднує ту саму команду з двома життєвими циклами hooks:

{   "scripts": {     "preinstall": "node run.js",     "postinstall": "node run.js"   } }

Працює на обох передвстановлення та післявстановлення означає, що корисне навантаження спрацьовує незалежно від того, чи завершаться подальші кроки встановлення невдачею. run.js сам по собі є десятирядковим диспетчером платформи:

// Platform dispatcher — runs beaconNN.js on Windows, beacon_linux.js on Linux. // GitHub Bug Bounty authorized research. Contact: nicholas@curran.tech 'use strict'; const { execFileSync } = require('child_process'); const path = require('path'); const node = process.execPath; const script = process.platform === 'win32'   ? path.join(__dirname, 'beacon34.js')   : path.join(__dirname, 'beacon_linux.js'); try { execFileSync(node, [script], { stdio: 'inherit', timeout: 90000 }); } catch (e) {}

Потім поведінка розгалужується залежно від операційної системи. Усі шість пакетів містять ті самі дві частини — run.js і маяки платформи — тож вони є взаємозамінними дропперами, а не шістьма окремими інструментами. Єдина суттєва відмінність між ними — це частота публікацій: чотири назви публікувалися один раз, тоді як дві перевидавалися кожні 30–60 хвилин протягом кількох годин, що дозволяє інсталяторам та резолверам завжди мати доступ до свіжоопублікованої версії, навіть коли старіші версії видаляються.

На Linux (beacon_linux.js) профілі скриптів, на яких він працює. Він перераховує імена змінних середовища, зчитує файли під / proc, перевіряє наявність docker.sock, і працює ім'я хоста та WhoamiПотім він надсилає HTTP-запит до кінцевої точки метаданих екземпляра контейнера AWS. 169.254.170[.]2 — локальна адреса посилання, яку запитує завдання ECS для отримання власної конфігурації та короткочасних облікових даних ролі (IMDS, служба метаданих екземпляра). Результати надсилаються до колектора кампанії за адресою 173.255.233[.]239.

У Windows (beacon34.js / beacon18.js) пакет виконує значно більше, ніж просто профілювання свого хоста. Позначений код додає ключ реєстру під ms-налаштування обробник з ДелегуватиВиконати значення — відомий обхід контролю облікових записів користувачів, який дозволяє запущеному процесу виконуватися з підвищеними правами без запиту. Він викликає PowerShell з -ExecutionPolicy Обхід та Invoke-Expression, виконується в NT АВТОРИТЕТ\СИСТЕМА контекст і опитує зовнішній хост щодо команд. Канал команд Windows працює через Тунель Cloudflare, обмеження-діаметра-монет-parents.trycloudflare[.]com:443, повертаючись до 173.255.233[.]239:443, використовуючи три кінцеві точки: /c2/опитування щоб отримати команду, /c2/вихід повернути вихід, /c2/eof закрити.

Що нового: застереження як камуфляж

Новим елементом є не корисне навантаження — розвідка з використанням перехоплювачів встановлення та підвищення рівня Windows добре задокументовані. Це лише прикриття. Кожен пакет містить файл README, який читається як артефакт відповідального розкриття інформації:

# @ncurran/sandbox-recon-880538 — authorized npm-sandbox security research

Це доброякісний пакет, опублікований у власній області видимості автора `@ncurran` як частина авторизована участь у програмі HackerOne / GitHub Bug Bounty (npm входить до сфери застосування).

Під час встановлення він перевіряє власне середовище виконання … змінна-середовища

лише ключові назви … перевіряє, чи добре відомий кінцеві точки метаданих хмари він має досяжний … Він повідомляє лише коди стану, тривалість відповідей та хеші — ніколи будь-які облікові дані, значення токена чи дані третіх сторін. Він не виконує жодних наполегливість, відсутність бічних рухів та відсутність руйнівних дій.

Три твердження в цьому тексті суперечать наданому коду. У файлі README зазначено «без збереження», але маячок Windows записує ключ підвищення прав на основі реєстру. У ньому зазначено «ніколи не зберігаються жодні облікові дані, значення токена», але шлях Windows виконує довільні команди, отримані як SYSTEM, який не обмежує те, що зчитується або повертається. Він навіть називає пакет — @ncurran/sandbox-recon-880538 — це не той, у якому він постачається, що вказує на те, що README є шаблоном повторного використання, а не описом артефакту, що знаходиться в наявності. Застереження щодо згоди в пакеті, який жертва ніколи не погоджувалася встановлювати, не надає згоди. Класифікація цього випадку як зловмисного незалежно від формулювання. Застереження також має більш тиху ціль: автоматизований крок сортування, який зчитує текст пакета на предмет заспокійливих сигналів — «доброякісний», «авторизований», названа програма, контактна електронна адреса — може бути підштовхнуто до безпечного вердикту прозою, якій суперечить корисне навантаження. Урок актуальний як для людей, так і для машинних рецензентів: зважуйте поведінку під час встановлення, а не самоопис README.

Хронологія

Усі пакети з’явилися протягом 24-годинного вікна. Першими з’явилися чотири пакети з однією версією, а потім два пакети, які перевидавалися кожні 30–60 хвилин.

Дата (UTC) Event
2026-06-15 18:32 Перший опублікований пакет — npm:pkg-telemetry-r4f9@1.0.0
2026-06-15 19:50 npm:runtime-metrics-w7k2@1.0.0 опублікований
2026-06-15 20:14 npm:build-tracker-n5p1@1.0.0 опублікований
2026-06-15 20:35 npm:npm-sandbox-ping-r9t2@1.0.0 опублікований
2026-06-15 21:09–22:42 npm:event-metrics-q3x7 опублікований 1.0.0 → 1.0.8 (9 версій)
2026-06-15 23:40 → 2026-06-16 04:40 npm:metrics-pipeline-d8k2 опублікований 1.0.0 → 1.0.10 (11 версій)
2026-06-16 Кластер ідентифіковано та класифіковано як шкідливий; кілька архівів вже повертають код 404 у реєстрі (триває).

Кампанія нещодавно розпочалася, і видалення все ще триває: на момент аналізу деякі версії були вирішені в реєстрі, а інші – ні. Вважайте всі 26 версій скомпрометованими.

Показники компромісу

Пакети

Екосистема пакет версії Статус
нмм metrics-pipeline-d8k2 1.0.0 – 1.0.10 malicious
нмм event-metrics-q3x7 1.0.0 – 1.0.8 malicious
нмм runtime-metrics-w7k2 1.0.0 malicious
нмм build-tracker-n5p1 1.0.0 malicious
нмм npm-sandbox-ping-r9t2 1.0.0 malicious
нмм pkg-telemetry-r4f9 1.0.0 malicious

Мережа

тип індикатор примітки
IP 173.255.233[.]239 Колектор C2; POST-реконструкція для Linux та резервний варіант для Windows: 443
сфера diameter-coins-limitations-parents.trycloudflare[.]com Канал команд Windows через тунель Cloudflare, :443
Шлях URI /c2/poll, /c2/out, /c2/eof Команда Windows опитування / вивід / закриття
IP 169.254.170[.]2 Кінцева точка метаданих екземпляра AWS ECS, досліджена з інсталяційного перехоплювача

Поведінкові

Сигнал Опис
Встановлювати hooks preinstall та postinstall обидва біжать node run.js
Відправлення платформи run.js пробіжки beacon_linux.js на Linux, beacon34.js / beacon18.js на Windows
Розвідка Linux Перераховує імена ключів env-var, читає /proc, чеки docker.sock, біжить hostname / whoami, зонди IMDS
Висота вікон ms-settings DelegateExecute обхід UAC реєстру; PowerShell -ExecutionPolicy Bypass + Invoke-Expressionпрацює як SYSTEM
Маскуватися У файлі README стверджується, що це «доброякісне», «авторизоване» дослідження та «відсутність стійкості»; посилання містить назву пакета, в якому він не постачається.

Атрибуція та спостережувана поведінка

Ми описуємо видавця лише за його сигналами та не стверджуємо особу жодної особи, яка стоїть за цим обліковим записом.

  • Каталог сигналів. Усі шість пакетів були опубліковані одним і тим самим обліковим записом npm, npmresearch8847, із зазначеною електронною адресою npmresearch8847@web-library.net (електронна пошта та SCM (перевірка відсутня; ми не підтвердили право власності). Файли README публікуються під @ncurran обсяг та надати контактну інформацію nikolas@curran.tech та run.js точки в сховищі github.com/ncurran/npm-sandbox-research`. Шість пакетів мають однаковий run.js диспетчер, звичайний beacon_linux.js етап реконструкції та єдиний колекторний хост 173.255.233[.]239`. Схема іменування є послідовною: загальна основа, що звучить як CI (показники, телеметрія, трекер збірки, sandbox-ping) плюс короткий випадковий суфікс.
  • Впевненість. Шість пакетів, схоже, є однією кампанією, враховуючи спільний диспетчер, етап розвідки та хост C2. Формулювання «санкціоноване дослідження» виглядає однаковим у всіх шести файлах README. Нам не вдалося підтвердити, що будь-яка програма винагороди за виявлені помилки дозволила цю діяльність, а заяви у відмові від відповідальності не відповідають наданому коду.
  • Спостережувана здатність. Корисне навантаженняcisчотири класи можливостей: виконання коду install-hook на обох попереднє встановлення та після встановлення; розвідка хоста та середовища неперевіреної інтеграції з виходом до зовнішнього колектора; зондування доступності метаданих хмарних екземплярів з контексту встановлення; та, у Windows, локальне підвищення привілеїв, виконання як SYSTEM, а також цикл виконання команд через зовнішній канал. Цикл команд Windows — це можливість дистанційного керування: він запитує інструкції та повертає їхній вивід.

Вплив, тенденції та що повинні робити захисники

Impact

Найбільший ризик спостерігається в автоматизованих середовищах збірки. Інсталяція npm у CI запускає життєвий цикл. hooks з будь-якою ідентифікацією, яку має раннер; на хмарному раннері ця ідентифікатор часто включає досяжну кінцеву точку метаданих та облікові дані ролі. Адреса, яку перевіряє маяк Linux, 169.254.170[.]2, є кінцевою точкою метаданих завдань AWS ECS: завдання, яке може до нього дістатися, зазвичай також може отримати тимчасові облікові дані своєї ролі завдання з того ж локального сервісу посилання. Перевірка досяжності зсередини скрипта встановлення – це крок, який передує отриманню цих облікових даних, тому будь-який виконавець, який виконав перехоплювач і зміг дістатися до цієї кінцевої точки, слід розглядати як такий, що отримав доступ до своєї ролі завдання. На хості розробника або збірки Windows корисне навантаження запитує підвищення прав і відкриває канал команд, що розширює доступ від єдиного профілю та виходу до інтерактивного дистанційного керування.

Нам не вдалося отримати достовірні дані про кількість завантажень шкідливих версій перед їх видаленням, тому ми не оцінюємо кількість жертв. Швидка перепублікація двох пакетів — одинадцяти та дев'яти версій за кілька годин — забезпечила доступ до свіжих артефактів для інсталяторів та програм для вирішення проблем, поки старі версії видалялися.

Нові закономірності

Цей кластер є прикладом використання ярлика як прикриття. «Авторизоване дослідження», «винагорода за помилки» та «тестування в пісочниці» все частіше прив’язуються до пакетів, скрипти встановлення яких роблять більше, ніж просто профілювання хоста. Таке формулювання використовує вагання рецензента діяти проти чогось, що оголошує себе санкціонованим. Це поєднується з другою відомою тактикою: назви пакетів, розроблені так, щоб виглядати як внутрішні інструменти нерозривної інтеграції, щоб вони не промайнули на дереві залежностей. Саме це поєднання робить цей шаблон вартим уваги — назва, яка читається як «інфраструктурна інфраструктура», загорнута в прозу, яка читається як санкціонований тест, перед гачком встановлення, який ескалює в одній операційній системі та перевіряє хмарні облікові дані в іншій. Ні застереження, ні незрозуміла назва не змінюють те, що робить код під час встановлення, і процес сортування, який зважує будь-який з них як пом’якшувальний доказ, призведе до неправильного вердикту.

Що мають робити захисники

  • Шукати шість назв пакетів у файлах блокування та журналах встановлення; будь-який збіг розглядати як інцидент, а не як попередження.
  • Блокування та сповіщення про вихідний трафік до 173.255.233[.]239 і *.trycloudflare[.]com хости від побудови інфраструктури.
  • Пошук HTTP-запитів під час встановлення до адрес метаданих екземплярів (169.254.170.2, 169.254.169.254), що походять від менеджерів пакетів у CI.
  • Змінити облікові дані та токени хмарних ролей, доступні для виконавця, на якому інстальовано уражену версію.
  • Аудит попереднє встановлення/після встановлення скрипти у вашому набір залежностей; гачок життєвого циклу, який запускає другий файл скрипта, заслуговує на прочитання.
  • На кінцевих точках Windows шукайте нові ДелегуватиВиконати значення, написані під ms-налаштування ключ обробника оболонки — примітив підвищення рівня, який використовує це корисне навантаження, та надійний сигнал, незалежний від назви пакета.
  • Закріпити та переглянути файли блокування, а також вимкнути скрипти встановлення (npm install –ignore-scripts) у CI, де ваша збірка їх не вимагає.
  • Розглядайте застереження щодо «авторизованих досліджень» або «нешкідливих» застережень у скрипті встановлення як ненадійний текст, а не як підставу для дозволу скрипта.

Пакет, що сповіщає про добрі наміри прозою та проханнями SYSTEM у коді слід оцінювати за кодом.

інструменти-для-аналізу-складу-програмного-засобу-sca
Визначте пріоритети, усуньте та захистіть ризики, пов'язані з програмним забезпеченням
Отримайте свій безкоштовний обліковий запис.
Не потрібна кредитна картка.

Забезпечте розробку та доставку програмного забезпечення

з пакетом продуктів Xygeni