Repository navigation
Releases: onixus/Shapoclyack
Release list
shapoclyack-0.48-1021
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.
Перед обновлением
- Сделайте резервную копию PostgreSQL и хранилищ артефактов. Из 0.46 применятся миграции
0060–0096, откат образа не откатывает базу. - Уберите Nmap из конфигураций.
service_probe.backend: nmapилиhybrid,nmap_timing, NSE-профили иpulse.os_mode: nmapтеперь отвергаются при загрузке с подсказкой, на что заменить. Сохранённые в консоли настройки с Nmap тоже нужно поменять. Руководство — Migrating off Nmap. - Пересоздайте StatefulSet сенсора в Kubernetes. У
shapoclyack-scanner-executorпоявился том для ключа подписи, а такое изменение Kubernetes не применяет к существующему StatefulSet. Выполнитеkubectl -n <ns> delete statefulset shapoclyack-scanner-executor --cascade=orphanи примените манифесты заново. - За ingress задайте
OCTO_TRUSTED_PROXIES. Без этой переменной все запросы выглядят пришедшими с адреса ingress, поэтому ограничение попыток входа и фильтр адресов у сервисных токенов работают неправильно. - Шаги из заметок к 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с пинами этого тега и тарболами GenDecv1.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
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
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.