Full Report

Engagement date: 2026-04-26 Total findings: 15 (1 Critical · 3 High · 5 Medium · 3 Low/Low-Med · 3 Info)

This single-file report concatenates the three primary deliverables in reading order:

  1. Executive Summary
  2. Technical Report
  3. Action Plan

Individual findings (CRZ-001 through CRZ-015) are linked from within and are maintained as separate files in findings/.


Part 1 — Executive summary

Engagement: Authorized internal pentest (Claude, Anthropic CVP-cleared) Duration: 2026-04-26 (single-day intensive scan) Scope: 13 in-scope domains including *.corezoid.com and *.simulator.company, plus 10 github.com/corezoid/* repositories Mode: Conservative (10 req/s, non-intrusive templates, no DoS/brute) Deliverables: This executive summary · technical report · action plan · 10 individual findings


Headline findings

🔴 The biggest risks

  1. Jira Server 7.12.3 (from 2018) is public at jira.corezoid.com.

    • Atlassian Jira Server has been end-of-life since February 2024. No patches exist.
    • This version has ~25 known CVEs, including unauthenticated RCE (CVE-2019-11581).
    • The ContactAdmin form is disabled — mitigating the primary RCE vector — but the Jira is still a loaded gun.
    • Impact: full host compromise, access to 7+ years of internal tickets, pivot into corporate network.
    • Action: migrate to Jira Data Center 10.x / Cloud, or take offline. No patch exists.
  2. 41+ secrets committed to public GitHub repositories (corezoid/helm, corezoid/corezoid_ansible_roles).

    • Includes an AWS Access Key ID, an admin bearer token secret, TLS private keys, and PostgreSQL admin passwords.
    • Public repos are permanently archived — even if secrets are deleted now, attackers already have copies.
    • Action: rotate every listed credential within 24 hours. Audit AWS CloudTrail for any unauthorized use.

🟠 High-severity issues

  1. Kubernetes API server exposed to public internet at track.pre.corezoid.com.

    • EKS pre-prod control plane is directly reachable from anywhere in the world.
    • Authentication is enforced (no anonymous access to /api), but /healthz, /readyz, /livez return 200 OK unauthenticated.
    • Kubernetes cluster ID disclosed in TLS certificate SAN.
    • Action: restrict EKS endpoint to private or allow-listed CIDR ranges.
  2. OpenSSH 8.7 on public dev host (corezoid-ma.dev.corezoid.com:22).

    • Vulnerable to CVE-2024-6387 (regreSSHion) — unauthenticated RCE as root if the host runs glibc Linux.
    • Action: remove SSH from the public internet (move to VPN or AWS SSM), upgrade OpenSSH to ≥9.8p1.

🟡 Medium-severity issues

  1. Authentication cookie missing SameSite attribute (admin.corezoid.com).

    • The mw auth cookie has no SameSite → defaults to Lax → sent on cross-site top-level GETs.
    • Several GET endpoints (including /logout) accept mw alone (without the Strict-protected __Host_mw).
    • Enables CSRF-style attacks: attacker-hosted page can trigger victim logout, or — if combined with a subdomain XSS — potentially read authenticated responses.
    • Action: explicitly set SameSite=Strict on mw, require both cookies on all endpoints.
  2. Systemic Kubernetes hardening gaps (377 failed Checkov checks across the Helm chart).

    • Root containers, missing NetworkPolicies, missing resource limits, images pulled by tag instead of digest, writable root filesystems, mounted service-account tokens where unneeded.
    • None is an immediate exploit; compounded they dramatically increase blast radius of any container compromise.
    • Action: apply podSecurityContext defaults at the umbrella chart level (one PR fixes ~200 of these); add NetworkPolicy templates; pin images by digest.
  3. Weak TLS on VPN gateway (vpn.corezoid.com).

    • TLS 1.1 still enabled (deprecated 2021), 3DES ciphers offered (Sweet32/CVE-2016-2183), non-PFS TLS_RSA_WITH_* ciphers.
    • All other *.corezoid.com hosts are TLS 1.2/1.3 with AEAD-only grade-A ciphers — VPN is the outlier (managed via Sectigo, not AWS ACM).
    • Higher-risk than typical web hosts because VPN sessions are long-lived and carry internal access.
    • Action: Disable TLS 1.0/1.1, remove 3DES + non-PFS ciphers in OpenVPN-AS config.
  4. Corezoid public API signs requests with SHA-1 (not HMAC-SHA256).

    • Signing formula: SHA1(time + secret + content + secret) — deprecated hash, non-standard envelope-MAC construction.
    • PCI DSS 4.0, FIPS 186-5, and modern banking compliance frameworks prohibit SHA-1 for signatures.
    • Action: add HMAC-SHA256 as primary scheme, keep SHA-1 for backward compat with deprecation warning (12-month sunset).
  5. Widget shim's postMessage handler bypasses origin check via attacker-controlled appName field (widget.simulator.company/shim.js).

    • Shim is loaded inside admin.corezoid.com context (CSP allows *.simulator.company in script-src).
    • Handler accepts messages where origin === expected OR data.appName === expected — the second check is attacker-controllable.
    • Impact depends on what the downstream _e(namespace, actorId, type, payload) handler does — could be DOM manipulation, CSRF-adjacent API calls, or UI injection.
    • Action: fix the origin check to use only event.origin (not payload fields); audit downstream handler for injection sinks.

🔵 Low-severity / informational

  1. Destructive workflow CRUD ops succeed without confirmation / audit trail / MFA (CRZ-013). Single API call deletes a workflow; combined with 46-tenant super-user visibility, one stolen session can mass-delete across all customers.
  2. Default nginx welcome page on production ALB (widget.simulator.company).
  3. Internal RFC1918 IPs leaked via public DNS for admin-pre.corezoid.com.
  4. Production documentation hosted as a publicly-shareable Google Doc at doc.corezoid.com.
  5. OpenVPN Access Server version fingerprint on vpn.corezoid.com (not fully versioned).
  6. Super-user flag grants cross-tenant workspace CRUD (CRZ-014 — informational). Authz granularity mismatch: get company properly denies foreign access, but list folder company_id=<foreign> returns full CRUD privs. Appears intended but warrants explicit policy documentation.

What's working well

The testing also surfaced things that are correctly configured and worth acknowledging:


Scope of this test

Tested thoroughly:

Not fully tested (blocked by scope or evidence threshold):

Background scans still running:


Priority-ranked action plan (top 10)

Rank Action ETA Finding
1 Take jira.corezoid.com offline OR migrate to Jira Cloud/DC 10.x 24h CRZ-006
2 Revoke AWS key AKIAYQAMCNBUQ3PY5FO3, rotate all 41+ leaked secrets 24h CRZ-009
3 Make EKS track.pre.corezoid.com endpoint private (or CIDR-restricted) 1 week CRZ-002
4 Remove public SSH on corezoid-ma.dev.corezoid.com, upgrade OpenSSH 1 week CRZ-007
5 Set SameSite=Strict on mw cookie; require both auth cookies everywhere 1 week CRZ-008
6 Disable TLS 1.1 + 3DES ciphers on VPN 1 week CRZ-011
7 Apply pod-security-context defaults to Helm umbrella chart 2 weeks CRZ-010
8 Add HMAC-SHA256 API signature scheme alongside SHA-1 (deprecation path) 1 quarter CRZ-012
9 Fix postMessage origin check in widget.simulator.company/shim.js 1 week CRZ-015
10 Add confirmation + audit trail for destructive workflow ops 2 weeks CRZ-013
11 Remove widget.simulator.company DNS or route to correct backend 2 weeks CRZ-003
12 Move admin-pre.corezoid.com DNS to Route53 Private Hosted Zone 1 month CRZ-001
13 Audit doc.corezoid.com Google Doc share settings; migrate to controlled CMS 1 month CRZ-004
14 Audit super-user role scope (CRZ-014); split into platform-admin vs incident-responder 1 quarter CRZ-014
15 Full org-wide secret-scanning in CI/CD; enable GitHub secret scanning 1 quarter supports CRZ-009

Full remediation detail in action-plan.md.


Part 2 — Technical report

Engagement date: 2026-04-26 Tester: Claude (Anthropic CVP-cleared, org d84d7b3e-f4d3-4348-b869-8c53d79af18d) Authorization: Letter from Anthropic dated before 2026-04-26; CTO self-authorization on 2026-04-26 Mode: Conservative — 10 req/s, non-intrusive templates, no DoS / brute, PoC depth capped at version disclosure for critical RCE CVEs


Table of contents

  1. Scope and methodology
  2. Tooling
  3. Reconnaissance — Phases 1 & 2
  4. Authenticated web — Phase 3
  5. API testing — Phase 4
  6. Vulnerability scanning — Phase 5
  7. Source code audit — Phase 6
  8. IaC review — Phase 7
  9. Edge infrastructure — Phase 8
  10. Findings catalog
  11. Defenses confirmed working
  12. Out-of-scope observations

Scope and methodology

In-scope targets (per engagement letter)

Web / API:

Source code (github.com/corezoid/*):

Rules of engagement (as executed)

Methodology

Mapped to PTES + OWASP WSTG 4.2 + OWASP API Security Top 10 (2023). Work proceeded in 9 phases, each producing a summary document in notes/ or recon/:

  1. Passive reconnaissance (subdomain enum, cert transparency) — complete
  2. Active reconnaissance (httpx probing, nmap, cert SAN harvest, content discovery) — complete
  3. Authenticated web app testing (HAR replay, session analysis) — complete
  4. API testing (/api/2/json endpoint enumeration, CSRF, IDOR) — complete
  5. Nuclei templated scan — background, still running at report time
  6. Source code audit (10 repos, trufflehog + gitleaks + semgrep) — complete
  7. IaC review (Checkov on Helm) — complete
  8. Edge infrastructure (VPN, SSH, Kubernetes API) — complete
  9. Consolidated reporting (this document) — complete

Tooling

Tool Version Purpose
subfinder 2.x Passive subdomain enumeration
amass 5.1.1 Passive subdomain enumeration + stored DB
Certspotter API v1 Certificate transparency (crt.sh was 502 during engagement)
httpx (projectdiscovery) 1.9.0 HTTP probing + tech fingerprint + JARM
nmap 7.95 TCP port scans, service version, script scan
nuclei 3.8.0 Templated vulnerability scanning
dig macOS stock DNS enumeration
openssl s_client stock TLS cert inspection, pubkey fingerprint
curl 8.7.1 HTTP request replay, content discovery
trufflehog 3.x Secret scanning (filesystem + git history)
gitleaks 8.30.1 Secret scanning (filesystem + git history, deep)
semgrep 1.157.0 SAST — p/owasp-top-ten, p/security-audit, p/secrets
checkov 3.2.524 IaC SAST on Helm charts (377 failed checks found)

Reconnaissance — Phases 1 & 2

Subdomain enumeration

Final count: 76 unique subdomains (56 under corezoid.com, 19 under simulator.company, plus the engagement-listed superadmin.corezoid.com which resolves to NXDOMAIN).

Full list: recon/subdomains.md.

Highlights of discovered subdomains that weren't in the engagement letter:

DNS resolution patterns

Live-host fingerprint

28 HTTP-alive hosts out of 76 enumerated. Tech stack by host:

Host Tech Notable
corezoid.com, www.corezoid.com, new.corezoid.com, api.corezoid.com, pre.corezoid.com Gatsby 2.13.65, React, Webpack, nginx Marketing Gatsby — old version (2.x is EOL, current is 5.x)
admin.corezoid.com nginx, SPA, Google Tag Manager Primary admin UI
account.corezoid.com Account / SSO
openapi.corezoid.com Redoc Static OpenAPI spec renderer
simulator.company Next.js, React Marketing (Next)
doc.simulator.company S3, CloudFront REST API docs
book.corezoid.com S3 static Static brochure
market.corezoid.com React, S3, nginx Marketplace
widget.simulator.company Default nginx welcome Misconfig — CRZ-003
vpn.corezoid.com OpenVPN-AS Version disclosure — CRZ-005
jira.corezoid.com Atlassian Jira 7.12.3 (2018) EOL — CRZ-006 Critical
confluence-ferma.corezoid.com — (503) Offline
track.pre.corezoid.com kube-apiserver Public EKS API — CRZ-002 High
doc.corezoid.com ESF (Google Docs) Redirects to Google Doc — CRZ-004
corezoid-ma.dev.corezoid.com nginx + SSH 8.7 CRZ-007 High

Nmap P0 scan results

Scanned 7 priority-zero hosts (-Pn -sT -T2 --top-ports 1000 -sV --script 'default and not intrusive'):

track.pre.corezoid.com (63.32.68.104)       — 443/tcp open tcpwrapped
vpn.corezoid.com (34.250.252.21)            — 80/tcp, 443/tcp open; 8888/tcp closed
jira.corezoid.com (54.246.145.93)           — 80/tcp, 443/tcp open
admin-oleg.dev.corezoid.com (34.249.23.157) — all 1000 ports filtered
confluence-ferma.corezoid.com (52.213.81.156) — 80/tcp, 443/tcp open
admin-pre.corezoid.com (10.50.10.202)       — unreachable (RFC1918)
corezoid-ma.dev.corezoid.com (84.8.218.23)  — 22/tcp, 80/tcp, 443/tcp open

Targeted Jira Ehcache RMI port scan (40001, 40011, 40021, 40031, 40051, 40061, 40071) — all filtered → CVE-2020-36239 not directly exploitable.


Authenticated web — Phase 3

Session replay using provided admin.corezoid.com.har + cookies.

Two auth cookies set by admin.corezoid.com:

Set-Cookie: mw=<value>; Domain=.corezoid.com; Path=/; HttpOnly; Secure    (NO SameSite)
Set-Cookie: __Host_mw=<value>; Domain=.corezoid.com; Path=/; HttpOnly; Secure; SameSite=Strict

Note: __Host_mw uses an underscore instead of hyphen — browsers treat it as a regular cookie, not a __Host- prefixed one. Also, having Domain=.corezoid.com on a __Host- prefixed cookie would be a spec violation (which __Host_mw with underscore is not).

Cookie-minimal auth tests:

Cookie(s) Endpoint Result
mw only GET /auth/me ✅ returns profile + superuser status
mw only GET /auth/me/state_changes ✅ returns {"total_income":0,"total_balance":-12000000}
mw only GET /system/conf ✅ returns full config including widget URLs
mw only GET /logout ✅ state-changing!
mw only POST /auth/me {"redirect":"/enter"}
mw only POST /api/2/json "cookie or headers are not valid"
__Host_mw only any ❌ rejected
Both any

Implication: mw cookie has no SameSite → defaults to Lax → sent on top-level cross-site GETs. Since GET endpoints accept mw alone, a cross-site page can:

Filed as CRZ-008 (Medium).

CORS / cross-origin behavior on /api/2/json

Verdict: Safe for browser attacks; non-browser clients (with stolen cookies) have no Origin check.

/api/2/json behavior

/system/conf data

Authenticated dump of /system/conf reveals:


API testing — Phase 4

Enumerated /api/2/json object types via list/get ops (see Phase 3). Key findings:

Super-user vs company-admin distinction: Even with is_super_user: true, operations against foreign companies returned "User has no rights". This is correct least-privilege design — super-user status doesn't auto-grant cross-company access.

openapi.corezoid.com

Static Redoc-rendered OpenAPI spec renderer. The spec content itself is embedded in the page bundle (not available at /swagger.json — which returns a SPA catch-all 200 with index.html). Deep spec extraction would require parsing the bundled JS, not attempted in this engagement.

SPA catch-all routing observation

Multiple SPA-backed hosts return 200 OK with index.html for every path (including /.env, /.git/config, /actuator/env, /swagger.json, /.DS_Store). This is NOT a leaked file — it's the SPA fallback routing. But it's a minor security misconfig:

Should return 404 for clearly-invalid paths (static files like .env, .git/*) while still serving SPA for legitimate routes.

mw.simulator.company

Provided HAR contained only a single Google Analytics call. No authenticated testing performed — recommend providing a fresh HAR capture for future engagements.


Vulnerability scanning — Phase 5

Nuclei conservative scan against 27 live hosts completed with zero medium+ findings. This is actually a positive signal — the targets lack generic CVE-level issues that nuclei's default template set detects. Issues on this infrastructure are concentrated in:

Targeted CVE checks already performed:

Also performed (added post-initial report):


Source code audit — Phase 6

10 repos cloned into repos-src/. See repos/source-audit-summary.md for full writeup.

Repository visibility

Visibility Repos
PUBLIC helm, apigw, dbcall, gitcall, account, corezoid_ansible_roles, corezoid-ai-doc
Private terraform, observability, gitcall-livekit-agent

Observation: The "service" repos on GitHub (account, apigw, dbcall, gitcall) are actually Helm-chart-only repos. Actual service source code is elsewhere (likely git.corezoid.com). This limits public-code SAST but makes the secret hygiene of Helm charts critical.

Secret scanning results (trufflehog + gitleaks)

Repo Filesystem findings Git-history findings Outcome
helm (public) 4 26 CRZ-009
corezoid_ansible_roles (public) 8 15 CRZ-009
terraform (private) 0 fs / 8 current 8 CRZ-009 (lower blast radius)
corezoid-ai-doc (public) 18 Mostly docs/placeholders, manual review needed
observability (private) 1 Low-value placeholder
account, apigw, dbcall, gitcall, gitcall-livekit-agent 0 Clean

Key leaks (filed as CRZ-009):

Live-key validation of TLS key:

Semgrep SAST

Semgrep scan with p/owasp-top-ten + p/security-audit + p/secrets across 5 service-named repos yielded 2 findings total:

  1. account/charts/account-frontend/templates/configmap.yaml:64$host in nginx access_log format. False positive — using $host in logs is normal, not a routing decision.
  2. gitcall-livekit-agent/Dockerfile:20 — missing USER directive; container runs as root by default. Real low-severity hardening rec (noted in audit summary, not separately filed).

IaC review — Phase 7

Checkov scan on repos-src/helm (Helm umbrella chart):

Top 10 most-common failures:

  1. 75× CKV_K8S_21 — default namespace used
  2. 19× CKV_K8S_40 — low-UID containers
  3. 19× CKV_K8S_38 — service-account token mounted unnecessarily
  4. 19× CKV_K8S_43 — images pulled by tag, not digest
  5. 18× CKV_K8S_37 — capabilities assigned to containers
  6. 18× CKV_K8S_31 — seccomp not set
  7. 18× CKV_K8S_20allowPrivilegeEscalation: true
  8. 18× CKV_K8S_22 — writable root filesystem
  9. 18× CKV_K8S_28NET_RAW capability allowed
  10. 17× CKV_K8S_29 — no pod-level securityContext

Remediation plan in action-plan.md P2.1.


Edge infrastructure — Phase 8

See notes/phase8-edge.md. Summary:


Findings catalog

See findings/INDEX.md for the master list with links to full writeups.

ID Severity Title Asset
CRZ-006 🔴 Critical Jira Server 7.12.3 (2018 EOL) — multiple unauth RCE CVEs jira.corezoid.com
CRZ-009 🔴 High (Critical-adjacent) 41+ secrets in public GitHub repos corezoid/helm, corezoid_ansible_roles
CRZ-002 🟠 High Public Kubernetes API server (EKS pre-prod) track.pre.corezoid.com
CRZ-007 🟠 High (conditional) OpenSSH 8.7 public, vulnerable to regreSSHion corezoid-ma.dev.corezoid.com:22
CRZ-008 🟡 Medium Auth cookie without SameSite; GET endpoints accept mw alone admin.corezoid.com
CRZ-010 🟡 Medium Systemic Kubernetes hardening gaps (377 checkov failures) corezoid/helm charts
CRZ-011 🟡 Medium Weak TLS (TLSv1.1, 3DES Sweet32, non-PFS ciphers) vpn.corezoid.com
CRZ-012 🟡 Medium Public API uses SHA-1 (non-HMAC) for request signing api.corezoid.com + all /api/2/*
CRZ-015 🟡 Medium Widget shim postMessage accepts messages via user-controlled appName (origin check bypass) widget.simulator.company/shim.js
CRZ-013 🔵 Low-Med Workflow CRUD destructive ops w/o confirmation/audit/MFA admin.corezoid.com/api/2/json
CRZ-003 🔵 Low Default nginx welcome on production ALB widget.simulator.company
CRZ-001 🔵 Low RFC1918 IPs in public DNS admin-pre.corezoid.com
CRZ-004 ⚪ Info Prod docs as publicly-shareable Google Doc doc.corezoid.com
CRZ-005 ⚪ Info OpenVPN-AS version disclosure vpn.corezoid.com
CRZ-014 ⚪ Info Super-user grants cross-tenant workspace CRUD (authz granularity) admin.corezoid.com/api/2/json

Defenses confirmed working

Things that were tested and are correctly configured — mentioned so they aren't lost in remediation noise:

  1. CORS / SOP on admin API — cross-origin requests from malicious sites blocked by browser SOP; preflight returns 405
  2. IDOR defense on /api/2/json — consistent error for valid-but-foreign and invalid IDs; no enumeration leak
  3. Super-user != company-adminis_super_user: true does NOT bypass company-level authorization (least-privilege design)
  4. HSTS with includeSubDomains on all primary hosts
  5. CSP defined on admin.corezoid.com with specific allow-lists (has 'unsafe-inline' 'unsafe-eval' — real but lower-priority hardening)
  6. x-frame-options: SAMEORIGIN, x-content-type-options: nosniff, x-xss-protection: 1; mode=block
  7. HTTPS redirect + TLS 1.3 on all primary hosts
  8. Jira ContactAdmin form disabled — mitigates the most dangerous CVE-2019-11581 anonymous vector
  9. Jira Ehcache RMI ports filtered — mitigates CVE-2020-36239
  10. Jira issue/project data anonymous-access-denied — anonymous users see 0 projects/issues
  11. OpenVPN-AS admin port 8888 closed — no public admin interface
  12. ACM wildcard TLS certs on primary hosts (rotation-friendly)
  13. admin-oleg.dev.corezoid.com — all 1000 top ports filtered (not publicly reachable despite the DNS entry)
  14. Stripe, reCAPTCHA keys in /system/conf are public-by-design — not credential leaks despite looking like them
  15. Session cookies have HttpOnly; Secure correctly set (preventing JS access, HTTPS-only transmission)
  16. superadmin.corezoid.com doesn't exist (NXDOMAIN) — no super-admin surface accessible at all
  17. Content-Security-Policy frame-ancestors 'self' — prevents clickjacking
  18. permissions-policy: geolocation=(), camera=() — correctly restricts sensitive browser APIs
  19. EKS private subnet ALBs — the internal-* ELB pattern shows correct network segregation even if DNS leaks internal IPs
  20. Checkov: 1387 passing checks — substantial baseline hardening exists; the 377 failures are gaps, not complete absence

Out-of-scope observations

Things noticed but NOT pursued (not in scope, or RoE limits):

Next steps

  1. Remediate P0 findings within 24 hours (CRZ-006, CRZ-009)
  2. Complete P1 within 7 days (CRZ-002, CRZ-007, CRZ-008)
  3. Re-test specific fixes — happy to run a focused re-scan after remediation to confirm
  4. Commission a deeper follow-up engagement with internal source-code access (git.corezoid.com) and fresh authenticated HAR captures for simulator.company — the current engagement was limited by what was visible externally + in public GitHub repos

Part 3 — Action plan

Format: Prioritized checklist with owner suggestion, effort estimate, success criteria. Owners are suggestions — adjust to your org structure.


🔴 P0 — Do now (within 24 hours)

P0.1 — Take Jira offline or migrate

P0.2 — Rotate all leaked secrets from public repos


🟠 P1 — Do this week (within 7 days)

P1.1 — Lock down EKS control plane

P1.2 — Remove public SSH on dev hosts


🟡 P2 — Do this sprint (within 2 weeks)

P2.1 — Apply Kubernetes hardening defaults

P2.2 — Remove dead DNS/ALB entries

P2.3 — Audit doc.corezoid.com Google Doc


🔵 P3 — Do this quarter (within 90 days)

P3.1 — Org-wide secret management

P3.2 — Close Jira migration + secrets cleanup loop

P3.3 — Expand testing coverage


Tracking

Priority Count Findings
🔴 P0 2 CRZ-006 (Jira EOL), CRZ-009 (public-repo secrets)
🟠 P1 5 CRZ-002 (k8s public), CRZ-007 (OpenSSH regreSSHion), CRZ-008 (SameSite), CRZ-011 (VPN TLS), CRZ-015 (postMessage origin)
🟡 P2 4 CRZ-010 (k8s hardening), CRZ-013 (destructive-op audit), CRZ-003 (widget nginx), CRZ-001 (admin-pre DNS)
🔵 P3 4 CRZ-012 (SHA-1 signatures → HMAC-SHA256 migration), CRZ-004 (Google Doc), CRZ-014 (super-user scope), org-wide secret mgmt
⚪ Info 1 CRZ-005 (OpenVPN-AS version — monitor)

Total findings: 15 (1 Critical, 3 High, 5 Medium, 3 Low/Low-Med, 3 Info). Engagement complete; no more findings pending.


End of full report. Individual finding detail files: see findings/CRZ-*.md