This release includes 4 security fixes for security teams reviewing exposed deployments.
Topics
Affected surfaces
ReleasePort's take
Light signalThe release hardens Gopher and Gemini parsers, scopes client certificates to prevent leakage, blocks SSRF IP disclosure, and adds several parsing/bug‑fix improvements.
Why it matters: Security fixes address Gopher menu truncation (RFC 1436 terminator), certificate scope leakage, SSRF IP exposure, and Gemini request deadline pinning—critical for protecting data integrity and confidentiality in protocol handling.
Summary
AI summarySecurity hardening for Gopher/Gemini parsing, client‑certificate scoping, SSRF leakage, and request deadlines plus fixes across Version, Commit handling, and Workflow logic.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Critical |
Gopher menu parser now stops at RFC 1436 '.' terminator, ignoring trailing data. Gopher menu parser now stops at RFC 1436 '.' terminator, ignoring trailing data. Source: llm_adapter@2026-06-10 Confidence: high |
— |
| Security | High |
Client certificates are scoped to path-segment boundaries, preventing leakage to sibling paths. Client certificates are scoped to path-segment boundaries, preventing leakage to sibling paths. Source: llm_adapter@2026-06-10 Confidence: high |
— |
| Security | High |
Blocked SSRF target no longer echoes resolved internal IP back to caller; only logged server‑side. Blocked SSRF target no longer echoes resolved internal IP back to caller; only logged server‑side. Source: llm_adapter@2026-06-10 Confidence: high |
— |
| Security | High |
Gemini request send bounded by request deadline, preventing peer from pinning request until OS TCP timeout. Gemini request send bounded by request deadline, preventing peer from pinning request until OS TCP timeout. Source: llm_adapter@2026-06-10 Confidence: high |
— |
| Bugfix | Medium |
Gemini status‑20 response with absent/unparseable MIME now defaults to text/gemini instead of being misclassified as binary. Gemini status‑20 response with absent/unparseable MIME now defaults to text/gemini instead of being misclassified as binary. Source: llm_adapter@2026-06-10 Confidence: high |
— |
| Bugfix | Medium |
Client‑certificate scope lookup normalizes host (case / trailing dot) to match TOFU and SSRF/allowlist paths. Client‑certificate scope lookup normalizes host (case / trailing dot) to match TOFU and SSRF/allowlist paths. Source: llm_adapter@2026-06-10 Confidence: high |
— |
| Bugfix | Medium |
Client‑certificate common name parsed via cryptography library, preventing truncation of escaped commas. Client‑certificate common name parsed via cryptography library, preventing truncation of escaped commas. Source: llm_adapter@2026-06-10 Confidence: high |
— |
| Bugfix | Medium |
IPv6 literal hosts are now bracketed in all constructed gopher:// and gemini:// URLs, avoiding colon collisions with port separator. IPv6 literal hosts are now bracketed in all constructed gopher:// and gemini:// URLs, avoiding colon collisions with port separator. Source: llm_adapter@2026-06-10 Confidence: high |
— |
| Bugfix | Medium |
Gopher menu item with out‑of‑range numeric port (>65535) now degrades to default port 70 instead of dropping the whole item. Gopher menu item with out‑of‑range numeric port (>65535) now degrades to default port 70 instead of dropping the whole item. Source: llm_adapter@2026-06-10 Confidence: high |
— |
| Bugfix | Medium |
Gopher client no longer caches error responses, serving fresh transient failures instead of stale cached errors. Gopher client no longer caches error responses, serving fresh transient failures instead of stale cached errors. Source: llm_adapter@2026-06-10 Confidence: high |
— |
| Bugfix | Low |
Response cache keys are now case‑insensitive in hostname, sharing entries for same resource with different host case. Response cache keys are now case‑insensitive in hostname, sharing entries for same resource with different host case. Source: granite4.1:30b@2026-06-10-audit Confidence: high |
— |
| Bugfix | Low |
`GopherURL` rejects an empty host at the model boundary (symmetry with `GeminiURL`). `GopherURL` rejects an empty host at the model boundary (symmetry with `GeminiURL`). Source: granite4.1:30b@2026-06-10-audit Confidence: high |
— |
Full changelog
Security
- The Gopher menu parser now stops at the RFC 1436
.terminator, so data a
server appends after the terminator is no longer parsed into navigable items.
The terminator check now also tolerates trailing whitespace (a". "line),
so a non-conformant server can't slip later items past what reads as the end. - Client certificates are now scoped on path-segment boundaries: a certificate
for/apiis no longer sent to a sibling path such as/api_admin, closing
an identity-scope leak. - A blocked SSRF target no longer echoes the resolved internal IP back to the
caller (it is logged server-side only), so the error can't be used to map
internal network topology. - The Gemini request send is now bounded by the request deadline (the receive
side already was), so a peer that completes the handshake then stops reading
can't pin the request until the OS TCP timeout.
Fixed
- A Gemini status-20 response with an absent/unparseable MIME now defaults to
text/gemini(per the spec) instead of being content-sniffed and
misclassified as binary; genuine binary content is still detected by
signature. - Client-certificate scope lookup now normalizes the host (case / trailing
dot), matching TOFU and the SSRF/allowlist paths, so a host variant no longer
silently misses a stored client identity. - The client-certificate common name is now parsed via the cryptography
library, so a CN containing an escaped comma is no longer truncated (which
made the certificate unfindable on disk and silently unusable). - IPv6 literal hosts are now bracketed in every constructed
gopher://and
gemini://URL (menunextUrl, the URL formatters, the Gemini request line
and the display/log helper), so the address colons no longer collide with the
port separator and break re-parsing. - A Gopher menu item with a numeric but out-of-range port (>65535) now degrades
to the default port 70 instead of failing validation and dropping the whole
item. - The Gopher client no longer caches error responses, so a transient failure is
no longer served stale for the cache TTL (matching the Gemini client). - Response cache keys are now case-insensitive in the hostname, so the same
resource requested with a different host case shares one cache entry. GopherURLrejects an empty host at the model boundary (symmetry with
GeminiURL).
Changed
- Documentation: corrected the API reference (fresh connection per request, no
pooling), removed the non-existentGOPHER_HTTP_HOST/GOPHER_HTTP_PORTenv
vars (host/port are--host/--portCLI flags), and documented that the
HTTP transports are unauthenticated and the Docker image binds0.0.0.0:8000
by default. - Supply-chain hygiene: added a
.dockerignore(keeps.git/local.envout
of the Docker build context), SHA-pinned the third-party GitHub Actions, and
Release Information:
- Version: 0.4.3
- Release Date: 2026-06-10
- Commit: e0a78b4
- Workflow: 27286608847
Installation:
pip install gopher-mcp==0.4.3
Verification:
All packages are signed and can be verified using Sigstore.
Security Fixes
- Gopher menu parser now stops at RFC 1436 `.` terminator, ignoring trailing whitespace to prevent out‑of‑bounds parsing.
- Client certificates scoped on path‑segment boundaries; certificate for `/api` no longer sent to sibling paths such as `/api_admin`, closing identity‑scope leak (CVE not listed).
- Blocked SSRF target no longer echoes resolved internal IP back to caller, preventing network topology mapping.
- Gemini request send bounded by deadline, avoiding hang when peer stops reading after handshake.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About cameronrye/gopher-mcp
Modern, cross-platform MCP server enabling AI assistants to browse and interact with both Gopher protocol and Gemini protocol resources safely and efficiently. Features dual protocol support, TLS security, and structured content extraction.
Related context
Related tools
Earlier breaking changes
- v0.5.0 Changes Gemini binary success responses to return only metadata, dropping base64‑inlined bodies.
- v0.3.0 Reject `--mount-path` for transports that ignore it instead of silently dropping.
- v0.3.0 Server settings now read under `GOPHER_MCP_` environment prefix; update any existing env vars accordingly.
Beta — feedback welcome: [email protected]