
Сканер IOC для агентских инструментов ИИ для кодирования — обнаруживает Mini Shai-Hulud, Gemini CLI RCE, Cursor CVE-2026-26268 и DPRK PromptMink.
Сканер IOC для агентных инструментов ИИ-кодирования — обнаруживает Mini Shai-Hulud, Gemini CLI RCE, Cursor CVE-2026-26268 и DPRK PromptMink.
Набор для обнаружения компрометации агентных помощников ИИ-кодирования (Claude Code, Gemini CLI, Cursor) и зависимостей, которые они привносят в ваши репозитории. Одиннадцать проверок, охватывающих инъекцию хуков, конфигурации RCE, вредоносные зависимости, бэкдоры в git-хуках и подделку CI-рабочих процессов. Список IOC вынесен во внешний файл — добавление новых индикаторов не требует изменений в коде.
Сопутствующая статья в блоге: When the Tool Fights Back.
scanner/ais.sh)Одиннадцать проверок, каждая с встроенными What: (назначение) и Fix: (устранение), которые выводятся под заголовком раздела, чтобы отчёт был понятен без дополнительных пояснений. Список IOC находится в scanner/iocs.txt (версионируется; можно переопределить с помощью IOC_FILE=/path/to/iocs.txt).
Использование:
bash scanner/ais.sh
# Enter your project folder when prompted
# Custom IOC list:
IOC_FILE=./my-iocs.txt bash scanner/ais.sh
# Custom report path (default: ./agentic-ioc-scan-YYYYMMDD-HHMMSS.log):
REPORT_FILE=/var/log/agentic-scan.log bash scanner/ais.sh
Вывод
agentic-ioc-scan-YYYYMMDD-HHMMSS.log по умолчанию, с удалёнными ANSI-кодами через tee → sed).[CRITICAL] (действовать немедленно), [WARNING] (вероятно, вредоносное — проверить), [REVIEW] (возможно легитимное использование — подтвердить), [OK] (чисто).path:line). Разделы, в которых отображаются номера строк: §1 хук, §2 сигнатура Bun, §3 сигнал обфускации, §5 ключ preinstall, §7 метасимволы Gemini, §8 ссылка на git-hook в AGENTS.md, §9 подозрительное содержимое хука..git/config и соответствующем URL удалённого репозитория, чтобы вы могли сразу перейти к записи, которую нужно удалить.core.hooksPath (§9) сообщает абсолютный путь к .git/config репозитория, чтобы переназначение было проверяемым.Пример результата
[CRITICAL] Repo points to known worm exfil name
Repo: /home/dev/projects/myrepo
Config: /home/dev/projects/myrepo/.git/config:9
URL: https://github.com/dhawaldesai/A-Mini-Shai-Hulud-has-Appeared
[CRITICAL] Malicious hook: /home/dev/projects/myrepo/.claude/settings.json:3
[CRITICAL] Suspicious git post-checkout hook: /home/dev/projects/myrepo/.git/hooks/post-checkout:2
Обновление IOC
Отредактируйте scanner/iocs.txt и измените заголовок # version:. Формат: TYPE|VALUE|NOTES. Поддерживаемые типы:
Не требуется изменений в коде при появлении новых IOC — сканер читает их при запуске и выводит загруженную версию в заголовке.
Зависимости
Обязательные: bash, find, grep, awk, sed, git. Опциональные: jq (предпочтительно для §1 — при отсутствии используется эвристика grep), npm (требуется для проверки глобальных пакетов в §10; раздел пропускается без сообщения, если недоступен).
scanner/pkg_version_check.sh)Дополнение к сканеру IOC. Читает CSV с парами package,version затронутых пакетов (например, канал IOC Mini Shai-Hulud в ~/Downloads/Mini Shai-Hulud - Sheet1.csv — 633 пары npm-пакет/версия) и проверяет, присутствуют ли они в:
package.json, package-lock.json, yarn.lock, pnpm-lock.yaml и установленные node_modules/<pkg>/package.json. Манифесты PyPI (requirements.txt, poetry.lock, Pipfile.lock) также проверяются, если CSV содержит имена без области видимости.gh: поиск по коду среди типов файлов блокировки, затем проверка точной версии через API SBOM графа зависимостей (/repos/{owner}/{repo}/dependency-graph/sbom).Модель серьёзности: точное совпадение pkg@version в файле блокировки, node_modules/ или SBOM → [CRITICAL]. Спецификатор диапазона (^1.2.3, ~1.2.3, >=…), который может включать затронутую версию → [REVIEW]. Совпадение имени пакета без подтверждения версии → [REVIEW]. Вывод направляется в терминал и в ./shai-hulud-pkg-scan-YYYYMMDD-HHMMSS.log (с удалёнными ANSI-кодами), с итоговой сводкой по серьёзности в конце.
Использование:
# Interactive — prompts for project directory
bash scanner/pkg_version_check.sh
# Fully scripted (env-var overrides)
PROJECT_DIR=/path/to/project \
IOC_CSV="$HOME/Downloads/Mini Shai-Hulud - Sheet1.csv" \
REPORT_FILE=/var/log/pkg-scan.log \
bash scanner/pkg_version_check.sh --skip-node-modules
Формат CSV: col1 = имя пакета (поддерживаются имена с областью видимости, например @scope/pkg), col2 = точная затронутая версия. Строка заголовка автоматически обнаруживается и пропускается. Переопределите путь с помощью IOC_CSV=….
Зависимости: bash, find, grep, awk, sed. Опциональные: jq (улучшает точность разбора node_modules/<pkg>/package.json), gh (требуется для этапа GitHub — этап пропускается с понятным сообщением, если отсутствует или не аутентифицирован).
Известные ограничения:
grep, а не на полном синтаксическом анализе — глубокая вложенность или необычное форматирование могут давать ложноотрицательные результаты. Наиболее ценным последующим улучшением был бы разбор на основе jq.[REVIEW].claude-code-policy/)Уровень предотвращения для Claude Code, дополняющий описанный выше уровень обнаружения.
allowManagedHooksOnly).claude/settings.jsoncurl, wget и bun при использовании инструментов агентомУстановка:
# Copy managed settings (cannot be overridden by projects)
cp claude-code-policy/managed-settings.json ~/.claude/managed-settings.json
# Copy the PreToolUse hook
mkdir -p ~/.claude/hooks
cp claude-code-policy/hooks/block_shai_hulud.py ~/.claude/hooks/
chmod +x ~/.claude/hooks/block_shai_hulud.py
npm ls -g).pre-receive для отклонения push-операций, добавляющих файлы .claude/settings.json, .vscode/tasks.json или .gemini/ от авторов, не входящих в список разрешённых.Принимаются Issues и PR — особенно для новых заявок IOC (добавить в scanner/iocs.txt и обновить заголовок версии), дополнительных платформо-специфичных корней сканирования и шаблонов обнаружения для смежных агентных инструментов (Continue, Cody, Codex CLI, Aider).
MIT
| § | Проверка | Охватываемая угроза |
|---|
| 1 | Инъекция хука SessionStart Claude Code в любом settings.json (на основе jq, низкий уровень ложных срабатываний) | Персистентность Mini Shai-Hulud |
| 2 | Сигнатуры дроппера Bun-runtime в setup.mjs | Этап установки Mini Shai-Hulud |
| 3 | Обфусцированные полезные нагрузки execution.js — размер плюс сигнал обфускации (однострочный, base64, eval(atob(, child_process) | Похититель учётных данных Mini Shai-Hulud |
| 4 | Файлы блокировки вредоносного ПО в $TMPDIR (имена из списка IOC) | Сторожевой процесс Mini Shai-Hulud |
| 5 | Скрипты preinstall в package.json, ссылающиеся на имена файлов дроппера | Точка входа для универсального supply-chain червя |
| 6 | Коммиты, созданные ИИ и затрагивающие .github/workflows/ (фильтр по разрешённым email-адресам) | Подделка CI скомпрометированным агентом ИИ |
| 7 | Конфигурационные файлы .gemini/ с шаблонами shell-метасимволов | Gemini CLI CVSS 10.0 RCE (до версии v0.39.1) |
| 8 | Конфигурации Cursor AGENTS.md и .cursor/, ссылающиеся на git-хуки / bare-репозитории | Cursor CVE-2026-26268 |
| 9 | Git-хуки post-checkout / post-merge / post-rewrite / pre-commit, содержащие примитивы fetch-and-execute, а также core.hooksPath, перенаправленный за пределы безопасного списка разрешений | Примитив выполнения CVE-2026-26268 + перехват хуков общего типа |
| 10 | Глобально установленные и локальные пакеты node_modules, сверяемые со списком IOC | Набор SAP CAP Mini Shai-Hulud, DPRK PromptMink, будущие вредоносные пакеты |
| 11 | Git-remotes, совпадающие с известными именами репозиториев эксфильтрации червя (Shai-Hulud, A Mini Shai-Hulud has Appeared) | Сигнал подтверждённой компрометации |
.git является файлом (содержит gitdir: …), фактический git-каталог определяется до проверки.| Тип | Используется в | Пример |
|---|
FILENAME | §5 шаблон preinstall | setup.mjs |
LOCKFILE | §4 сканирование файлов блокировки | tmp.987654321.lock |
NPM | §10 сканирование глобальных и локальных пакетов | @validate-sdk/v2 |
PYPI | §10 (перекрёстная проверка при добавлении сканера PyPI) | lightning |
HOOKSTRING | §1 соответствие содержимого хука (сейчас встроено в код) | SessionStart |
REPONAME | §11 соответствие git-remote | A Mini Shai-Hulud has Appeared |
EMAILSUBSTRING | зарезервировано для будущего сопоставления IOC по автору коммитов | — |
CONFIGPATH | список путей конфигурации агентных инструментов для справки | .claude/settings.json |