Активна атака на ланцюг постачання компрометує пакет node-ipc
Detection stack
- AIDR
- Alert
- ETL
- Query
Резюме
Дослідники Socket виявили компрометацію ланцюга постачання, що впливає на 84 пакунки npm, опубліковані під @tanstack простором імен. Зловмисні оновлення ввели сильно заплутаний файл JavaScript, призначений для викрадення секретів, пов’язаних із CI, з GitHub Actions, AWS, HashiCorp Vault та середовищ Kubernetes, а потім використовували ці облікові дані для перевидання себе в npm. Завантаження також впроваджувало гачки збереження стійкості в каталогах конфігурації Claude Code і VS Code. Дослідники пов’язали цю активність з ширшою кампанією шкідливого програмного забезпечення Mini Shai-Hulud у ланцюзі постачання.
Розслідування
Розслідування виявило новий доданий файл, router_init.js, який використовував обертання масиву стрічок, додатковий XOR і шар декодування Base64, а також демонизацію для приховування своєї поведінки. Шкідливе ПЗ цілкувало змінні середовища, служби метаданих хмар і точки доступу API, пов’язані з GitHub, AWS, Vault та Kubernetes, для збору облікових даних. Воно поширювалося шляхом зловживання федерацією OIDC GitHub Actions для отримання токенів публікації npm і впровадило зловмисне optionalDependency on @tanstack/setup. Трафік ексфільтрації прямував через мережу децентралізованих повідомлень Session.
Мітигація
Організації, що постраждали від кампанії, повинні перевірити хеші для всіх @tanstack/* вмісту пакунків, перезавантажити всі облікові дані CI та хмарних облікових записів, анулювати відкриті дозволи федерації OIDC і видалити неавторизовані файли з .claude and .vscode каталогів. Блокування вихідного трафіку на filev2.getsession.org та примусове забезпечення цілісності для пакунків npm можуть ще більше зменшити ймовірність виникнення загрози. Робочі процеси GitHub Actions також слід посилити шляхом фіксації дій третіх сторін та мінімізації id-token дозволів.
Відповідь
Захисники повинні шукати наявність router_init.js та пов’язані імена файлів, спостерігати за підозрілими процесами, що запускаються, та попереджувати про доступ до визначених кінцевих точок метаданих хмар. Будь-які скомпрометовані пакунки слід ізолювати, зловмисні гачки видалити, а всі розкриті облікові дані негайно перезавантажити. Команди безпеки також повинні провести повний огляд активності GitHub Actions для несанкціонованого використання токенів і перевірити походження всіх опублікованих пакунків npm.
"граф TB %% Визначення класів classDef technique fill:#e6f7ff classDef operator fill:#ffcc66 %% Вузли, які представляють кожну техніку ATT&CK a_initial_access["<b>Техніка</b> – <b>T1195.001 Компрометація в ланцюзі постачання</b><br/><b>Опис</b>: Супротивник компрометує ланцюг постачання програмного забезпечення (наприклад, зловмисний пакет npm), щоб отримати початковий доступ."] class a_initial_access technique b_execution["<b>Техніка</b> – <b>T1129 Спільні модулі</b><br/><b>Опис</b>: Зловмисний спільний модуль (router_init.js) запускається автоматично під час встановлення пакету."] class b_execution technique c_persistence["<b>Техніка</b> – <b>T1176.002 Розширення IDE</b><br/><b>Опис</b>: Записує приховані файли (.claude, .vscode) та гачки для збереження стійкості через скомпрометовані розширення IDE."] class c_persistence technique d_def_evasion["<b>Техніка</b> – <b>T1027 Маскування файлів або інформації</b><br/><b>Опис</b>: Завантаження маскується для уникнення виявлення.<br/><b>Техніка</b> – <b>T1140 Декодування/Демаскування файлів або інформації</b><br/><b>Опис</b>: Рутинa перевірки мобілізує код перед виконанням."] class d_def_evasion technique e_cred_access["<b>Техніка</b> – <b>T1552.005 Незахищені облікові дані</b><br/><b>Опис</b>: Читає API метаданих хмарної екземпляру для облікових даних.<br/><b>Техніка</b> – <b>T1555.006 Управління секретами в хмарі</b><br/><b>Опис</b>: Отримує таємниці з хмарних сховищ секретів."] class e_cred_access technique f_account_disc["<b>Техніка</b> – <b>T1087.004 Хмарний рахунок</b><br/><b>Опис</b>: Перераховує інформацію про хмарний рахунок для ідентифікації ресурсів та привілеїв."] class f_account_disc technique g_cred_use["<b>Техніка</b> – <b>T1078 Дійсні облікові записи</b><br/><b>Опис</b>: Використовує зібраний OIDC токен як дійсний обліковий запис для публікації подальших зловмисних пакунків."] class g_cred_use technique h_propagation["<b>Техніка</b> – <b>T1195.001 Компрометація в ланцюзі постачання</b><br/><b>Опис</b>: Повторно використовує зловмисний пакет через optionalDependencies та npm prepare hook для розповсюдження на нижчі проєкти."] class h_propagation technique i_command_exec["<b>Техніка</b> – <b>T1059.009 Виклики хмарних API</b><br/><b>Опис</b>: Виконує команди, викликаючи API GitHub, AWS та Vault безпосередньо з компрометованого середовища."] class i_command_exec technique j_exfiltration["<b>Техніка</b> – <b>T1041 Ексфільтрація через канал керування</b><br/><b>Опис</b>: Ексфільтрує дані через канал сеансу в режимі peer-to-peer, встановлений між компрометованими вузлами."] class j_exfiltration technique k_remote_services["<b>Техніка</b> – <b>T1021.007 Хмарні послуги</b><br/><b>Опис</b>: Використовує коміти GitHub GraphQL як віддалену службу для збереження командування та управління."] class k_remote_services technique %% Послідовні з’єднання потоку a_initial_access –>|призводить до| b_execution b_execution –>|призводить до| c_persistence c_persistence –>|призводить до| d_def_evasion d_def_evasion –>|призводить до| e_cred_access e_cred_access –>|призводить до| f_account_disc f_account_disc –>|призводить до| g_cred_use g_cred_use –>|призводить до| h_propagation h_propagation –>|призводить до| i_command_exec i_command_exec –>|призводить до| j_exfiltration j_exfiltration –>|призводить до| k_remote_services "
Потік атаки
Виявлення
Підозріле завантаження виконуваного файлу (через проксі)
Перегляд
Можливе створення файлу конфігурації автоматичних завдань Vscode в незвичному каталозі [MACOS] (через file_event)
Перегляд
Можливе створення файлу конфігурації автоматичних завдань Vscode в незвичному каталозі [LINUX] (через file_event)
Перегляд
IOCs (HashSha256) для виявлення: Активна компрометація в ланцюзі постачання: скомпрометовано пакет node-ipc
Перегляд
IOCs (HashSha1) для виявлення: Активна компрометація в ланцюзі постачання: скомпрометовано пакет node-ipc
Перегляд
IOCs (HashMd5) для виявлення: Активна компрометація в ланцюзі постачання: скомпрометовано пакет node-ipc
Перегляд
Викрадення облікових даних AWS через IMDSv2 та вибрану метаданих ECS [AWS Cloudtrail]
Перегляд
Симуляція виконання
Передумова: Перевірка телеметрії та базової лінії повинна бути пройдена.
Мотиви: Цей розділ детально описує точне виконання техніки супротивника (TTP), розробленої для виклику правила виявлення. Команди та наратив повинні безпосередньо відображати ідентифіковані TTP і мати на меті генерування точної телеметрії, очікуваної логікою виявлення. Абстрактні чи незв’язані приклади приведуть до неправильного діагнозу.
-
Наратив атаки та команди:
- Отримайте токен сесії IMDSv2 – атакуючий відправляє
PUTзапит до кінцевої точки токена з TTL 21600 секунд. - Використовуйте токен для запиту імені ролі IAM відкрите в
/latest/meta-data/iam/security-credentials/. - Отримайте тимчасові облікові дані IAM (AccessKeyId, SecretAccessKey, Token) для профіля екземпляру.
- Збережіть облікові дані локально для подальшого використання (наприклад, для виклику API AWS, повороту чи проведення атак методом “розпилення паролів”).
Ці дії генерують HTTP-трафік до точних URI, вказаних в правилі Sigma, які, коли фіксуються журналом потоку VPC, повинні відповідати умовам виявлення.
- Отримайте токен сесії IMDSv2 – атакуючий відправляє
-
Скрипт для регресійного тестування:
#!/usr/bin/env bash # ------------------------------------------------- # Скрипт: aws_imds_credential_harvest.sh # Мета: Симулювати викрадання облікових даних через метадані IMDSv2 / ECS # ------------------------------------------------- set -euo pipefail # 1. Запит токена IMDSv2 TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -s) if [[ -z "$TOKEN" ]]; then echo "[!] Не вдалося отримати токен IMDSv2" exit 1 fi echo "[*] Отримано токен IMDSv2" # 2. Отримайте ім'я ролі IAM, пов'язане з екземпляром ROLE_NAME=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/iam/security-credentials/) if [[ -z "$ROLE_NAME" ]]; then echo "[!] Невдалося отримати ім'я ролі IAM" exit 1 fi echo "[*] Роль IAM екземпляра: $ROLE_NAME" # 3. Отримати тимчасові облікові дані для ролі CREDS_JSON=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME) echo "[*] Отримані облікові дані:" echo "$CREDS_JSON" | jq . # 4. (Опційно) Експортуватися як змінні середовища для подальшого використання AWS CLI export AWS_ACCESS_KEY_ID=$(echo "$CREDS_JSON" | jq -r .AccessKeyId) export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS_JSON" | jq -r .SecretAccessKey) export AWS_SESSION_TOKEN=$(echo "$CREDS_JSON" | jq -r .Token) echo "[*] Облікові дані експортовано до середовища (лише для демонстрації)." # ------------------------------------------------- # Кінець скрипту # ------------------------------------------------- -
Команди для очищення:
# Видалити змінні середовища, які містять тимчасові облікові дані unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN # Видалити всі тимчасові файли (в цьому скрипті не створюється) echo "[*] Очищення завершено."