CSIRTS // UNIFIED SECURITY ADVISORY FEEDSYS ● ONLINE · POWERED BY INTELFUSIONS.COM

GHSA-42j2-w334-qxw7: Hoverfly: Denial of Service via Goroutine Leak in Remote Post-Serve Actions

mediumCVSS 6.5CVE-2026-50018
Summary: Remote post-serve actions use http.DefaultClient without any timeout configuration. When the remote endpoint is unreachable or intentionally slow (accepts TCP connection but never responds), each triggered proxy request spawns a goroutine that blocks indefinitely on http.DefaultClient.Do(). An attacker can cause unbounded goroutine accumulation leading to memory exhaustion and process crash (OOM kill). Unlike local post-serve action execution, this requires no binary execution, only a URL pointing to a non-responsive endpoint. Details: 1. Remote actions executed in goroutines without timeout (core/hoverfly.go:224-228): go postServeAction.Execute(result.Pair, journalIDChannel, hf.Journal) Post-serve actions are executed in separate goroutines with no recovery wrapper. 2. HTTP client has no timeout (core/action/action.go:128-143): req, err := http.NewRequest("POST", action.Remote, bytes.NewBuffer(pairViewBytes)) // ... resp, err := http.DefaultClient.Do(req) // No timeout! Blocks forever. http.DefaultClient has zero timeout by default in Go. If the remote server: - Accepts the TCP connection but never sends a response - Establishes TLS but never completes the handshake - Uses TCP window size 0 (flow control stall) ...the goroutine blocks indefinitely. There is no context cancellation, no deadline, and no cleanup. 3. No goroutine limit or backpressure: There is no limit on how many post-serve action goroutines can be active simultaneously. Each matching proxy request spawns a new one unconditionally. 4. The goroutine is never cleaned up: The only exit path from Execute() is a successful (or failed) HTTP response. A non-responding server means the goroutine lives until the process is killed. Environment: - Hoverfly version: v1.12.7 - Operating System: macOS Darwin 25.4.0 - Go version: 1.26.2 - Configuration: Default (no flags required) POC: Step 1: Start a black-hole TCP listener (accepts connections, never responds) Option A: Use ncat ncat -l

Details

Source
GitHub Security Advisories (INTL · database · site)
Severity
medium — CVSS 6.5
Published
2026-07-14
Last updated
2026-07-14
Exploitation
Not in CISA KEV at last sync

Original advisory: https://github.com/advisories/GHSA-42j2-w334-qxw7

Referenced CVEs

CVECSIRTS overviewExternal
CVE-2026-50018coverage & exploitation statusNVD · CVE.org

More from GitHub Security Advisories