Security patch release on top of v0.10 — closes two reporter-filed CVEs and lands 6 upstream-hardening packs.
CVEs closed
| CVE | Severity | Advisory | Reporter |
|---|---|---|---|
| CVE-2026-25058 | HIGH (7.5) | Unauthenticated internal transcript endpoint exposed by default | Ariel Silver (@SilverPlate3) |
| CVE-2026-25883 | MED (5.8) | SSRF in the Vexa webhook feature | Ariel Silver (@SilverPlate3) |
Both reports were filed 2026-01-28/29 under a 60-day coordinated disclosure embargo. Fix-and-publish in this release.
Hardening packs
- Pack A —
meeting-apiGET /internal/transcripts/{id}now requiresX-Internal-Secret(fail-closed admin-api pattern; 503 ifINTERNAL_API_SECRETunset andDEV_MODE=false). Closes CVE-2026-25058. - Pack B — webhook SSRF regression guard: 20+ URL pytest matrix (cloud metadata, RFC1918, IPv6 ULA/link-local, multicast, internal Docker hostnames, non-http schemes).
validate_webhook_urlwas shipped earlier; this locks it in so a future refactor cannot silently drop it. - Pack C.1 — explicit
h11>=0.16.0pin across every Python service's requirements (10 files). Closes transitive CVE-2025-43859 (HTTP/1.1 pipelined response-header leak).httpx>=0.28.1bumped where needed to satisfy the h11 constraint. - Pack C.2 —
docs_url/redoc_url/openapi_urlenv-gated onVEXA_ENVacross 9 FastAPI services. Default-deny onVEXA_ENV=production; on in development / staging. - Pack D — CDP WebSocket proxy:
webSocketDebuggerUrlrewrite preserves the inbound scheme viaX-Forwarded-Proto(emitswss://behind HTTPS gateways, notws://).- Bare
/b/{token}/cdpaccepted as a first-class route (no more 307 scheme-downgrade via FastAPI's defaultredirect_slashes=True). - Unblocks Playwright
chromium.connectOverCDP()against hosted deployments. See #122.
- Pack E.1 —
basic-ftpbumped 5.0.5 → 5.3.0 in bothservices/vexa-bot/lockfiles. ClosesGHSA-6v7q-wjvx-w8wg(CRLF injection),GHSA-chqc-8p9q-pq6q(CRLF injection),GHSA-rp42-5vxx-qpwr(DoS).
Infrastructure
deploy/compose/docker-compose.yml+deploy/helm/charts/vexa/templates/deployment-meeting-api.yamlboth passINTERNAL_API_SECRETinto the meeting-api container; helm reads from the existing admin-token secret.
PRs
Upgrade
docker compose pull && docker compose up -d --force-recreate
# or pin explicitly:
IMAGE_TAG=v0.10.1 docker compose up -d --force-recreatevexaai/*:latest already points here.
Credit
Huge thanks to Ariel Silver for the detailed reports, the CVSS analysis, and for the extended patience through the release cycle.