# ADR-014: A8 infosec-tooling — наполнение раздела карты A8

**Status:** Accepted (amended 21.05.2026 — ZAP #68 + Ward #70 установлены портативно, статус PENDING INSTALL снят; см. Decision п.1/п.3 + Consequences)
**Date:** 2026-05-21
**Контекст:** эпик A8 infosec-tooling, spec `docs/superpowers/specs/2026-05-21-a8-infosec-tooling-design.md`, plan `docs/superpowers/plans/2026-05-21-a8-infosec-tooling.md`, провенанс-вет `docs/security/infosec-vet.md`.

## Context

Раздел карты A8 «Информационная безопасность» формально существовал, но дедицированных
узлов не имел — в него были лишь кросс-тегированы существующие фазовые инструменты
(Semgrep #25, gitleaks #8). Портал Лидерра подходит к публичному запуску в интернете;
заказчик попросил подобрать 5–7 плагинов (GitHub + Anthropic), закрывающих потребности
безопасности портала.

Дефициты чистого A8 (технические инструменты защиты *работающего* портала — отдельно
от процесса аудита D3, статики кода, БД-инструментов): динамическая «боевая» проверка
(DAST) отсутствовала полностью; широкая проверка на известные уязвимости/экспозицию;
Laravel-специфичная безопасность конфигурации; защита ПДн + соответствие 152-ФЗ;
моделирование угроз под выход в интернет; единый go-live security-gate.

D3 (audit-security) уже покрывает Anthropic-арсенал (Security Guidance хук,
`/security-review`, Trail of Bits скилы). DAST-движка и Laravel-сканера у Anthropic нет
→ внешние GitHub-инструменты обоснованы. Для 152-ФЗ и угроз-под-наш-портал готового
(знающего РФ-закон и устройство Лидерры) не существует → self-authored скилы.

**Решения заказчика (зафиксированы):** охват — мои инструменты + серверный слой (двумя
слоями); ПДн/152-ФЗ — целиком; «боевая» DAST — да; подход — готовые движки + свои скилы
для project-specific слотов.

## Decision

1. **OWASP ZAP (#68)** — официальный ZAP «MCP Integration» add-on (`zaproxy/zap-extensions`,
   Apache-2.0). Глубокая DAST (spider + active scan): обход входа, инъекции, XSS.
   - **Постура:** on-demand, READ-only сканер, цель по умолчанию **локальная копия**
     (127.0.0.1), бой — только по явной команде (IS8). MCP-сервер в `.mcp.json`.
   - **Статус: УСТАНОВЛЕН 21.05.2026** (портативно, без choco) — ZAP cross-platform 2.17.0
     с MCP-аддоном `mcp-alpha-0.0.1` на portable Temurin JRE 17 (`bin/ZAP_2.17.0/`, gitignored);
     daemon API verified → 2.17.0. Add-on alpha. Доку: `docs/security/zap-setup.md`.
2. **Nuclei (#69)** — `projectdiscovery/nuclei` v3.8.0 (MIT), Go-бинарь `bin/nuclei.exe`.
   Широкая проверка по YAML-шаблонам (известные CVE, экспозиция, TLS).
   - **Тип: CLI-инструмент, НЕ MCP-сервер.** Nuclei не говорит на протоколе MCP;
     обёртка в MCP-сервер = доп. attack surface. Интегрирован как CLI (как gitleaks #8 /
     squawk #15 / Trivy #26), вызывается по требованию скилом #73. Поэтому `.mcp.json`-блок
     и l1-watcher alias для #69 **не нужны**.
   - **Статус: УСТАНОВЛЕН + verified** (13 060 шаблонов; smoke: 1057 запросов к живому
     порталу, скан завершён). Квирки: цель `127.0.0.1` (не `localhost` — резолвер),
     `-rate-limit 20 -c 5` для однопоточного dev-сервера. Доку: `docs/security/nuclei-setup.md`.
3. **Ward (#70)** — `Eljakani/ward` (MIT, Go CLI). Сканер misconfig/secrets Laravel:
   .env (8 проверок) + config/*.php (13) + deps (OSV.dev) + код (7 категорий).
   - **ЗАМЕНИЛ Enlightn** (исходный план): Enlightn оказался abandoned (Packagist) +
     официально без поддержки Laravel 13 (PR L12 висит 3+ мес). Ward — Go-бинарь, **не
     зависит от версии Laravel** → проблема снята. Заказчик выбрал «подобрать замену».
     Обоснование — `docs/security/infosec-vet.md` §ПЕРЕСМОТР #70. Pin по commit SHA (релизов нет).
   - **Тип: CLI-инструмент** (как Nuclei), не MCP, не Composer dev-dep.
   - **Статус: УСТАНОВЛЕН 21.05.2026** (портативно, без choco) — собран из исходника через
     portable Go 1.26.3 (`go install github.com/eljakani/ward@v0.4.1`) → `bin/ward.exe` v0.4.1;
     smoke `app/` → 2 находки (High APP_DEBUG, Medium APP_ENV). Доку: `docs/security/ward-setup.md`.
   - Caveat: молодой (фев 2026), single-maintainer → bus-factor; митигация — версия-pin + MIT-форк.
4. **pdn-152fz-audit (#71)** — self-authored project-скил. Аудит ПДн + соответствие 152-ФЗ
   (2 режима: техника + закон), заземлён в `db/schema.sql`. Активен.
5. **threat-model (#72)** — self-authored project-скил. STRIDE под наш портал, going-public,
   заземлён в `app/routes/`. Активен.
6. **security-go-live (#73)** — self-authored project-скил, оркестратор go-live security-gate:
   #68–#72 + Semgrep #25 / Trivy #26 / gitleaks #8 / Trail of Bits #39 → вердикт GO/NO-GO. Активен.

**Серверный слой защиты** (WAF, anti-brute-force/rate-limit, DDoS, intrusion monitoring,
secrets vault, TLS/HSTS/CSP, бэкапы + IR-runbook) — **out of scope** этого эпика (не плагины);
фиксируется как открытые вопросы инфраструктуры (привязка к Б-1).

## Boundaries (конфликт-аудит)

- **IS1** ZAP #68 ↔ Semgrep #25: динамика (бьёт работающий портал) vs статика (читает код) — разные классы.
- **IS2** Nuclei #69 ↔ ZAP #68: широта (известные дыры / экспозиция по шаблонам) vs глубина (логика приложения / активные инъекции) — комплементарны.
- **IS3** Ward #70 ↔ Larastan #12 / Semgrep #25: misconfig/secrets/deps-сканер Laravel vs типы / generic-паттерны. Dep-скан Ward пересекается с Trivy #26 / Dependabot #27 — информационно, не гейт.
- **IS4** pdn-152fz-audit #71 ↔ pg_anonymizer #29: аудит + направление (где ПДн, всё ли закрыто) vs инструмент маскирования.
- **IS5** pdn-152fz-audit #71 ↔ D2 (право/юрист): техника + 152-ФЗ-чек-лист vs юридическое оформление документов.
- **IS6** threat-model #72 ↔ Trail of Bits `audit-context-building` #39: наш портал + STRIDE + going-public vs generic deep code-audit.
- **IS7** security-go-live #73 ↔ `audit-portal`: только безопасность + go-live-вердикт vs полный 14-фазный аудит; #73 *вызывает* D3, не заменяет.
- **IS8** «боевая» проверка (#68/#69) на бою: гард — по умолчанию локальная/тестовая копия (127.0.0.1); бой только осознанно и аккуратно.
- **IS9** провенанс-гейт: каждый внешний (ZAP/Nuclei/Ward) читается и проверяется на происхождение ДО установки (риск ≈13% ToxicSkills) — расширение процедуры `docs/audit/` attack-surface. Артефакт — `docs/security/infosec-vet.md`.

## Alternatives Considered

- **Enlightn (#70 исходный)** — отклонён: abandoned (Packagist), `composer.json` без Laravel 13, мейнтейнер не отвечает 3+ мес. Заменён Ward.
- **Готовые маркетплейс-скилы threat-model / compliance** (fr33d3m0n, josemlopez, sickn33, и пр.) — отклонены для #71/#72: generic-методика (GDPR/SOC2, не 152-ФЗ; не знают устройство Лидерры) + риск ToxicSkills. Берутся как референс, не установка.
- **Larafence** — отклонён: не выпущен (Q2 2026) + TALL/Livewire-стек (у нас Vue).
- **Psalm + plugin-laravel taint-analysis** — не для слота #70: код-SAST (taint), пересекается с Semgrep #25 (IS3); не config-сканер.
- **`laravel/agent-skills`** (официальный, чистый провенанс) — не security-сканер (общий Laravel-скил); опциональное доп. позже, не замена слота.
- **Платные tiers** (Enlightn Pro, Snyk, ProjectDiscovery Cloud) — только OSS (РФ-резидентность, near-zero cost).
- **Дедицированный dependency/SBOM-инструмент** — не добавляем: покрыто Dependabot #27 + Trivy #26 + ToB #39 + GitHub MCP (дубль §5 п.6).

## Consequences

**Positive:**

- A8 непуст: 0 → 6 дедицированных узлов. **Все установлены (21.05.2026):** Nuclei #69 + Ward #70 (CLI в `bin/`) + ZAP #68 (portable JRE 17, daemon verified) + 3 скила #71/#72/#73.
- Новая off-phase подкатегория `infosec-tooling` (17-я).
- Провенанс-вет (IS9) каждого внешнего инструмента до установки — расширяет ADR-003-дисциплину; чужие security-скилы в чувствительные слоты (#71/#72) не тащим (ToxicSkills).
- 152-ФЗ + угрозы-под-наш-портал сделаны своими скилами (РФ-/project-specific), а не generic-готовым.
- DAST-движки таргетят локальную копию по умолчанию (IS8) — безопасно для боевого портала.

**Negative:**

- ZAP #68 (alpha MCP + Java) и Ward #70 (Go) — **установлены портативно 21.05.2026** (без choco, по выбору заказчика «оба портативно»; setup-доки `docs/security/{zap,ward}-setup.md`). Footprint ~1.2 ГБ (Go SDK + JRE + ZAP) в `bin/*` gitignored. go-live-gate #73: шаг ZAP возвращает PENDING лишь при незапущенном ZAP-демоне (MCP-режим требует живого демона).
- Ward — молодой single-maintainer проект (bus-factor); митигация SHA-pin + MIT-форкабельность.
- Nuclei добавляет 126 МБ бинарь в `bin/` (gitignored, машинно-локальный) + 13k шаблонов.
- ПДн-скил полагается на pg_anonymizer, который сам DEFERRED (OPEN-И-24, фаза 3) — чек-лист честно помечает «проверить вручную».

## Related Decisions

- **ADR-002** — tenant isolation via RLS; её правило драйвит ПДн-аудит (#71) и его технический режим.
- **ADR-003** — D3 audit-security toolset; A8 — технический домен, граница: #73 *вызывает* D3-инструменты, не заменяет (IS7); провенанс-дисциплина IS9 наследует «defer непроверенного» из ADR-003.

## References

- `docs/superpowers/specs/2026-05-21-a8-infosec-tooling-design.md` — design.
- `docs/superpowers/plans/2026-05-21-a8-infosec-tooling.md` — plan.
- `docs/security/infosec-vet.md` — IS9 провенанс-вет (вкл. §ПЕРЕСМОТР #70 Enlightn→Ward).
- `docs/security/nuclei-setup.md` — установка/квирки Nuclei.
- `docs/Открытые_вопросы_v8_3.md` — серверный слой (open questions).
