Changelog
We released two smaller hardening changes that reduce attack surface and make policy configuration more durable, regardless of which Pomerium product you run.
Highlights:
Distroless, SSL-free published images — Pomerium's published container images now build on the base-nossl-debian12 distroless variant instead of base-debian12, structurally removing the unused libssl3 library from every deployment rather than just leaving it unused.
GitHub directory provider can key users by node_id — as an alternative to the GitHub login (username), which can change or be reused, the GitHub directory provider can now use GitHub's stable node_id as the primary key for directory users — so policy written against a person doesn't break if they rename their GitHub account.
See the core deployment documentation for image and configuration details.
Several operability fixes and small features for the Pomerium Enterprise Console, covering startup configuration, a returning health view, and two bugs reported by customers.
Highlights:
Configure the directory provider via CLI — the console now accepts -directory-provider and related startup flags, so directory sync can be fully configured without touching the web UI.
Automatic console route creation — a new -url startup flag lets the console create its own Pomerium route on first boot, removing a manual setup step for new installs.
Cluster health view is back — the cluster health panel, previously removed along with a discontinued data-grid dependency, has returned in a lighter-weight implementation.
Fixed SSH Host Key / User CA Key validation — the console previously rejected valid SSH Host Keys and User CA Keys with a proto-constraint validation error even when both were already uploaded; saving now works as expected.
See the Enterprise Console configuration reference for the full set of startup options.
The July 6 changelog Upstream OAuth for MCP routes covered Pomerium acting as an OAuth client toward upstream MCP servers. This update is about the other leg of the proxy — Pomerium acting as the authorization server for the downstream clients (Claude Code, ChatGPT, MCP Inspector, and others) that connect to it. There are also a few compatibility and credential-hygiene fixes along the way.
Highlights:
OAuth Client ID Metadata Document (CIMD) support, inbound — Pomerium's MCP authorization server now accepts client identification from downstream clients via a Client ID Metadata Document, the lighter-weight registration path the MCP OAuth spec is converging on. (Not to be confused with the upstream DCR fallback shipped in July, which covers the opposite direction — Pomerium registering with upstream MCP servers.)
Configurable inbound Dynamic Client Registration in Pomerium Zero — inbound DCR (downstream clients registering with Pomerium itself) now ships behind a runtime flag, off by default in Pomerium core, and enabled by default for MCP routes in Zero, but there's a toggle in Zero cluster settings in the MCP section to turn it on/off per cluster.
Loopback redirect URIs are now RFC 8252-compliant — CLI clients like Claude Code that request a different loopback port than the one originally registered no longer fail MCP OAuth authorization; Pomerium ignores the port when matching localhost/loopback redirect URIs, per RFC 8252 §7.3.
Relaxed client_id metadata URL validation — client identifier URLs that include a query string, as ChatGPT's MCP connector sends, are no longer rejected with a 400.
See the MCP documentation for setup details.
Pomerium's MCP gateway now handles more of the OAuth complexity that real-world MCP servers require. This update adds upstream OAuth support with token caching and injection, Dynamic Client Registration as a fallback for clients that don't yet support Client ID Metadata Documents, auto-discovery for MCP connect flows, and the first MCP-facing configuration APIs. The result is less manual upstream OAuth configuration, more reliable session handling, and a cleaner experience in the routes portal.
Highlights:
Upstream OAuth for MCP routes – Pomerium can now discover upstream OAuth metadata, complete upstream authorization flows, cache client and token state, and inject upstream access tokens into MCP traffic when the target server requires them.
Dynamic Client Registration fallback – Pomerium now supports DCR for upstream OAuth flows, providing a practical path for tools like MCP Inspector while Client ID Metadata Document support matures across the ecosystem.
Issuer metadata in authorization flows – Pomerium now includes the recommended iss parameter in MCP authorization flows, aligning with the upcoming 2026-07-28 MCP spec. Pomerium's host is returned as the issuer, keeping authorization flows spec-compliant as the standard evolves.
Auto-discovery for MCP connect flows – MCP connect, disconnect, and authorize endpoints now support auto-discovery, reducing the static upstream OAuth configuration needed for compatible servers.
Safer metadata fetching – MCP metadata discovery uses SSRF-safe HTTP fetching and stricter protected-resource metadata handling, including path-prefix validation.
Better routes portal experience – MCP routes now show server indicators and connect/disconnect controls in the routes portal, making MCP-enabled routes easier to identify and manage.
More reliable upstream auth recovery – Pomerium refreshes expired upstream tokens before forcing reauthentication, recovers upstream auth after late config delivery, and surfaces clearer errors when upstream tokens can't be resolved.
Config API as MCP tools – A new pkg/mcp/configapi library exposes Pomerium's ConfigService as MCP tools, with generated schemas, sensitive-field handling, and update-safety checks — early building blocks for MCP-driven configuration workflows.
See the MCP support docs to learn how Pomerium secures MCP routes and manages upstream OAuth on behalf of clients.
Pairing with native SSH access, Pomerium Enterprise can now record and play back SSH sessions. Every keystroke and terminal output for a privileged SSH connection can be captured, stored, and reviewed later from the Console — giving security and compliance teams a full audit trail of what actually happened on a host, not just who connected.
Highlights:
Full session capture & playback – Record interactive SSH sessions and replay them later, terminal output and all, directly from the Enterprise Console.
Flexible storage – Point recordings at a local on-disk directory or any S3-compatible bucket, configured per cluster. In Pomerium Zero, recordings are stored in your organization's managed cloud bucket.
Guided storage setup in the Console – A new blob-URI builder in the Enterprise Console lets admins configure the recording storage location without hand-writing a connection string for each provider — it exposes the relevant Go CDK driver options, with a free-form field for advanced parameters.
Recordings UI – Browse, sort, and filter recordings in the Console by metadata such as the Pomerium route, the SSH user, the target host, duration, and size — then open one to play it back.
Open, portable format – Recordings are captured in an asciinema-style (.asciicast) format, so they're easy to store, parse, and replay.
Enterprise-gated – Native SSH access remains available in open source, while session recording is an Enterprise/Zero capability enabled for licensed customers.
See the Session Recording and Native SSH Access docs to get started.
Beyond the v0.32.0 feature release, the v0.32 line received a steady stream of patch releases focused on security and stability. Most notably, Envoy was updated several times to address CVEs, and a handful of session and configuration fixes landed. If you're on v0.32, staying current on patches is the easiest way to pick these up.
Highlights:
Envoy security updates – v0.32.3 moved to Envoy v1.36.5 to address five CVEs (CVE-2026-26308 through CVE-2026-26311 and CVE-2026-26330), and v0.32.9 moved to Envoy v1.36.8 to address CVE-2026-47774.
Additional security fixes – v0.32.8 includes a fix for advisory GHSA-ggw3-5987-rx77, and v0.32.2 shipped the MCP message-smuggling fix (MCP Go SDK v1.3.1).
Session & header handling – v0.32.6 removed exp and nbf from core sessions, and v0.32.9 increased Envoy header size limits to better handle large headers.
Reliability fixes – v0.32.2 limited the sync cache batch size to 128MB (avoiding Pebble's 4GB batch limit), v0.32.4 made autocert detect use_proxy_protocol changes on the HTTP redirect server, and v0.32.3 added a Databroker VersionedConfig proto and syncer.
Toolchain & dependency upkeep – Go was bumped through 1.25.9 (v0.32.5) and 1.25.10 (v0.32.7), alongside routine dependency updates across the 0.32 branch.
Revoking a session in the Enterprise Console now does what admins expect. Previously, revoking a session could appear ineffective: the user's browser would silently re-authenticate through SSO (a 302 redirect) and get a fresh session almost immediately. The Console now offers a "Revoke and block future authentication" option that stops that loop.
Highlights:
Revoke and block – The session revocation dialog adds a secondary option to block the user from re-authenticating, not just to end the current session.
No more silent re-auth – Blocking prevents the SSO re-authentication loop, so a revoked user stays out instead of bouncing back in through the IdP.
Policy-backed enforcement – Blocked users are added to a deny/revocation list so the block is enforced on subsequent requests.
This was a direct response to enterprise customer feedback and closes a real gap in incident response, where "revoke" needs to mean the user is actually out.
See the Enterprise Console docs for session management.
Pomerium's Native SSH Access takes a major step forward in v0.32.0. SSH logins now use the standard OAuth Authorization Code flow instead of the Device Code flow, the login experience is smoother end to end, and a new set of capabilities — reverse tunneling, jump-host mode, an interactive routes portal, and per-key session revocation — make identity-aware SSH practical to run at scale.
Highlights:
Authorization Code OAuth flow – SSH authentication now uses the Authorization Code grant rather than Device Code. The result is a faster, more familiar browser login, with telemetry signals throughout the flow so you can observe and debug it. (Note: upstream IdPs must have the Authorization Code grant enabled; v0.31.x and earlier used Device Code.)
Reverse tunneling – Reach SSH servers that can't accept inbound connections. Upstream hosts dial out to Pomerium and register themselves, and Pomerium routes authorized sessions back over that tunnel — ideal for edge devices, NAT'd networks, and isolated environments. Enabled with the ssh_upstream_tunnel runtime flag.
Jump-host (ProxyJump) mode – Let clients connect straight through Pomerium to the upstream while Pomerium still enforces policy on the connection. Upstream servers don't need to trust Pomerium's User CA in this mode. Enabled with the ssh_allow_direct_tcpip runtime flag.
Interactive routes portal – SSH to Pomerium without naming a route and get an interactive picker of the destinations you're allowed to reach, then connect with one selection. Enabled with the ssh_routes_portal runtime flag.
Per-key session management & revocation – Each SSH key is bound to an OAuth user, and bindings can be listed and revoked from the Pomerium UI at any time. Cached credentials honor your session lifetime, and policy is still evaluated on every connection.
SSH upstream policy support – Apply Pomerium policy to upstream SSH tunnels, with fixes for several edge cases uncovered along the way.
See the Native SSH Access and Reverse Tunneling docs to get started.
Pomerium v0.32.0 adds DNS configuration options, giving you direct control over how Pomerium resolves upstream hostnames. Instead of relying solely on the host system's resolver, you can now point Pomerium at specific DNS servers and tune how often it refreshes records — useful for split-horizon DNS, service discovery, and environments where upstream IPs change frequently.
Highlights:
Custom resolvers – Specify the DNS servers Pomerium should use to resolve upstream routes, independent of the underlying host configuration.
Tunable refresh behavior – Configure DNS refresh rates so Pomerium picks up record changes on a schedule that matches your environment, rather than caching stale addresses.
Consistent upstream resolution – Predictable, centrally configured name resolution across all Pomerium components, which matters most in dynamic and clustered deployments.
See the Pomerium configuration reference for the new DNS options.
Embrace Seamless Resource Access, Robust Zero Trust Integration, and Streamlined Compliance with Our App.