Files
portal/docs/security/nuclei-setup.md
T
Дмитрий 05437ba79a feat(security): Nuclei #69 — install + verified smoke (CLI, not MCP)
bin/nuclei.exe v3.8.0 + 13060 templates. Smoke vs live portal verified
(1057 reqs sent to 127.0.0.1:8000, scan completed, 0 matched on tech tag).
Quirks documented: target 127.0.0.1 not localhost (resolver); low rate-limit
for single-threaded artisan serve. Wired as CLI (like gitleaks/squawk/Trivy),
not MCP — nuclei doesn't speak MCP; no .mcp.json/l1-watcher needed for #69.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 14:32:50 +03:00

4.5 KiB
Raw Blame History

Nuclei (#69) — установка и использование

Узел A8: #69 — широкое сканирование на известные уязвимости / небезопасную экспозицию. Источник (IS9-вет принят): projectdiscovery/nuclei v3.8.0, MIT (см. infosec-vet.md). Тип: CLI-сканер (Go-бинарь) — не MCP-сервер (см. «Решение по интеграции» ниже).


Установка (native-Windows)

Готовый бинарь (Go не требуется):

# v3.8.0 windows amd64, pin из IS9-вета
Invoke-WebRequest -Uri "https://github.com/projectdiscovery/nuclei/releases/download/v3.8.0/nuclei_3.8.0_windows_amd64.zip" -OutFile "$env:TEMP\nuclei.zip"
Expand-Archive "$env:TEMP\nuclei.zip" -DestinationPath "$env:TEMP\nuclei" -Force
Copy-Item "$env:TEMP\nuclei\nuclei.exe" "bin\nuclei.exe"
bin\nuclei.exe -update-templates -silent
  • Расположение: bin/nuclei.exe (рядом с gitleaks/lychee/squawk; bin/*.exe в .gitignore → бинарь машинно-локальный, в репозиторий не коммитится).
  • Шаблоны: ~/AppData/Roaming/nuclei + ~/nuclei-templates (13 060 yaml, v10.4.3 на 2026-05-21).
  • Verified: nuclei -version → v3.8.0 ✓.

Квирки native-Windows (важно)

  1. Цель — 127.0.0.1, НЕ localhost. Резолвер nuclei на этой машине падает на localhost ([INF] Skipped localhost:8000 ... no address found for host), хотя curl http://localhost:8000 → 200. Всегда указывать явный IPv4: -u http://127.0.0.1:<port>.
  2. Низкий rate-limit/concurrency для dev-сервера. php artisan serve однопоточный — под нагрузкой полного скана даёт массу connection-ошибок (в smoke: 1698 errors на 1057 запросов). Для локальной цели: -rate-limit 20 -c 5 (или ниже). Это не уязвимости, а таймауты/résets перегруженного dev-сервера.
  3. -duc (disable update check) — в офлайн/CI-прогонах, чтобы не дёргать сеть на проверку версии.

Smoke (verified 2026-05-21)

bin\nuclei.exe -u "http://127.0.0.1:8000" -tags tech -stats -timeout 5 -no-color -duc

Результат: 931 шаблон загружен, 1057/1059 запросов отправлено к цели, скан завершён (Scan completed), Matched: 0 (чисто на теге tech — ожидаемо для dev-портала). Доказывает: nuclei устанавливается, видит и сканирует живой портал. (Первый прогон по localhost цель пропустил — см. квирк 1; по 127.0.0.1 отработал.)

Решение по интеграции: CLI, не MCP

В IS9-вете слот #69 предполагал «self-authored MCP-wrapper». При реализации уточнено: nuclei не говорит на протоколе MCP — обернуть его в MCP-сервер = писать собственный MCP-серверный код (доп. attack surface + поддержка). Вместо этого nuclei интегрируется как CLI-инструмент — ровно как уже существующие security-CLI проекта (gitleaks #8, squawk #15, Trivy #26): бинарь в bin/, вызывается по требованию из Bash скилом go-live (#73). Преимущества: ноль чужого/своего обёрточного кода между Claude и бинарём; единообразие с тулчейном; минимальный attack surface. Следствие: для #69 не нужны .mcp.json-блок и l1-watcher alias (они только для настоящих MCP-серверов; #68 ZAP — единственный MCP в наборе).

Использование

# Цель ВСЕГДА 127.0.0.1 (квирк 1); бережный режим для dev (квирк 2)
bin\nuclei.exe -u "http://127.0.0.1:8000" -rate-limit 20 -c 5 -timeout 5 -duc -severity medium,high,critical

Гард IS8: по умолчанию — локальная/тестовая копия (127.0.0.1). Боевой сервер — только по явной команде заказчика.