
Обнаружение угроз цепочки поставок npm/PyPI в реальном времени. Анализ поведенческих цепочек, сканирование AST, фиды IOC и комплексный механизм оценки.
Установка | Использование | Возможности | VS Code | CI/CD
Атаки на цепочки поставок npm и PyPI взрывоопасно растут. Shai-Hulud скомпрометировал 25 000+ репозиториев в 2025 году. Существующие инструменты обнаруживают угрозы, но не помогают реагировать.
MUAD'DIB объединяет 22 параллельных сканера (277 правил обнаружения), движок деобфускации, межмодульный анализ потоков данных, комплексную оценку (21 комплексное правило) и песочницу gVisor/Docker для обнаружения известных угроз и подозрительных паттернов поведения в пакетах npm и PyPI. Классификатор XGBoost существует в кодовой базе, но в настоящее время неактивен (см. Оценка).
MUAD'DIB — это бесплатный, открытый и полностью проверяемый сканер цепочек поставок для npm и PyPI. Он обнаруживает известные угрозы (225 000+ IOC), RCE во время установки, потоки «чтение учётных данных → затем эксфильтрация», обфусцированные полезные нагрузки и другие подозрительные паттерны поведения — локально, без телеметрии.
Распространяется под лицензией AGPL-3.0; коммерческая лицензия доступна для организаций, которым необходимо встраивать его в проприетарный продукт или запускать как закрытый хостинг-сервис (см. Лицензия).
Он намеренно не пытается делать всё — см. Область применения, чтобы узнать, что именно он выявляет, а что нет.
Обнаруживает (npm и PyPI): известные вредоносные пакеты (совпадение имени + SHA256 IOC), typosquatting, RCE во время установки (жизненный цикл preinstall/postinstall, curl | sh, время импорта Python, binding.gyp), чтение учётных данных с последующей сетевой эксфильтрацией (внутри и между файлами), обфусцированные/высокоэнтропийные/загрузчики-заглушки полезные нагрузки, бинарные дропперы (chmod +x + exec/spawn) и признаки антианалитического уклонения.
Не входит в область: атаки только в браузере (DOM/window, без API Node.js), содержимое нативных бинарников/WASM (без анализа бинарников), нулевые неизвестные пакеты (поток IOC реактивен) и экосистемы, отличные от npm/PyPI (RubyGems, Maven, Go). Целенаправленная антипесочница и многоступенчатые удалённые полезные нагрузки являются известными рисками ложных отрицаний. Полная информация: Модель угроз.
Нет телеметрии. Ваш код и результаты сканирования никогда не покидают ваш компьютер — MUAD'DIB только загружает разведывательные фиды угроз (muaddib update) и, для оценки, читает публичные метаданные реестра npm. Вебхук-оповещения — по желанию.
npm install -g muaddib-scanner
git clone https://github.com/DNSZLSK/muad-dib
cd muad-dib
npm install
npm link
muaddib scan .
muaddib scan /path/to/project
Сканирует как зависимости npm (package.json, node_modules), так и Python (requirements.txt, setup.py, pyproject.toml).
muaddib
muaddib install <package>
muaddib install lodash axios --save-dev
muaddib install suspicious-pkg --force # Принудительная установка, несмотря на угрозы
Сканирует пакеты на наличие угроз ПЕРЕД установкой. Блокирует известные вредоносные пакеты.
Каждое сканирование отображает оценку риска от 0 до 100:
[SCORE] 58/100 [***********---------] HIGH
muaddib scan . --explain
Показывает ID правила, технику MITRE ATT&CK, ссылки и план реагирования для каждого обнаружения.
muaddib scan . --json > results.json # JSON
muaddib scan . --html report.html # HTML
muaddib scan . --sarif results.sarif # SARIF (GitHub Security)
muaddib scan . --fail-on critical # Ошибка только при CRITICAL
muaddib scan . --fail-on high # Ошибка при HIGH и CRITICAL (по умолчанию)
muaddib scan . --paranoid
Сверхстрогое обнаружение с низким порогом терпимости. Обнаруживает любой сетевой доступ, выполнение подпроцессов, динамическую оценку кода и доступ к конфиденциальным файлам.
muaddib scan . --webhook "https://discord.com/api/webhooks/..."
Строгая фильтрация (v2.1.2): оповещения только при совпадении IOC, угрозах, подтверждённых песочницей, или эксфильтрации canary-токенов. Приоритетная триаж (v2.10.21): P1 (красный, IOC/песочница/canary), P2 (оранжевый, высокие оценки/комплексные), P3 (жёлтый, остальное).
muaddib scan . --temporal-full # Все 4 временные характеристики
muaddib scan . --temporal # Обнаружение внезапных скриптов жизненного цикла
muaddib scan . --temporal-ast # AST-различие между версиями
muaddib scan . --temporal-publish # Аномалия частоты публикаций
muaddib scan . --temporal-maintainer # Обнаружение смены мейнтейнера
Обнаруживает атаки на цепочки поставок до того, как они появятся в базах IOC, путём анализа изменений между версиями пакетов. Подробнее см. в Методология оценки.
muaddib sandbox <package-name>
muaddib sandbox <package-name> --strict
Динамический анализ в изолированном контейнере Docker: strace, tcpdump, diff файловой системы, canary-токены, окружение с учётом CI и monkey-patching preload для обнаружения бомб замедленного действия (многократный запуск со смещением [0h, 72h, 7d]).
muaddib watch . # Мониторинг в реальном времени
muaddib daemon # Режим демона (автосканирование npm install)
muaddib update # Обновление IOC (быстро, ~5 с)
muaddib scrape # Полное обновление IOC (~5 мин)
muaddib diff HEAD~1 # Сравнение угроз с предыдущим коммитом
muaddib init-hooks # Pre-commit хуки (husky/pre-commit/git)
muaddib scan . --breakdown # Разложение оценки с объяснением
muaddib replay # Валидация с эталонными данными (90/94 TPR@3, v2.11.48)
Все правила (272 RULES + 5 PARANOID) сопоставлены с техниками MITRE ATT&CK. Полный справочник правил см. в SECURITY.md.
Расширение для VS Code автоматически сканирует ваши npm-проекты.
code --install-extension dnszlsk.muaddib-vscode
MUAD'DIB: Scan Project — Сканировать весь проектMUAD'DIB: Scan Current File — Сканировать текущий файлmuaddib.autoScan, muaddib.webhookUrl, muaddib.failLevelПолная документация: vscode-extension/README.md.
name: Security Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
permissions:
security-events: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: DNSZLSK/muad-dib@v1
with:
path: '.'
fail-on: 'high'
sarif: 'results.sarif'
muaddib init-hooks # Автоопределение (husky/pre-commit/git)
muaddib init-hooks --type husky # Принудительно husky
muaddib init-hooks --mode diff # Блокировать только НОВЫЕ угрозы
С фреймворком pre-commit:
repos:
- repo: https://github.com/DNSZLSK/muad-dib
rev: v2.11.139
hooks:
- id: muaddib-scan
Последнее измерение v2.11.48 (2026-05-26), только правила (ML-классификатор неактивен — см. ниже). Эталон: 94 реальные атаки в рамках области + 200 случайных npm + 124 PyPI + 107 adversarial/holdout.
ML-классификатор: неактивен. Модель XGBoost находится в src/ml/, но никогда не подключается к muaddib scan и работает в режиме LOG-ONLY в мониторе с 2026-04-08 (обученная модель разрушена, ожидается переобучение). Все приведённые выше числа относятся только к правилам.
Полный протокол, история по трекам, оговорка о PyPI cap-35, операционное покрытие (в терминах GHSA) и методика переобучения ML: Методология оценки.
Редактируйте YAML-файлы в iocs/:
- id: NEW-MALWARE-001
name: "malicious-package"
version: "*"
severity: critical
confidence: high
source: community
description: "Описание угрозы"
references:
- https://example.com/article
mitre: T1195.002
git clone https://github.com/DNSZLSK/muad-dib
cd muad-dib
npm install
npm test
MUAD'DIB распространяется под лицензией GNU Affero General Public License v3.0 only (AGPL-3.0-only) — см. LICENSE и NOTICE.
Вы можете свободно использовать, изучать, модифицировать и распространять его, включая передачу по сети, при условии, что производные работы и модификации, развёрнутые в сети, распространяются под той же лицензией.
Коммерческое лицензирование: для встраивания MUAD'DIB в проприетарный/закрытый продукт или предоставления его как хостинг-сервиса без обязательств раскрытия исходного кода, предусмотренных AGPL, доступна отдельная коммерческая лицензия. Создайте issue или свяжитесь с автором (DNSZLSK).
Copyright (C) 2026 DNSZLSK.
Пряность должна течь. Черви должны умереть.
| Сканер | Обнаружение |
|---|
| AST-парсинг (acorn) | eval, Function, кража учётных данных, бинарные дропперы, перехват прототипов |
| Сопоставление с образцом | Команды оболочки, реверс-шеллы, «мёртвый переключатель» |
| Анализ потоков данных | Чтение учётных данных + отправка по сети (внутри файла и между файлами) |
| Обнаружение обфускации | Паттерны обфускации JS (пропуск .min.js) |
| Деобфускация-предобработка | Конкатенация строк, charcode, base64, hex-массив, распространение констант |
| Межмодульный поток данных | Распространение заражения между файлами (цепочки до 3 шагов, методы классов) |
| Согласованность намерений | Парное связывание «источник-приёмник» внутри файла (учётные данные + eval/сеть) |
| Typosquatting | npm + PyPI (расстояние Левенштейна) |
| Сканер Python | requirements.txt, setup.py, pyproject.toml, 14K+ PyPI IOC |
| Энтропия Шеннона | Строки с высокой энтропией (мин. 5,5 бит + 50 символов) |
| Сканер AI-конфигураций | Инъекция в .cursorrules, CLAUDE.md, copilot-instructions.md |
| Пакет/Зависимости | Скрипты жизненного цикла, сопоставление IOC (225K+ пакетов) |
| GitHub Actions | Обнаружение бэкдора Shai-Hulud |
| Хэш-сканер | Известные вредоносные хэши файлов |
| IOC-строки (intel-triage P1.1) | Сопоставление строк в стиле YARA (Axios 2026, TeamPCP, GlassWorm, CanisterSprawl) |
| Антифорензика AST (intel-triage P1.2) | Комплекс: цикл XOR + самоудаление + ложная запись (csec autodelete) |
| Пакет-заглушка (intel-triage P1.3) | Маленький основной файл + внешняя зависимость URL + хук жизненного цикла (цепочка ltidi) |
| Монорепозиторий-сканер | Обнаружение Lerna/pnpm-workspace/turbo (исправление Sprint 1 audit MR-C2) |
| Trusted-Dep-Diff (по желанию) | Дифф с доверенными tarball-пакетами из реестра (v2.10.x) |
| Python Source (PYSRC) | Паттерны RCE во время импорта/установки в __init__.py / setup.py (v2.11.41 — закрывает пробел PyPI TrapDoor) |
| Python AST (PYAST) | Tree-sitter-Python AST с детекторами, чувствительными к заражению (v2.11.42+) |
| Anti-Scanner Injection (ASI) | Текст промпт-инъекции в комментариях/строках, принуждающий LLM-ревьювера к чистому вердикту или пропуску обфусцированной полезной нагрузки (ASI-001..004, кампания Hades 2026-06) |
| Кампания | Статус |
|---|
| GlassWorm (2026, 433+ пакетов) | Обнаружена |
| Shai-Hulud v1/v2/v3 (2025) | Обнаружена |
| event-stream (2018) | Обнаружена |
| eslint-scope (2018) | Обнаружена |
| Protestware (node-ipc, colors, faker) | Обнаружена |
| Typosquats (crossenv, mongose, babelcli) | Обнаружена |
| Входной параметр | Описание | По умолчанию |
|---|
path | Путь для сканирования | . |
fail-on | Минимальная критичность для отказа | high |
sarif | Путь к выходному файлу SARIF | |
paranoid | Сверхстрогое обнаружение | false |
| Показатель | Результат |
|---|
| Доля обнаружения (TPR@3) | 95.74% (90/94) |
| Доля предупреждений (TPR@20) | 88.30% (83/94) |
| FPR — подобранные npm (548) | 1.10% (6/545) |
| FPR — случайные npm (200) | 2.50% (5/200) |
| FPR — PyPI (132) | 9.68% (12/124) |
| ADR — adversarial + holdout | 96.26% (103/107) |
| Wild TPR (Datadog 17K) | 92.8% (13,538/14,587) |