Skip to content

Топ правил для AI-линтера (security-first)

Документ ручной: приоритизация и threat-model для репозиториев со skills, MCP, инструкциями в Markdown, tool JSON, плагинами IDE и CI-артефактами. Не заменяет сгенерированный каталог текущих кодов правил — см. SECURITY_RULES.md.

Срез: 29 марта 2026. Часть правил уже покрывается shipped SEC* в lintai-ai-security, часть — кандидаты на следующие итерации.

Актуализация для skills markdown (2026-03-29)

Смотрите обновлённую секцию ниже: ## Актуализация (2026-03-29): top-6 правил для skills markdown (самые полезные).

Полевой апдейт (2026-03-30): что выносить на первый экран

После реального прогона по 1545 файлам из official, community и stratified cohorts, лучший первый экран для сайта и docs сейчас такой:

  1. SEC352 — unscoped Bash grant в AI-native frontmatter. Увер. 9/10, Надёж. 9/10
  2. SEC347 — mutable MCP launcher в markdown setup docs. Увер. 9/10, Надёж. 9/10
  3. SEC340 — mutable package launcher в committed Claude hook settings. Увер. 9/10, Надёж. 9/10
  4. SEC329 — mutable package launcher в committed mcp.json. Увер. 9/10, Надёж. 9/10

Почему именно так:

  • SEC352 сейчас даёт лучший signal/noise на обычных community skills, а не только на offensive-security corpus.
  • SEC347, SEC340 и SEC329 остаются самыми defendable operational rules для MCP / Claude wiring.
  • Эвристические и domain-sensitive правила вроде SEC102, SEC313, SEC335, SEC348, SEC349, SEC351 полезны, но хуже подходят для "первого впечатления" о качестве ruleset.

Синтез 15 исследовательских агентов (март 2026)

Был запущен параллельный ресёрч (15 подзадач) по направлениям: OWASP LLM Top 10 → статические аналоги; MITRE ATLAS mitigations → проверки в репо; официальный MCP security (в т.ч. spec 2025-11-25); Cursor / VS Code / Claude Code формы конфигов; Agent Skills spec; ENISA ETL 2025; NIST AI 600-1; GitHub Copilot custom instructions; hooks / tasks / pre-commit; небезопасная сериализация весов (HF/PyTorch guidance); CVE на MCP и AI-IDE; JSON Schema Tool (MCP); RAG chunk инварианты; plugin.json Cursor/Anthropic; SBOM / ML-BOM.

Критерий отбора «лучших» для таблиц ниже: детерминированная проверка по файлам, security-релевантность, переносимость между проектами, минимум ложных срабатываний при узкой формулировке. Отброшено: чистая эвристика «prompt injection» в prose; правила без первичного обоснования в спеке/доке.

Про два кураторских списка (волна 1 / волна 2): нумерация отражает приоритет внутри прохода куратора; между списками нет единого глобального ранга (волна 2 — CI, контейнеры, менеджеры пакетов: часто тот же класс blast radius, что пункты волны 1). Пересечения по смыслу намеренные (MCP, hooks, supply chain, ML — разные носители).

Кураторский топ-12 (лучшее из волны):

  1. MCP Tool по schema: обязательные name + inputSchema ($defs.Tool в официальном schema.json).
  2. Strict function tools (OpenAI/Anthropic): additionalProperties: false + полнота required при strict: true.
  3. Литералы опасных хостов/IP в OAuth/MCP URL в репо (169.254.169.254, внутренние диапазоны) — см. раздел SSRF в MCP security.
  4. Отключение TLS в коде/конфигах рядом с OAuth (verify=False, NODE_TLS_REJECT_UNAUTHORIZED=0, …).
  5. GitHub Copilot instructions: суффикс .instructions.md, обязательный applyTo для path-specific, лимит 4000 символов для code review (по докам GitHub).
  6. Плагины: относительные пути без .., запрет hooks / mcpServers / permissionMode во frontmatter агентов внутри Claude plugin (по докам Anthropic).
  7. Hooks / automation: curl|bash, runOn: folderOpen + произвольная shell-команда; закреплённый rev в .pre-commit-config.yaml.
  8. ML артефакты в git: политика против .pkl и небезопасных бинарных весов; приоритет Safetensors; минимальная версия PyTorch при weights_only (GHSA-53q9-r3pm-6pq6).
  9. SBOM: cyclonedx validate + элементы NTIA minimum для репо с моделями (ML-BOM narrative).
  10. OWASP LLM03/04/06 как статика: lockfile, манифест датасета с хэшами, непустой allowlist tools (политика репо).
  11. MITRE AML.M0033 / M0028: схема tool specs + least-privilege в закоммиченных конфигах агента.
  12. CVE semver: дополнение Cursor / VS Code+Copilot где продукт фиксируется в репо (см. таблицу ниже).

Вторая волна: ещё 15 агентов (март 2026)

Темы: devcontainers / Docker devcontainer.metadata, YAML (!!python/*, merge/anchors, ключ on в GHA), SSTI-аналог (Jinja/Handlebars + промпты), npm/pnpm/Corepack/install scripts / overrides drift, Python (extra-index-url, VCS без SHA, setup.py), DVC / MLflow / W&B / HF endpoint в git, OTEL / LangSmith / Langfuse секреты и «голые» промпты в трейсах, GHA (инъекция в run:, pin SHA, token+недоверенный код, cache poisoning), .env.example / direnv, Unicode tool id / ReDoS в regex-полях конфигов, WASI / Extism manifest, Cursor (.cursorignore vs terminal/MCP, envFile), Claude Code (settings.json, hooks, bypassPermissions), vector DB compose/Helm.

Кураторский топ новых правил (из второй волны):

  1. initializeCommand devcontainer выполняется на хосте; Features из произвольного OCI-реестра; bind-mount ~/.ssh, cloud CLI, docker.sock.
  2. Lifecycle в LABEL devcontainer.metadata в образе — скрытый от ревью devcontainer.json вектор.
  3. GHA: выражения $\{\{ inputs.* \}\} / event прямо в run: → script injection; third-party uses: не на полный SHA; сочетание contents: write с checkout кода из форка; cache общий между недоверенным и привилегированным job.
  4. YAML: теги !!python/object* в workflow/compose; anchors + << рядом с permissions / environment.
  5. Lockfile hasInstallScript без политики allowlist; dangerouslyAllowAllBuilds (pnpm); packageManager без integrity hash (Corepack).
  6. --extra-index-url / PIP_EXTRA_INDEX_URL на неутверждённый хост (dependency confusion); git+ без pin коммита; exec/eval в setup.py.
  7. Committed URL DVC remote / MLFLOW_TRACKING_URI / WANDB_BASE_URL / HF_ENDPOINT: http или private/metadata хосты.
  8. Экспорт телеметрии: литералы API key в YAML коллектора; LangSmith HIDE_INPUTS=false в prod-шаблонах при включённом tracing.
  9. SSTI-слой: Environment.from_string / Template( с f-string/конкатенацией из ненадёжных данных; delimiters шаблонов в закоммиченных промптах без политики variables-only / \{% raw %\}.
  10. Tool / operationId: ASCII-only machine id; запрет default-ignorable / ZWSP в идентификаторах (UTS #39).
  11. ReDoS: эвристики на значениях ключей pattern / regex / regexp (вложенные квантификаторы, (a|aa)+).
  12. Extism: allowed_hosts: null = произвольный исходящий HTTP; узкие allowed_paths.
  13. Cursor: официально terminal и MCP не уважают .cursorignore — секреты не полагаться только на ignore; литералы в env/headers/auth и envFile в .cursor/mcp.json.
  14. Claude Code (committed): permissions.defaultMode: bypassPermissions, HTTP-hook не https / вне allowedHttpHookUrls, hook command с absolute path без $CLAUDE_PROJECT_DIR.
  15. Vector stack: http:// к облачному вендору; api_key литералом в Helm/values; compose ports 0.0.0.0 для qdrant/weaviate/chroma без политики.

Актуализация (2026-03-29): top-6 правил для skills markdown (самые полезные)

Ниже — 6 правил с максимальной практической ценностью для SKILL.md, AGENTS.md, .mdc, .github/instructions, .github/copilot-instructions.md, .cursor и MCP-конфигов.

Топ-6 правил (старший ручной приоритет до полевого прогона)

РангПравилоПочему полезноУверенностьНадёжность
1SEC-COPILOT-PATH-LAYOUTФормат и расположение инструкций (.github/copilot-instructions.md, .github/instructions/*.instructions.md, applyTo), чтобы instructions реально применялись в нужном контексте.10/1010/10
2SEC-COPILOT-4KВ code-review лимит 4000 символов (контроль по GitHub docs) — исключает тихое отбрасывание хвостовой логики инструкций.10/1010/10
3SEC-OWASP-TOOLSПринудительный allowlist инструментов (без tools: ["*"]) снижает excessive agency и blast radius.10/1010/10
4SEC-MCP-TOOL-REQНаличие обязательных name и inputSchema в инструментах MCP/agent-интерфейсов предотвращает невалидный execution surface.10/1010/10
5SEC-OPENAI-STRICT + SEC-OPENAI-STRICT-REQ + SEC-ANTHROPIC-STRICTСтрогая валидация аргументов tool-call блокирует неожиданную семантику и подмену параметров.10/109/10
6SEC-MCP-LAUNCH + SEC-CURSOR-MCP-ENVFILE + SEC-CURSOR-IGNORE-NOT-BOUNDARYРеальный blast-radius контроль: запуск MCP без shell-пайпов + запрет утечки секретов через env/headers + не считаем .cursorignore security boundary.10/109/10

Уже зашипленные quality-first правила из этого трека

  • SEC352 — AI-native markdown frontmatter grants unscoped Bash tool access
    • статус: Preview
    • community usefulness сейчас: 9.5/10
    • надёжность: 9/10
    • почему важно: после последнего external validation это самый сильный skills-markdown rule по signal/noise; ловит слишком широкий shell grant в AI instruction frontmatter без расплывчатой prose-эвристики
  • SEC353 — GitHub Copilot instruction markdown exceeds the 4000-character guidance limit
    • статус: Preview
    • community usefulness сейчас: 8/10
    • надёжность: 9.5/10
    • почему важно: привязан к официальному GitHub guidance и ловит structure-level проблему, из-за которой хвост инструкций может перестать реально работать
  • SEC354 — Path-specific GitHub Copilot instruction markdown is missing applyTo frontmatter
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9.5/10
    • почему важно: ловит очень понятный structural misconfiguration, из-за которого path-specific Copilot instructions могут просто не применяться как задумано
  • SEC355 — AI-native markdown frontmatter grants wildcard tool access
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9.5/10
    • почему важно: very direct least-privilege rule для skills и shared instructions; wildcard * слишком расширяет agency и плохо переживает community review
  • SEC356 — Plugin agent frontmatter sets permissionMode
    • статус: Preview
    • community usefulness сейчас: 8/10
    • надёжность: 9.5/10
    • почему важно: структурно запрещает смешивать permission policy с plugin agent content; это narrow spec-aligned signal, который легко объяснить сообществу
  • SEC357 — Plugin agent frontmatter sets hooks
    • статус: Preview
    • community usefulness сейчас: 7.5/10
    • надёжность: 9.5/10
    • почему важно: не даёт прятать hook execution policy внутрь agent content; остаётся узким и spec-aligned
  • SEC358 — Plugin agent frontmatter sets mcpServers
    • статус: Preview
    • community usefulness сейчас: 7.5/10
    • надёжность: 9.5/10
    • почему важно: отделяет plugin agent docs от client/server wiring; сообществу проще ревьюить такие boundary violations, чем широкие prose rules
  • SEC359 — Cursor rule frontmatter alwaysApply must be boolean
    • статус: Preview
    • community usefulness сейчас: 8/10
    • надёжность: 9.5/10
    • почему важно: ловит очень понятный contract bug в .mdc / .cursorrules, из-за которого Cursor rules могут применяться не так, как автор ожидал
  • SEC360 — Cursor rule frontmatter globs must be a sequence of patterns
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9.5/10
    • почему важно: ловит path-targeting bug в .mdc / .cursorrules, из-за которого Cursor rule может тихо применяться не к тем файлам или не матчиться как задумано
  • SEC361 — Claude settings file is missing a top-level $schema reference
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9.5/10
    • почему важно: даёт понятный quality contract для shared .claude/settings.json, улучшает editor validation и делает командные Claude settings проще для ревью и поддержки
  • SEC362 — Claude settings permissions allow Bash(*) in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 9/10
    • надёжность: 9/10
    • почему важно: ловит прямой overly-broad shell grant в shared Claude settings; для AI infra это более practically actionable signal, чем broad prose guidance
  • SEC363 — Claude settings hook command uses a home-directory path in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9/10
    • почему важно: ловит не-portable shared Claude hook wiring; для AI команд это понятный config smell, который легко чинится переходом на $CLAUDE_PROJECT_DIR
  • SEC364 — Claude settings set permissions.defaultMode to bypassPermissions in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9/10
    • почему важно: это очень явный over-agency smell в shared Claude policy; сообществу легко объяснить, почему committed bypass default хуже, чем явные reviewed allowlists
  • SEC365 — Claude settings allow non-HTTPS allowedHttpHookUrls in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9/10
    • почему важно: это прямой transport-policy smell для shared Claude hook allowlist; https:// проще защищать и публично отстаивать как командный стандарт
  • SEC366 — Claude settings allow dangerous host literals in allowedHttpHookUrls
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9/10
    • почему важно: metadata/private-network hook hosts в shared config выглядят как очень понятный SSRF/exfil policy smell и хорошо объясняются сообществу
  • SEC367 — Claude settings permissions allow WebFetch(*) in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9/10
    • почему важно: даёт очень понятный least-privilege signal для shared Claude network access; wildcard fetch grant легче всего оспорить в code review и легко сузить до reviewed endpoints
  • SEC368 — Claude settings hook command uses a repo-external absolute path in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9/10
    • почему важно: ловит team-facing Claude hook wiring, которое жёстко привязано к внешнему filesystem path; community-friendly remediation очевиден — перейти на $CLAUDE_PROJECT_DIR
  • SEC369 — Claude settings permissions allow Write(*) in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 9/10
    • надёжность: 9/10
    • почему важно: wildcard write grant в shared AI config сообществу объяснять проще всего; это очень явный least-privilege smell с очевидным remediation path
  • SEC370 — path-specific GitHub Copilot instruction markdown under .github/instructions/ uses the wrong file suffix
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9.5/10
    • почему важно: это очень понятный structural rule для AI tooling layout; если path-specific Copilot file не заканчивается на .instructions.md, repo получает тихий config drift, который сложно заметить в review
  • SEC371 — path-specific GitHub Copilot instruction markdown has an invalid applyTo shape
    • статус: Preview
    • community usefulness сейчас: 8/10
    • надёжность: 9.5/10
    • почему важно: rule хорошо объясняется сообществу как config-contract check; applyTo должен быть реально применимым target selector, а не пустым или malformed значением
  • SEC372 — Claude settings permissions allow Read(*) in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9/10
    • почему важно: exact wildcard read grant в shared AI config очень легко объяснить сообществу как least-privilege smell; remediation такой же defendable, как у Write(*), но с уклоном в data exposure
  • SEC373 — Claude settings permissions allow Edit(*) in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 9/10
    • надёжность: 9/10
    • почему важно: wildcard edit grant в shared AI config напрямую размывает safety boundary для file mutation; сообществу это объяснять почти так же просто, как Write(*), но ещё ближе к повседневому AI coding workflow
  • SEC374 — Claude settings permissions allow WebSearch(*) in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 8.5/10
    • почему важно: wildcard search grant в shared AI config задаёт слишком широкую external-information surface; это понятный least-privilege signal для AI workflows, где search должен быть reviewable и scoped
  • SEC375 — Claude settings permissions allow Glob(*) in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9/10
    • почему важно: wildcard file-discovery grant в shared AI config слишком широко раскрывает workspace surface; сообществу это легко объяснить как exact least-privilege smell без prose-эвристик
  • SEC376 — Claude settings permissions allow Grep(*) in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 9/10
    • почему важно: wildcard content-search grant в shared AI config даёт слишком широкую search surface; это хорошо воспринимается сообществом как точный least-privilege contract check
  • SEC377 — path-specific GitHub Copilot instruction markdown has an invalid applyTo glob pattern
    • статус: Preview
    • community usefulness сейчас: 9/10
    • надёжность: 9/10
    • почему важно: invalid applyTo glob выглядит как обычная конфигурация, но silently ломает targeting Copilot instructions; это один из самых defendable community-facing AI config checks
  • SEC378 — Cursor rule frontmatter should not set globs when alwaysApply is true
    • статус: Preview
    • community usefulness сейчас: 9/10
    • надёжность: 9/10
    • почему важно: global Cursor rule с одновременными globs создаёт двусмысленный routing contract; правило structural-only и очень легко принимается сообществом как config hygiene check
  • SEC379 — Cursor rule frontmatter contains an unknown key
    • статус: Preview
    • community usefulness сейчас: 9/10
    • надёжность: 9/10
    • почему важно: неизвестные ключи в .mdc создают ложное ощущение поддерживаемой конфигурации; это точный и практичный contract check для shared AI rule packs
  • SEC380 — Cursor rule frontmatter should include description
    • статус: Preview
    • community usefulness сейчас: 8.5/10
    • надёжность: 8.5/10
    • почему важно: правила без description тяжелее ревьюить и поддерживать в shared AI repo packs; remediation очевиден и rule хорошо воспринимается как quality contract
  • SEC381 — Claude settings command hook should set timeout in a shared committed config
    • статус: Preview
    • community usefulness сейчас: 9/10
    • надёжность: 9/10
    • почему важно: shared Claude command hooks без timeout создают очень практичный operational smell; remediation в одну строку, а rule легко защитить перед сообществом как reviewable team-policy contract
  • SEC382 — Claude settings should not use matcher on unsupported hook events
    • статус: Preview
    • community usefulness сейчас: 9/10
    • надёжность: 9.5/10
    • почему важно: это точный hook-contract check с живым real-world example; rule не спорит про политику, а ловит тихий config drift, который сообществу легко принять
  • SEC383 — Claude settings should set matcher on matcher-capable hook events
    • статус: Preview
    • community usefulness сейчас: 9/10
    • надёжность: 9/10
    • почему важно: отсутствие matcher на PreToolUse / PostToolUse выглядит как безобидная мелочь, но quietly размывает scope hook policy; это точный и практичный team-config contract check
  • SEC384 — Claude settings permissions allow bare WebSearch
    • статус: Preview
    • community usefulness сейчас: 9/10
    • надёжность: 9/10
    • почему важно: bare WebSearch — это очень широкий network-search grant в shared AI policy; rule exact, practical и уже grounded на живых repo configs

Минимальный релизный набор (1-й проход)

  1. SEC-COPILOT-PATH-LAYOUT
  2. SEC-COPILOT-4K
  3. SEC-OWASP-TOOLS
  4. SEC-MCP-TOOL-REQ
  5. SEC-OPENAI-STRICT + SEC-OPENAI-STRICT-REQ

Где линтовать для сообщества (top-3 по практичности, с оценками)

  • Вариант A: GitHub Action required check
    Уверенность: 10/10
    Надёжность: 10/10
    Почему: максимальный охват, enforce для каждого PR, единообразие для OSS-репозиториев.
  • Вариант B: pre-commit + локальный линт
    Уверенность: 9/10
    Надёжность: 8/10
    Почему: дешёвый вход, раннее обнаружение и меньше итераций PR.
  • Вариант C: PR advisory bot
    Уверенность: 8/10
    Надёжность: 7/10
    Почему: второй слой в проектах с legacy-репозиториями или без strict CI.

Рекомендуемый rollout

pre-commit → обязательный GitHub Action → advisory-бот (поэтапно, без перегруза команд).

Обновлённые источники 2025-2026 (критичные для этого блока)

Принципы

  1. Security важнее совместимости: gate CI в первую очередь на угрозы (утечки, подмена инструментов, supply chain, обход контракта аргументов, SSRF-литералы, автозапуск shell).
  2. Высокая точность: схема, semver/CVE, байты/Unicode, URL-схема, структура JSON, числовые инварианты RAG только при явных ключах в файле.
  3. Широкая аудитория: OSS skills, корпоративные MCP, monorepo с агентами и Copilot instructions.

Тир S — security (рекомендуемый CI gate)

Порядок строк в таблице: не глобальный рейтинг по CVSS, а кластеры по поверхности (CVE → MCP/remote → контракт tool JSON / схема → markdown агента → снова MCP launch/vars → lockfile → локальные hooks → Copilot → supply chain: devcontainer / GHA / npm / Python → ML / observability / vector / WASM). Внутри кластера — от более узнаваемых к менее специфичным для AI-репо. Для ощущения «что важнее прямо сейчас» ориентируйтесь на кураторские списки и блок «Минимальные наборы», а не на номер строки в Tier S.

IDПравилоЧто проверяемУгрозаТипичные пути
SEC-MCP-CVEВерсии mcp-remote, @modelcontextprotocol/sdk вне известных уязвимых диапазоновRCE / cross-client data leakpackage.json, lockfiles
SEC-PRODUCT-CVEВерсии Cursor / Cursor CLI / VS Code в репо или lock скане — см. таблицу CVEКомпрометация IDE/CLIполитика орг., скан установок
SEC-MCP-URLRemote MCP: https, политика по loopback / private literalSSRF, MITM, подмена OAuth flowmcp.json, .cursor/mcp.json, server.json
SEC-MCP-SSRF-LITERALЛитералы 169.254.169.254, metadata.google.internal, частные диапазоны в строках OAuth/MCPSSRF / metadata abuseJSON, .env.example, код клиента MCP
SEC-MCP-TLS-BYPASSПаттерны отключения проверки TLS рядом с HTTP-клиентами OAuthMITM, утечка токеновисходники, shell env в конфигах
SEC-MCP-SECRETSЛитералы секретов в env / headers MCP без индирекции (${input:}, ${env:})Утечка в gitJSON конфигов MCP
SEC-MCP-SHADOWДубликаты имён MCP tools в дескрипторах репозиторияTool shadowingJSON дескрипторы
SEC-MCP-TOOL-REQПо MCP schema: у Tool есть name и inputSchema (machine schema)Невалидный tool → странное поведение агентаcodegen, фикстуры
SEC-TOOLS-COLLISIONДубликаты function.name в OpenAI-style toolsПодмена вызова**/tools*.json
SEC-OPENAI-STRICTПри strict: true: рекурсивно additionalProperties: false в parametersОбход контракта аргументовtool JSON
SEC-OPENAI-STRICT-REQПри strict: true: required покрывает все propertiesТо жеtool JSON
SEC-ANTHROPIC-STRICTAnthropic strict + input_schema.additionalProperties: falseТо жеAnthropic JSON
SEC-JSONSCHEMA-METAВалидация вложенной схемы по JSON Schema 2020-12 meta-schemaПодмена/битая схема*schema*.json
SEC-MD-BIDI-ZWSPBidi control, ZWSP, BOM в контексте агентаTrojan Source класс, скрытый текстSKILL.md, AGENTS.md, .cursor/rules/**/*, Copilot instructions
SEC-MD-DANGEROUS-URLСхемы javascript:, data:, vbscript:Фишинг / рендер*.md, *.mdc
SEC-MD-PEMPEM / private key в markdownУтечка ключейте же
SEC-MD-PIPE-SHELLУзкий pipe-to-shell в fenced блокахRCE через инструкциите же
SEC-MCP-REMOTE-VARS{var} в remote URL ↔ ключи variables в server.jsonMisconfig endpointserver.json
SEC-MCP-LAUNCHЦепочки **&& / ; / `**, **bash -c/sh -c`** в команде запуска MCP (высокосигнальные)Local compromise через конфигJSON MCP, скрипты
SEC-LOCKFILEПолитика lockfile + lockfile-lint (https, allowed hosts)Supply chainnpm/pnpm/yarn locks
SEC-HOOK-AUTOEXECcurl|wget … | sh, runOn: folderOpen + не allowlist-командаSupply chain / открытие папки = RCE.vscode/tasks.json, hooks
SEC-PRECOMMIT-PIN.pre-commit-config.yaml: rev не ветка/плавающий тег (политика SHA)Подмена хука.pre-commit-config.yaml
SEC-ML-ARTIFACTЗапрет .pkl и небезопасных бинарных весов в git (политика орг.)RCE при загрузке весов**/*.pkl, артефакты моделей
SEC-COPILOT-FMPath-specific: суффикс .instructions.md, наличие applyTo во frontmatterНеверная загрузка инструкций.github/instructions/**
SEC-COPILOT-4KДля веток с Copilot code review: длина файла инструкции ≤ 4000 символов (по докам)Тихий игнор хвоста при review.github/**/*.md (политика)
SEC-DEVCONTAINER-INIT-HOSTНепустой initializeCommand в devcontainer.jsonПроизвольная команда на хосте до контейнера.devcontainer.json, .devcontainer/devcontainer.json
SEC-DEVCONTAINER-FEATURE-REGISTRYfeatures с образами вне org-allowlist (произвольный OCI registry/namespace)Supply-chain / RCE при сборке featureте же
SEC-DEVCONTAINER-BIND-SENSITIVEmounts: bind source содержит .ssh, .aws, .kube, docker.sock и т.п.Утечка хост-секретов / захват docker daemondevcontainer, compose под devcontainer
SEC-DEVCONTAINER-METADATA-LABELВ Dockerfile в LABEL devcontainer.metadata= есть lifecycle-ключи (postCreateCommand, …)Скрытое автовыполнение относительно json в репоDockerfile, *.Dockerfile
SEC-YAML-PYTHON-TAGВ workflow/compose/MCP yaml встречаются теги !!python/object и аналогиНебезопасная десериализация при «не тем» парсере.github/workflows/**, docker-compose*.yml, mcp*.yaml
SEC-GHA-RUN-INJECT-INPUTВ run: встроены $\{\{ inputs.* \}\} / github.event.* (недоверенный контекст) без вынесения в env:Script injection.github/workflows/**
SEC-GHA-ACTION-NO-SHAuses: owner/repo@ref для сторонних action: ref не 40-char SHA (тег/ветка/короткий SHA)Подмена тегаworkflows
SEC-GHA-WRITE-UNTRUSTED-CODEpermissions с write + checkout/запуск кода с head форка / pull_request_target без изоляцииPwn request классworkflows
SEC-GHA-CACHE-POISONОдин и тот же ключ actions/cache записывается из недоверенного workflow и читается привилегированнымCache poisoningworkflows
SEC-NPM-INSTALLSCRIPT-SURFACEВ lockfile hasInstallScript: true у пакетов без политики ignore-scripts / onlyBuiltDependencies / trustedDependenciesInstall-time RCE цепочкаpackage-lock.json, pnpm-lock.yaml + package.json
SEC-PNPM-ALLOW-ALL-BUILDSdangerouslyAllowAllBuilds: true в pnpm configАвто-запуск всех build-скриптов при обновлении графаpnpm-workspace.yaml, .npmrc
SEC-COREPACK-NO-HASHpackageManager без +sha… (политика воспроизводимости)Подмена менеджера пакетовкорневой package.json
SEC-PY-EXTRA-INDEX-HOST--extra-index-url / PIP_EXTRA_INDEX_URL / tool.uv.extra-index-url → хост ∉ allowlist или httpDependency confusion (pip, PEP 708)requirements*.txt, pyproject.toml, CI env
SEC-PY-GIT-NO-SHAgit+https://…@branch без полного SHA в зависимостях (политика)Неповторяемый / подменяемый исходникrequirements, pyproject.toml, uv.lock
SEC-ML-REMOTE-URLDVC remote url, MLFLOW_TRACKING_URI, WANDB_BASE_URL, HF_ENDPOINT: http или private/metadata хост в committed файлахSSRF / эксфильтрация трекинга.dvc/config, compose, Helm, .env.example
SEC-OBS-EXPORT-INLINE-SECRETВ OTEL/observability YAML литералы api_key / Authorization / DD_API_KEY / LANGSMITH_API_KEY без ${…} / secretKeyRefУтечка ключей в gitotel-collector*.yaml, compose
SEC-VECTOR-HTTP-URLhttp:// в URL/env для Pinecone / Qdrant / Weaviate / Chroma (не localhost по политике)Ключи и эмбеддинги по сети без TLScompose, Helm, config*.yml
SEC-EXTISM-HOSTS-NULLВ Extism manifest allowed_hosts: null (полный интернет)Неконтролируемый исходящий HTTP плагинаextism.json, manifest по Extism

Связь с текущим lintai: фактические коды SEC* — только в SECURITY_RULES.md.


Тир A — сильная гигиена (security-релевантно или смежно)

IDПравилоЗаметка
SEC-SKILL-METADATAmetadata только string → stringagentskills.io/specification
SEC-SKILL-ALLOWED-TOOLSallowed-tools: одна строка, токены через пробелтам же
SEC-MCP-INPUTSCHEMA-OBJECTinputSchema.type === "object" (проза MCP tools)MCP server tools
SEC-OAS-BUNDLEOpenAPI 3.x по OAS 3.1 schemaspec.openapis.org
SEC-GHA-PWN-REQUESTpull_request_target + checkout недоверенного refGitHub Security Lab
SEC-PLUGIN-PATHПути в plugin.json: относительные, без .., без absolute (Cursor submit / Anthropic)Cursor Plugins, Anthropic plugins
SEC-PLUGIN-AGENTВ plugin agent нет hooks, mcpServers, permissionMode во frontmatterAnthropic — Agents in plugins
SEC-OWASP-LOCKLLM03: манифест + lock по политикеLLM03 Supply Chain
SEC-OWASP-TOOLSLLM06: не "tools": "*" / пустой allowlist (политика JSON)LLM06 Excessive Agency
SEC-RAG-CHUNKПри явных ключах: chunk_size > 0, chunk_overlap < chunk_sizeLangChain TextSplitter, LlamaIndex SentenceSplittergated, medium FP без контекста ключей
SPEC-GHA-YAML-ON-KEYВ GHA YAML корневой ключ on: в кавычках / валидный триггер (избежать boolean on в YAML 1.1)Workflow syntax, yaml bool
SPEC-YAML-MERGE-REVIEWНаличие <<: merge в compose/workflow — флаг на ручной аудит порядка слиянияYAML merge, Compose merge
SEC-YAML-ANCHOR-PERMISSIONSAnchors (&/*) + merge рядом с permissions: / env: в GHAСкрытые capabilities при ревью
SEC-TPL-JINJA-IN-PROMPTВ **/prompts/**, SKILL.md, **/templates/**: delimiters \{\{/\{% без документированной политики raw / variables-onlySSTI + LLM01 indirect
SEC-TPL-BUILD-FROM-STRINGTemplate( / from_string / render_template_string с шаблоном из f-string/concat из ненадёжного источникаКлассический SSTI
SEC-NPM-BIN-SHADOWbin в package.json с именами node/npm/npx/… (PATH confusion)Вредоносный shim при отключённых scripts
SEC-OVERRIDES-DRIFTЕсть overrides/resolutions, но lockfile не отражает ожидаемые версии (эвристика)Ложное чувство патча CVE
SEC-PY-PACKAGE-ALLOWLISTИмена пакетов после PyPA normalization ∉ org allowlist / эвристика typosquatSlopsquatting
SEC-PY-SETUP-EXECexec/eval/compile в setup.py (узкий scope файла)Произвольный код при установке
SEC-REDO-CONFIG-REGEXЗначения pattern/regex/regexp с вложенными квантификаторами / (a|aa)+ReDoS на длинных документах
SEC-TOOL-ID-ASCIIoperationId / tool name: политика ASCII machine id (^[A-Za-z][A-Za-z0-9_-]*$ или house style)Homoglyph / policy bypass
SEC-TOOL-ID-NO-IGNORABLEВ tool id нет ZWSP / bidi / default-ignorable (UTS #39 profile)Разные ключи при одинаковом «виде»
SEC-CURSOR-IGNORE-NOT-BOUNDARYДок/политика: не считать .cursorignore единственной защитой секретов (terminal/MCP всё ещё читают файлы)Ложное чувство защиты
SEC-CURSOR-MCP-ENVFILEВ .cursor/mcp.json: envFile на богатый .env + нет review политики; литералы в env/headers вместо ${env:}Расширение blast radius stdio MCP
SEC-CLAUDE-BYPASS-IN-REPOВ committed .claude/settings.json: defaultMode: bypassPermissions (project)Избыточная agency в shared config
SEC-CLAUDE-HOOK-PATHHooks command: absolute path / ~/ без $CLAUDE_PROJECT_DIR для team scriptsНевоспроизводимость / подмена пути
SEC-CLAUDE-HOOK-HTTPHTTP-hook: не https или URL вне политики allowedHttpHookUrlsMITM / неконтролируемый exfil
SEC-ENV-TEMPLATE-FAKE-SECRET.env.example: значения в формате реальных секретов (entropy / AKIA… / sk_live)Сканеры, копипаст в prod
SEC-DIRENV-ESCAPE-ROOT.envrc: source/dotenv на absolute пути, /etc, $HOME, выход из корня репоЧтение чужих секретов
SEC-VECTOR-COMPOSE-BINDCompose: образы qdrant/weaviate/chroma с ports: "6333:6333" без 127.0.0.1: (политика)Публикация БД в LAN
SEC-LLM-TRACE-HIDE-OFFВ prod-профиле: LANGSMITH_HIDE_INPUTS=false (и аналоги) при LANGSMITH_TRACING=trueПромпты/PII в SaaS трейсах
SEC-OTEL-LLM-NO-SCRUBКоллектор с LLM-телеметрией: только batch без redact/transform процессоров (эвристика)PII в экспортёре

Тир B — спецификация и качество (полезно, не headline security)

IDПравилоЗаметка
SPEC-SKILLAgent Skills: поля name / description / compatibility, dirname, уникальностьSpecification
SPEC-SERVER-JSONserver.json, $schema, remotes[].typestreamable-http | sseRegistry, Remote servers
SPEC-MCP-CLIENTФормы Cursor mcpServers, VS Code servers+inputs, Claude .mcp.jsonCursor MCP, VS Code, Claude Code MCP
SPEC-AGENTS-SIZECodex: лимит байт цепочки инструкцийAGENTS.md guide
SPEC-CURSOR-MDCYAML frontmatter .mdc, alwaysApply boolean, globs sequenceCursor Rules
SPEC-SBOMНаличие + валидация CycloneDX / SPDX + NTIA minimum при артефактах моделейCycloneDX ML-BOM, NTIA minimum elements
SPEC-CLAUDE-SETTINGS-SCHEMACommitted .claude/settings.json содержит $schemaSchemaStore claude-code-settingsSettings
SPEC-EXTISM-MANIFESTВалидация JSON манифеста Extism по upstream schemaManifest
SPEC-WASI-IMPORTSДекларированный world/capabilities согласован с фактическими импортами компонента (ручной + wasm-tools)Component worlds, wasi-cli imports

CVE / advisory (закрепить в semver-политике линтера)

КомпонентДиапазон / условиеИсправлениеИсточник
mcp-remote (npm)уязвимые версии по advisory≥ 0.1.16CVE-2025-6514, GHSA-6xpm-ggf7-wc3p
@modelcontextprotocol/sdk1.10.0–1.25.3≥ 1.26.0CVE-2026-25536, GHSA-345p-7cg4-v4c7
VS Code + Copilot (экосистема Microsoft)по NVD/MSRC для CVE-2026-21518по MSRCCVE-2026-21518
Cursor CLIпо GHSA / NVDпо advisoryCVE-2025-61592, GHSA-v64q-396f-7m79
Cursor (desktop/agent)по GHSA / NVDпо advisoryCVE-2026-31854, GHSA-hf2x-r83r-qw5q

Точные CPE/диапазоны меняются — в CI сверяйте NVD/MSRC на дату сборки.


Минимальные наборы

Только security gate (расширенный ~14)

  1. SEC-MCP-CVE (+ SEC-PRODUCT-CVE если сканируете IDE)
  2. SEC-MCP-URL + SEC-MCP-SSRF-LITERAL + SEC-MCP-TLS-BYPASS
  3. SEC-MCP-SECRETS
  4. SEC-MCP-SHADOW + SEC-TOOLS-COLLISION + SEC-MCP-TOOL-REQ
  5. SEC-OPENAI-STRICT + SEC-OPENAI-STRICT-REQ + SEC-ANTHROPIC-STRICT
  6. SEC-MD-BIDI-ZWSP + SEC-MD-DANGEROUS-URL + SEC-MD-PEM + SEC-MD-PIPE-SHELL
  7. SEC-LOCKFILE + SEC-MCP-REMOTE-VARS
  8. SEC-MCP-LAUNCH + SEC-HOOK-AUTOEXEC + SEC-PRECOMMIT-PIN
  9. SEC-COPILOT-FM + SEC-COPILOT-4K (если используете Copilot instructions в репо)
  10. SEC-PLUGIN-PATH + SEC-PLUGIN-AGENT (если шипятся плагины)
  11. SEC-ML-ARTIFACT (если в репо веса моделей)
  12. SEC-JSONSCHEMA-META

Расширение «monorepo + CI + devcontainer» (вторая волна)

  • Devcontainer: SEC-DEVCONTAINER-INIT-HOST, SEC-DEVCONTAINER-FEATURE-REGISTRY, SEC-DEVCONTAINER-BIND-SENSITIVE, SEC-DEVCONTAINER-METADATA-LABEL
  • GitHub Actions: SEC-GHA-RUN-INJECT-INPUT, SEC-GHA-ACTION-NO-SHA, SEC-GHA-WRITE-UNTRUSTED-CODE, SEC-GHA-CACHE-POISON (+ уже SEC-GHA-PWN-REQUEST)
  • YAML supply chain: SEC-YAML-PYTHON-TAG, SEC-YAML-ANCHOR-PERMISSIONS
  • JS/TS installs: SEC-NPM-INSTALLSCRIPT-SURFACE, SEC-PNPM-ALLOW-ALL-BUILDS, SEC-COREPACK-NO-HASH
  • Python deps: SEC-PY-EXTRA-INDEX-HOST, SEC-PY-GIT-NO-SHA
  • ML/vectors/observability: SEC-ML-REMOTE-URL, SEC-VECTOR-HTTP-URL, SEC-VECTOR-COMPOSE-BIND, SEC-OBS-EXPORT-INLINE-SECRET
  • Плагины WASM: SEC-EXTISM-HOSTS-NULL

Security + спека

Добавить SPEC-SKILL, SPEC-SERVER-JSON, SPEC-MCP-CLIENT, SEC-OAS-BUNDLE, SEC-RAG-CHUNK (с gate по ключам), SPEC-SBOM при моделях; при Claude Code в git — SPEC-CLAUDE-SETTINGS-SCHEMA; при GHASPEC-GHA-YAML-ON-KEY; при ExtismSPEC-EXTISM-MANIFEST.


Ограничения статического линтера

  • Семантический prompt injection в свободном prose — низкая точность как единственный gate.
  • Confused deputy / token passthrough в OAuth — в основном рантайм; статика ловит только грубые литералы и антипаттерны в коде.
  • RAG chunk — разные единицы (токены vs символы); линтить только с явной меткой или известным классом конфига.

Первоисточники (расширенный список)

ТемаURL
MCP security (spec 2025-11-25)https://modelcontextprotocol.io/specification/2025-11-25/basic/security_best_practices
MCP schema (raw)https://raw.githubusercontent.com/modelcontextprotocol/specification/main/schema/2025-11-25/schema.json
OWASP LLM Top 10 2025https://genai.owasp.org/llm-top-10/
MITRE ATLAShttps://atlas.mitre.org/ , ATLAS.yaml https://raw.githubusercontent.com/mitre-atlas/atlas-data/main/dist/ATLAS.yaml
ENISA Threat Landscape 2025https://www.enisa.europa.eu/sites/default/files/2026-01/ENISA Threat Landscape 2025_v1.2.pdf
NIST AI 600-1 PDFhttps://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.600-1.pdf
Copilot custom instructionshttps://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot
Copilot code review 4000https://docs.github.com/en/copilot/tutorials/use-custom-instructions
HF Hub — unsafe weight formatshttps://huggingface.co/docs/hub/main/security-pickle
Safetensorshttps://huggingface.co/docs/safetensors/index
PyTorch torch.loadhttps://docs.pytorch.org/docs/stable/generated/torch.load.html
PyTorch GHSA (weights_only history)https://github.com/pytorch/pytorch/security/advisories/GHSA-53q9-r3pm-6pq6
pre-commit freezehttps://pre-commit.com/#pre-commit-autoupdate-options
VS Code Workspace Trusthttps://code.visualstudio.com/docs/editor/workspace-trust
CycloneDX validate CLIhttps://github.com/CycloneDX/cyclonedx-cli
Dev Containers / VS Code remotehttps://code.visualstudio.com/docs/devcontainers/containers
GHA script injectionshttps://docs.github.com/en/actions/concepts/security/script-injections
GHA hardening (pin SHA)https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions
GitHub Security Lab (cache, pwn requests)https://securitylab.github.com/resources/github-actions-new-patterns-and-mitigations/
Corepack packageManager + hashhttps://github.com/nodejs/corepack/blob/main/README.md
pnpm dangerouslyAllowAllBuildshttps://pnpm.io/settings#dangerouslyallowallbuilds
DVC configurationhttps://dvc.org/doc/user-guide/project-structure/configuration
MLflow env varshttps://mlflow.org/docs/latest/python_api/mlflow.environment_variables.html
W&B environment variableshttps://docs.wandb.ai/models/track/environment-variables
OTEL config best practiceshttps://opentelemetry.io/docs/security/config-best-practices/
Unicode TR36 / UTS #39https://www.unicode.org/reports/tr36/ , https://www.unicode.org/reports/tr39/
Cursor ignore filehttps://cursor.com/docs/reference/ignore-file
Claude Code settings / hookshttps://docs.anthropic.com/en/docs/claude-code/settings
Qdrant securityhttps://qdrant.tech/documentation/guides/security/
Weaviate authenticationhttps://weaviate.io/developers/weaviate/configuration/authentication

(Плюс: Agent Skills, Registry, Cursor Rules, OpenAI function calling, Anthropic structured outputs, Codex AGENTS.md, CVE-2021-42574, TR36, OpenAPI 3.1, JSON Schema 2020-12, GitHub Actions hardening.)


См. также