Skip to content

Releases: onixus/Shapoclyack

shapoclyack-0.48-1021

Choose a tag to compare

@onixus onixus released this 22 Oct 09:30
1980543

Shapoclyack 0.48-1021

Первый стабильный релиз после 0.46 (сентябрь). В него вошло всё, что обкатывалось в кандидате 0.47-1009-rc1, и месяц работы сверху. Отдельного стабильного 0.47 не будет: с 0.46 обновляйтесь сразу на 0.48.

Главное: Shapoclyack больше не использует Nmap. Обнаружение сервисов, определение ОС, поиск хостов в локальной сети и проверки, которые раньше делали NSE-скрипты, теперь выполняет собственный движок Pulse вместе с Nuclei. Nmap и его скрипты убраны из образов и из кода. Это снимает вопрос с лицензией Nmap (NPSL): продукт можно поставлять без оговорок. Цена — нужно поправить конфигурации, где явно выбран Nmap (см. «Перед обновлением»).

Что нового

Сканирование

  • Pulse обновлён до v1.4.0. Он сам перебирает наборы шифров TLS и ставит каждому оценку от A до F — раньше это умел только Nmap.
  • Плагины для Pulse находят типовые слабые места: устаревшие алгоритмы SSH, анонимный вход по FTP, почтовые и прочие сервисы без TLS, открытые наружу SMB, RDP и VNC, метод TRACE на веб-серверах.
  • Проверки, которые раньше давали NSE-скрипты категории vuln, перенесены на шаблоны Nuclei и плагины. Например, «SMB без обязательной подписи». Что пока не покрыто, перечислено в документации прямо.
  • Поиск живых хостов в локальном сегменте (ARP, NetBIOS, mDNS) тоже идёт через Pulse.
  • Версия пакета дистрибутива (например, 4ubuntu0.13 у OpenSSH) теперь хранится отдельно от версии продукта. Поиск CVE по версии учитывает бэкпорты и реже ложно срабатывает на пропатченных системах.
  • Направленный режим Nuclei (включается явно) запускает только подходящие шаблоны и честно пишет, что и почему пропустил. Зависший хост больше не останавливает проверку остальных.

Находки и доказательства

  • Повторная обработка результатов больше не сбрасывает ручное закрытие находки, её привязку к процессу и текущую оценку.
  • Находки без CVE, проверенные вручную, идут через тот же процесс разбора, что и остальные.

Доверие к сенсорам

  • Каждый сенсор подписывает свои результаты ключом Ed25519, а API проверяет подпись. Пока неподписанные результаты только отмечаются предупреждением. Требовать подпись от всех можно включить настройкой, когда весь парк сенсоров обновлён.
  • Архив результатов проверяется по схеме до распаковки. В этом релизе по умолчанию нарушения тоже только отмечаются, а не отвергаются.
  • Сенсор может отдавать /healthz и метрики (по умолчанию выключено).

Интеграции и отчёты

  • Тикеты можно заводить в GitHub и GitLab Issues, наряду с Jira, ServiceNow и DefectDojo. Шаблон заголовка и описания, метки, приоритет и проект настраиваются, статус синхронизируется в обе стороны.
  • Отчёты выгружаются в CSV и XLSX, каждый получает подписанный манифест для проверки целостности, а расписание может класть их в S3.
  • Активы подтягиваются из CMDB ServiceNow по расписанию.
  • У API появились стабильные пути /api/v1 с политикой устаревания на 12 месяцев, потоковые выгрузки CSV/NDJSON и готовый клиент на Python.
  • Сервисные токены можно ротировать с перекрытием по времени, ограничивать по адресам и получать заранее уведомление об истечении.

Развёртывание и консоль

  • Есть Helm-чарт. Он собран из тех же манифестов Kustomize и не даст развернуться с публичными демо-паролями или с Ingress без TLS.
  • В консоли можно сохранять личные представления (фильтры), мобильное меню доступно с клавиатуры.
  • Снятие скриншотов веб-сервисов браузером убрано: оно не поддерживалось. Старые скриншоты остаются доступны.

Безопасность образов

  • В образах api и aio стоит свежий клиент OpenSSH 10.6p1 (закрывает CVE-2026-60002).
  • dnsx, naabu и nuclei пересобраны на Go 1.26.10, обновлены certifi, Pillow и aiohttp. На момент сборки Trivy не находит в образах уязвимостей HIGH и CRITICAL, для которых уже есть исправление.

Подробности по каждому пункту — в заметках к релизу и CHANGELOG.

Перед обновлением

  1. Сделайте резервную копию PostgreSQL и хранилищ артефактов. Из 0.46 применятся миграции 0060–0096, откат образа не откатывает базу.
  2. Уберите Nmap из конфигураций. service_probe.backend: nmap или hybrid, nmap_timing, NSE-профили и pulse.os_mode: nmap теперь отвергаются при загрузке с подсказкой, на что заменить. Сохранённые в консоли настройки с Nmap тоже нужно поменять. Руководство — Migrating off Nmap.
  3. Пересоздайте StatefulSet сенсора в Kubernetes. У shapoclyack-scanner-executor появился том для ключа подписи, а такое изменение Kubernetes не применяет к существующему StatefulSet. Выполните kubectl -n <ns> delete statefulset shapoclyack-scanner-executor --cascade=orphan и примените манифесты заново.
  4. За ingress задайте OCTO_TRUSTED_PROXIES. Без этой переменной все запросы выглядят пришедшими с адреса ingress, поэтому ограничение попыток входа и фильтр адресов у сервисных токенов работают неправильно.
  5. Шаги из заметок к rc1 (миграция идемпотентности, MFA, подписанные сборки агента) тоже относятся к переходу с 0.46.

Образов теперь три: scanner, api, aio. Варианты -nmap заканчиваются на 0.47-1009-rc1, тег latest-nmap больше не обновляется.

Состав

Компонент Версия
API и пакет сенсора 0.48-1021
Pulse v1.4.0, подписан, с пинами по платформам
Голова БД 0096_console_saved_views
Тег shapoclyack-0.48-1021 на 1980543b

Образы (linux/amd64, linux/arm64)

Разворачивайте по дайджесту, а не по тегу.

Образ Дайджест индекса
ghcr.io/onixus/shapoclyack-scanner:shapoclyack-0.48-1021 sha256:395ba59100a425c3a2a1a0e1420d42965c07e56d222bee53b21b618742fa526e
ghcr.io/onixus/shapoclyack-api:shapoclyack-0.48-1021 sha256:57ff1ab42e82cb6f12bacbc98f85c2a8ab2ac3909623f8dc5983bcbd94541341
ghcr.io/onixus/shapoclyack-aio:shapoclyack-0.48-1021 sha256:70ac7f954fa68de9c99025cc584817fc35db71fd1f4dc6c4a7118066c66d10d4

latest указывает на эти же индексы.

Проверка

Ключ подписи — cosign.pub на этом теге. SHA-256 его DER-формы:
f8d2cfa4bc0921b3f95c6cd176f9de900e63a562329383e83841a4ce8e0dae1c.

После публикации проверено:

  • cosign verify с -a release=shapoclyack-0.48-1021: подписи всех трёх индексов действительны;
  • cosign verify-attestation --type slsaprovenance1: по две аттестации на образ, ревизия 1980543b, PULSE_VERSION=v1.4.0, ENRICHMENT_STRICT=1;
  • scripts/verify-pulse-image.py с пинами этого тега и тарболами GenDec v1.4.0: VERIFIED для scanner и aio на linux/amd64 и linux/arm64. Бинарь совпадает с записью об установке и с pulse из закреплённого тарбола;
  • бандл сенсора shapoclyack-sensor-0.48-1021.tar.gz: подпись манифеста проверена cosign verify-blob --insecure-ignore-tlog (бандл подписывается без Rekor), SHA-256 архива f7926a66…51912 совпадает с манифестом, версия внутри — 0.48-1021.

Команды проверки — в Supply chain и Release contract.

CI на релизном коммите

Сборка Jenkins main #96 прошла:

  • lint и SAST;
  • pytest на Python 3.11 и 3.12, по 9108 тестов, покрытие 91 %;
  • web (677 тестов vitest) и E2E;
  • Trivy всех трёх образов и SBOM.

Затем #96 упёрся в 150-минутный лимит пайплайна на стадии Load. Нагрузочная стадия на этом коммите не завершилась.

В повторной сборке #97 на 3.12 упал один тест. Это дефект самого теста: подстрока 502 совпала с отметкой времени в job_id.

shapoclyack 0.47-1009-rc1

Pre-release

Choose a tag to compare

@onixus onixus released this 09 Oct 16:00
83ca8c5

Warning

Last release with bundled Nmap. shapoclyack-0.47-1009-rc1 is the last build that ships the -nmap image variants (shapoclyack-scanner:…-nmap, shapoclyack-aio:…-nmap). Starting with the next release Shapoclyack no longer builds or distributes Nmap (NPSL licence, #97). Nmap-based stages (L2 discovery, NSE) keep working when an nmap binary is on the scanner's PATH — install it yourself next to the sensor or in a derived image; a connection guide will ship with the next release.

This build bundles Pulse v1.1.0; the next release moves to the latest Pulse.

Release candidate. Full notes: CHANGELOG.md

Images are published by the shapoclyack-publish job.

Published images (Jenkins shapoclyack-publish #22, signed and verified)

Image Digest
ghcr.io/onixus/shapoclyack-scanner:shapoclyack-0.47-1009-rc1 sha256:4154ae79f819b5f392d97e6b6b1a59cb38d17885390485929a7742fb22117eb1
ghcr.io/onixus/shapoclyack-scanner:shapoclyack-0.47-1009-rc1-nmap sha256:980dabdc33e408d6ef56fbe9b4c2246ecde60b4a58871a7bc68bd7da19844d17
ghcr.io/onixus/shapoclyack-api:shapoclyack-0.47-1009-rc1 sha256:36992c7cbd3a92ee00f50c99e284266b4fee210590ae04fbe9feb96bebbaa65c
ghcr.io/onixus/shapoclyack-aio:shapoclyack-0.47-1009-rc1 sha256:1b471752040be7ab104dbb8661dd16137e475b6d08cf1f75975c53843c7600b0
ghcr.io/onixus/shapoclyack-aio:shapoclyack-0.47-1009-rc1-nmap sha256:49f2ac3f6c7e38337746e3d5a0097ecf3776a113d3d9fea8497eedce0ac54a62

latest / latest-nmap were not moved. The sensor bundle of this prerelease is unsigned and will not be installed by sensors. Repository deployment defaults stay on shapoclyack-0.46-0922.

Merged PRs since 0.46-0922

  • Merge pull request #538 from onixus/codex/prepare-0.47-1009-rc1
  • Merge pull request #535 from onixus/codex/docs-current-state-20261008
  • Merge pull request #534 from onixus/codex/issue-515-tls-revocation
  • Merge pull request #536 from onixus/codex/refactor-docs-installers
  • Merge pull request #533 from onixus/codex/issue-513-legacy-update-policy
  • Merge pull request #532 from onixus/codex/issue-517-idempotency-contract
  • Merge pull request #530 from onixus/codex/issue-516-maintenance-start
  • Merge pull request #519 from onixus/codex/lariska-p0-server
  • Merge pull request #520 from onixus/claude/ci-tests-on-linux-node
  • Merge pull request #529 from onixus/codex/docs-refresh-2026-10-06
  • Merge pull request #528 from onixus/claude/fix-tls10-local-policy-refusal
  • Merge pull request #527 from onixus/claude/dq1-verify-coverage
  • Merge pull request #526 from onixus/claude/dq4-web-fingerprint
  • Merge pull request #525 from onixus/claude/add-claude-md
  • Merge pull request #524 from onixus/claude/dq3-takeover-fingerprints
  • Merge pull request #523 from onixus/claude/dq2-tls-detection
  • Merge pull request #522 from onixus/claude/dq5-retro-products
  • Merge pull request #521 from onixus/claude/fix-sensor-bundle-ci
  • Merge pull request #518 from onixus/claude/fix-rate-limit-window-flake
  • Merge pull request #512 from onixus/claude/docs-roadmap-2026-10
  • Merge pull request #509 from onixus/claude/i309-sensor-mtls
  • Merge pull request #506 from onixus/claude/i363-signed-bundle
  • Merge pull request #511 from onixus/claude/i510-release-admin
  • Merge pull request #507 from onixus/claude/i316-idp-resync-scim
  • Merge pull request #505 from onixus/claude/i365-queue-admission
  • Merge pull request #508 from onixus/claude/i504-tenant-mfa
  • Merge pull request #503 from onixus/claude/fix-reaper-local-race
  • Merge pull request #500 from onixus/claude/i454-post-publication
  • Merge pull request #502 from onixus/claude/i350-asset-import
  • Merge pull request #501 from onixus/claude/i318-custom-roles
  • Merge pull request #499 from onixus/claude/i320-rate-limit
  • Merge pull request #497 from onixus/work/w11-custom-compliance
  • Merge pull request #496 from onixus/work/d3-calibration-evidence
  • Merge pull request #498 from onixus/fix/trivy-os-security-updates
  • Merge pull request #495 from onixus/codex/trivy-high-gate
  • Merge pull request #494 from onixus/fix/358-advisory-coverage
  • Merge pull request #493 from onixus/feat/449-evidence-shadow-contract
  • Merge pull request #492 from onixus/fix/453-scan-risk-criticality
  • Merge pull request #491 from onixus/fix/448-pulse-exact-endpoints
  • Merge pull request #459 from onixus/claude/i313-supply-chain
  • Merge pull request #489 from onixus/codex/fix-jenkins-integration
  • Merge pull request #480 from onixus/joke/compassionate-payne-64d4ef
  • Merge pull request #467 from onixus/joke/competent-lichterman-f99b3f
  • Merge pull request #488 from onixus/codex/persistent-sensor-id
  • Merge pull request #463 from onixus/claude/i338-k8s-hardening
  • Merge pull request #471 from onixus/joke/sad-northcutt-fb8f49
  • Merge pull request #487 from onixus/codex/ssh-sensor-identity
  • Merge pull request #486 from onixus/codex/nuclei-egress-policy
  • Merge pull request #472 from onixus/claude/sensor-run-retention
  • Merge pull request #485 from onixus/codex/webhook-nat64
  • Merge pull request #483 from onixus/joke/nostalgic-kalam-a3179c
  • Merge pull request #484 from onixus/joke/objective-kalam-4e942f
  • Merge pull request #482 from onixus/joke/amazing-feynman-38e16a
  • Merge pull request #479 from onixus/joke/musing-cohen-73d8ad
  • Merge pull request #466 from onixus/claude/i311-tenant-rls
  • Merge pull request #478 from onixus/joke/happy-meitner-a2879b
  • Merge pull request #477 from onixus/joke/objective-swanson-6e5166
  • Merge pull request #476 from onixus/joke/elastic-taussig-1bb9f2
  • Merge pull request #481 from onixus/claude/fix-nuclei-argv-order
  • Merge pull request #475 from onixus/joke/upbeat-franklin-ee5d90
  • Merge pull request #474 from onixus/joke/objective-rosalind-098657
  • Merge pull request #473 from onixus/claude/hermetic-proxy-env
  • Merge pull request #470 from onixus/joke/optimistic-carson-b59426
  • Merge pull request #458 from onixus/claude/i340-pulse-distribution
  • Merge pull request #464 from onixus/claude/i337-sizing-model
  • Merge pull request #462 from onixus/claude/i339-air-gap
  • Merge pull request #461 from onixus/claude/i334-observability
  • Merge pull request #460 from onixus/claude/i333-dr-beyond-postgres
  • Merge pull request #468 from onixus/claude/i325-tenant-lifecycle
  • Merge pull request #465 from onixus/claude/i332-tenant-retention
  • Merge pull request #443 from onixus/codex/i364-l2-ipv6
  • Merge pull request #446 from onixus/claude/trivy-fixable-highs-0923
  • Merge pull request #445 from onixus/joke/goofy-gates-7a1142
  • Merge pull request #444 from onixus/claude/retro-cve-match
  • Merge pull request #438 from onixus/codex/i424-nats-outbox-kind-priority
  • Merge pull request #441 from onixus/codex/i384-agent-auth-context
  • Merge pull request #440 from onixus/codex/i344-settings-check
  • Merge pull request #442 from onixus/codex/i362-secondary-stage-policy
  • Merge pull request #439 from onixus/codex/i345-pr-gate
  • Merge pull request #435 from onixus/claude/i425-run-publications
  • Merge pull request #436 from onixus/claude/i427-run-id-tenant-prefix
  • Merge pull request #437 from onixus/claude/i315-webauthn
  • Merge pull request #434 from onixus/claude/i314-refresh-tokens
  • Merge pull request #433 from onixus/claude/k8s-pin-0.46-0922

shapoclyack-0.46-0922

Choose a tag to compare

@onixus onixus released this 22 Sep 21:27
dda7318

Shapoclyack 0.46-0922

Релиз про то, чтобы принятый скан не терялся: результат сенсора теперь публикуется из долговечной записи, а не в порядке вызовов, а отказ брокера или хранилища стоит прогону задержки, а не существования.

Приём результатов: фенс и durable-публикация (#421, #423)

  • Ingest-lease на задании (0058_job_ingest_lease): терминальная запись условна по (job, attempt, owner, token), результат с устаревшей попытки получает 409 с X-Result-Rejection, а не дописывает чужой скан.
  • Артефакты распаковываются в staging, невидимый листингам; в той же транзакции появляется строка run_publications, и всё, что делает прогон видимым, делается из неё — в запросе или реконсилером любой реплики.
  • Гонки двух реплик, полу-загруженные деревья, откат, удалявший чужой прогон, OOM-циклы, сироты на emptyDir — закрыты; исчерпанная публикация уходит в dead и видна в /api/health, метриках и jobs.error.
  • Идентификатор прогона снова уникален: суффикс из шести hex после таймстампа.

NATS перестал ронять готовность (#423)

  • /readyz зависит только от Postgres. Брокер — advisory в /api/health, рядом новая проверка ingest_backlog.
  • Outbox nats_outbox (0059) для сообщений, которые брокер отверг, включая события активов и вебхуки; реконсилер досылает их с backoff. Новые метрики и алерты ShapoclyackNatsOutbox*, ShapoclyackAssetEventsSkipped.
  • Стрим INGEST получил duplicate_window, так что повтор публикации — дубликат, который стрим отбрасывает.

Установка и поставка

  • scripts/install-server.py — установка готового all-in-one образа и PostgreSQL через Docker Compose на один хост, образ по tag@sha256, секреты в 0600, API только на loopback, дамп перед миграциями. Гайд: docs/server-install.ru.md. Сквозной smoke на живом хосте ещё не подтверждён.
  • Pulse закреплён по дайджесту, образ собирается и без него (INSTALL_PULSE=0); подпись релиза GenDec проверяется при пиновке.

Платформа и код

  • APEX Architecture Contract v1: локальный гейт конформности, /api/v1 для границы агента.
  • Приём результатов ушёл с event loop на worker-поток за admission gate (OCTO_AGENT_RESULTS_MAX_CONCURRENT_INGESTS).
  • jobs.py — фасад; admission, executor, inputs, ingest и reaper — отдельные модули.
  • CI: единый набор проверок в scripts/ci-*.sh, гейт, требующий прогона интеграционных сьютов; сканы, запущенные тестами, больше не переживают тест.

Документация

  • Roadmap сертификации ФСТЭК (docs/fstec-certification.ru.md, Track F).
  • Датированный архитектурный обзор b12df58.

Полный список — в CHANGELOG.md.