Атака на ланцюг постачання Miasma поширюється через черв’як Phantom Gyp
Detection stack
- AIDR
- Alert
- ETL
- Query
Резюме
Нова версія черв’яка Miasma поширюється через екосистему npm, зловживаючи шкідливим binding.gyp файлом, що запускає виконання коду під час npm install. Цей метод обходить багато традиційних перевірок скриптів, завантажує альтернативну середу виконання Bun, краде облікові дані CI/CD та хмари і надсилає зібрані дані на обліковий запис GitHub, що виступає як сховище. Понад 57 пакетів було скомпрометовано під час бурхливої кампанії, що розгорнулась менш ніж за дві години 3 червня 2026 року. Черв’як також встановлює бекдори в конфігураційні файли AI кодасистента.
Розслідування
Дослідники відтворили інцидент в підтвердженому GitHub Actions runner і захопили повний процес виконання, мережевий трафік і артефакти коду, задіяні в атаці. Їх аналіз виявив техніку Phantom Gyp, чотириетапний ланцюг зашифрованих корисних навантажень і використання Bun для уникнення виявлення, зосередженого лише на поведінці Node.js. Крадіжка облікових даних здійснювалася шляхом читання пам’яті запуску та запитів до кінцевих точок метаданих хмарного інстанса. Вилучення потім відбувалося через запити до автентифікованого GitHub API на шкідливий акаунт, який динамічно створював репозиторії для збереження викрадених даних.
Пом’якшення
Захисники повинні зменшити ризик шляхом блокування етапів нативного складання, вимкнення node-gyp де це можливо, або ігнорування скриптів встановлення в середовищах з високим ризиком. Вікна зниження активності реєстру та перевірка підписів SLSA можуть також допомогти обмежити фальсифікацію пакетів. Команди безпеки повинні стежити за несподіваними завантаженнями Bun, занадто великими файлами кореневого index.js і створенням нових репозиторіїв GitHub за допомогою токенів, виданих CI. Будь-які виявлені токени чи облікові дані хмари повинні бути негайно змінені.
Відповідь
Організації повинні виявляти binding.gyp файли, які містять такі шаблони, як <!(node index.js ...), сигналізувати про завантаження середовища виконання Bun і як тільки підтверджена шкідлива активність, зупиняти уражений робочий процес. Репозиторії повинні бути проскановані на ін’єкцію конфігураційних файлів AI асистента і швидко очищені. Усі викрадені токени повинні бути відкликані та змінені, повноваження CI/CD перевірені, а також розпочате повне розслідування інциденту для визначення обсягу викритих облікових даних.
Потік атаки
Ми ще оновлюємо цю частину. Підпишіться, щоб отримати сповіщення
Повідомити меніВиявлення
Віддалене завантаження/вивантаження файлів через стандартні інструменти (через cmdline)
Переглянути
Скрипт для Linux створено у тимчасових папках (через file_event)
Переглянути
Схований файл був створений на Linux-хості (через file_event)
Переглянути
IOCs (HashSha256), щоб виявити: Атака на постачальний ланцюг Miasma npm: самопоширювальний черв’як за допомогою Phantom Gyp
Переглянути
IOCs (HashMd5), щоб виявити: Атака на постачальний ланцюг Miasma npm: самопоширювальний черв’як за допомогою Phantom Gyp
Переглянути
Виявлення атаки на постачальний ланцюг Miasma npm [Мережеві індикатори]
Переглянути
Виявлення атаки на постачальний ланцюг Miasma npm за допомогою техніки Phantom Gyp [Створення процесу в Linux]
Переглянути
Виконання симуляції
Передумова: Перевірка Телеметрії та базової лінії повинна бути пройдена.
Підстава: Цей розділ детально описує точний хід техніки (TTP) нападника, призначеної для активації правила виявлення. Команди та наратив мусіть безпосередньо відображати ідентифіковані TTPs і прагнути до генерації точної телеметрії, яку очікує логіка виявлення.
-
Наратив і команди атаки:
Зловмисник компрометує пакет npm з відкритим кодом, додаючи шкідливийbinding.gyp. Коли розробник запускаєnpm install, процес збірки пакету викликаєnode-gyp rebuild. Всередині створеного скрипту побудови зловмисник:- Завантажує середовище виконання Bun (підписаний бінарний файл) за допомогою
curlв тимчасову директорію (/tmp/b-<rand>/). - Підвищує права викликом
sudo python3для розпакування zip і розміщення бінарного файлу у/usr/local/bin. - Збирає токен розробника на GitHub використовуючи
gh auth token. - Виконує шкідливе навантаження (
bun run /tmp/p1764ajw42rg.js) яке вилучає дані.
Кожен крок з’являється в логах створення процесу, задовольняючи
списокSigma rule’s. - Завантажує середовище виконання Bun (підписаний бінарний файл) за допомогою
-
Сценарій регресійного тесту: Наступний Bash скрипт відтворює точну послідовність команд в контрольованому лабораторному середовищі.
# miasma_phantom_gyp_simulation.sh set -euo pipefail # 1. Підготувати підроблений пакет npm зі шкідливим binding.gyp PKG_DIR=$(mktemp -d /tmp/miasma_pkg.XXXX) cd "$PKG_DIR" npm init -y >/dev/null 2>&1 cat > binding.gyp <<'EOF' { "targets": [ { "target_name": "evil", "sources": [ "evil.c" ] } ] } EOF echo "int main(){return 0;}" > evil.c # Встановити node‑gyp локально npm install node-gyp >/dev/null 2>&1 # 2. Запустити node‑gyp rebuild (перший індикатор) ./node_modules/.bin/node-gyp rebuild # 3. Завантажити середовище виконання Bun (другий індикатор) TMPDIR=$(mktemp -d /tmp/b-XXXXXX) curl -sSL "https://github.com/oven-sh/bun/releases/download/bun-v1.3.13/bun-linux-x64-baseline.zip" -o "$TMPDIR/bun.zip" # 4. Підвищити права за допомогою sudo python3 щоб розпакувати (третій індикатор) sudo python3 - <<PYTHON import zipfile, sys, os zip_path = os.getenv('TMPDIR') + '/bun.zip' with zipfile.ZipFile(zip_path, 'r') as z: z.extractall(os.getenv('TMPDIR')) PYTHON # 5. Отримати токен GitHub (четвертий індикатор) # Зауваження: Для цього потрібно встановити GitHub CLI і пройти попередню аутентифікацію. gh auth token > "$TMPDIR/gh_token.txt" # 6. Виконати шкідливе навантаження за допомогою Bun (п'ятий індикатор) # Створити підроблене JS навантаження echo "console.log('exfiltrated');" > "$TMPDIR/p1764ajw42rg.js" "$TMPDIR/bun" run "$TMPDIR/p1764ajw42rg.js" echo "Симуляція завершена. Перевірте ваш SIEM на згенеровані тривоги." -
Команди очищення: Видалити тимчасові артефакти і реверсувати артефакти підвищення привілеїв.
# cleanup_miasma_simulation.sh set -euo pipefail # Видалити тимчасові директорії rm -rf "$PKG_DIR" "$TMPDIR" # Опціонально видалити встановлений бінарний файл Bun з /usr/local/bin, якщо його там розміщено if command -v bun >/dev/null; then sudo rm -f "$(command -v bun)" fi # Очистити будь-які захоплені токени GitHub shred -u "$HOME/.config/gh/hosts.yml" 2>/dev/null || true echo "Очищення завершено."