Skip to content

cameronrye/gopher-mcp

v0.4.3 Security

This release includes 4 security fixes for security teams reviewing exposed deployments.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →
This release patches 4 known CVEs

Topics

gemini gemini-protocol gopher gopher-protocol mcp mcp-server

Affected surfaces

auth rce_ssrf

ReleasePort's take

Light signal
editorial:auto 1mo

The 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 summary

Security 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

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 /api is 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 (menu nextUrl, 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.
  • GopherURL rejects 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-existent GOPHER_HTTP_HOST/GOPHER_HTTP_PORT env
    vars (host/port are --host/--port CLI flags), and documented that the
    HTTP transports are unauthenticated and the Docker image binds 0.0.0.0:8000
    by default.
  • Supply-chain hygiene: added a .dockerignore (keeps .git/local .env out
    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

Track cameronrye/gopher-mcp

Get notified when new releases ship.

Sign up free

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.

All releases →

Related context

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]