Skip to main content

Fabio CVE-2026-62987

| EUVDEUVD-2026-83986 MEDIUM
Authentication Bypass by Spoofing (CWE-290)
2026-09-21 GitHub_M GHSA-fq95-v8xc-jm3v
5.8
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Reach Fabio-fronted backend unauthenticated
  2. Delivery
    Send request naming trust header in Connection header
  3. Exploit
    Go ReverseProxy strips configured header pre-backend
  4. Execution
    Backend loses client-IP/TLS/request-ID signal
  5. Impact
    Authorization misjudged or audit trail broken

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Anti-spoofing controls
MITRE ATT&CK

1 technique across 1 tactic: Defense Evasion

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitable only when the operator has configured one or more of the proxy.header options - ClientIPHeader, TLSHeader, or RequestID - which are EMPTY BY DEFAULT, meaning default Fabio installations are NOT affected. When set, an unauthenticated remote client simply lists the configured header name in the inbound HTTP Connection header, and Go's ReverseProxy honors it and strips the header before the request reaches the backend. Impact only materializes if a backend actually relies on those Fabio-injected headers for authorization decisions or audit logging. The hardcoded forwarded-header allowlist (X-Forwarded-*, Forwarded, X-Real-Ip, X-Request-Id, X-Client-Ip) is unaffected, so this only breaks operator-renamed custom trust headers.

Impact

This is a genuine but low-priority integrity issue. The CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N = 5.8 Medium) correctly reflects a network, unauthenticated, low-complexity attack with only limited integrity impact and a scope change (the harm lands on the backend, a separate trust authority, not on Fabio itself). There is NO confidentiality or availability impact - this is not RCE or data theft; it is the silent removal of trust-signal headers. Critically, the description states the affected proxy.header options (ClientIPHeader, TLSHeader, RequestID) are EMPTY BY DEFAULT, so default deployments are unaffected - the PR:N rating reflects protocol-level access but the real precondition is a non-default operator configuration, which the raw score does not capture. No EPSS score, KEV listing, or public POC was provided; per precision rules this is 'no public exploit identified at time of analysis.' No SSVC decision data was supplied. This is an incomplete-fix follow-up to CVE-2025-48865, which raises some regression concern, but real-world urgency is bounded by the non-default config requirement and the fact that impact is loss of audit/authz signals rather than a direct bypass in every deployment.

Exploit ScenarioDerived

An operator runs Fabio (1.6.6-1.7.1) configured to inject a client-IP, TLS-termination, or request-ID header that backends trust for authorization or audit logging. An unauthenticated remote client sends a request with Connection: X-Client-Ip (or the configured header name), causing Go's ReverseProxy to strip that trust header before the request reaches the backend, so the backend sees no client IP / no TLS signal / no request-correlation ID and may misjudge authorization or lose audit trail. No public exploit code was identified at time of analysis.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 21, 2026

Fabio 1.6.6 through 1.7.1 (fixed in 1.7.2) fails to protect operator-renamed trust headers, so an unauthenticated remote client can force Go's reverse proxy to strip the configured ClientIPHeader, TLSHeader, or RequestID from its own request by naming them in the inbound Connection header, causing backends that rely on those signal headers for authorization or audit logging to lose them. The exposure is narrow: the three affected options are empty by default, the hardcoded forwarded-header allowlist (X-Forwarded-*, Forwarded, X-Real-Ip, X-Request-Id, X-Client-Ip) remains protected, and impact only materializes in deployments that both enable these options and have backends that trust the injected values. No public exploit code was identified at time of analysis and the issue is not in CISA KEV, though the integrity weakness is remotely reachable with no authentication (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N, 5.8).

RemediationAI

Vendor-released patch: Fabio 1.7.2 (https://github.com/fabiolb/fabio/releases/tag/v1.7.2), which corresponds to upstream commit 240526a8004077edad4fb96d25b382bfc3901357 and is documented in advisory GHSA-fq95-v8xc-jm3v; upgrading is the definitive fix because it makes the protected-header set configuration-aware by canonicalizing and registering the configured ClientIPHeader, TLSHeader, and RequestID names. Where an immediate upgrade is not possible, the most effective compensating control is to stop relying on operator-renamed trust headers: leave ClientIPHeader, TLSHeader, and RequestID unset (the default) or configure them to names already inside the hardcoded allowlist (X-Forwarded-*, Forwarded, X-Real-Ip, X-Request-Id, X-Client-Ip), which restores protection at the cost of forcing any backend that references custom header names to be reconfigured. A further stopgap is to reject or sanitize inbound requests whose Connection header names any of the configured trust headers at an edge proxy, load balancer, or WAF in front of Fabio, but this adds a layer to maintain and can break legitimate clients that send multi-hop Connection directives. Deployments that must keep custom header names and cannot upgrade should ensure backends treat these headers as advisory only and perform authorization on independently authenticated signals, since the stripped headers can no longer be trusted for access decisions or audit trails.

Affected VersionsENISA

fabio 1.6.6, < 1.7.2

Affected Packages

go github.com/fabiolb/fabio fix: 1.7.2
euvd fabio_1_6_6 fix: 1.7.2

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in go, euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Fabio is a Consul-aware HTTP(S) and TCP router that fronts backend services and injects trust metadata into proxied requests. Per RFC 7230 hop-by-hop semantics, Go's net/http ReverseProxy removes any header named in the incoming Connection header before forwarding the request upstream; Fabio's proxy/http_headers.go addHeaders function therefore maintains a protectHeaders allowlist so that attacker-named headers cannot be deleted out from under the trust chain. The fix for CVE-2025-48865 hardened this list for a hardcoded set of forwarded headers, but the operator-configured Proxy.ClientIPHeader, Proxy.TLSHeader, and Proxy.RequestID names - registered in proxy/http_proxy.go HTTPProxy.ServeHTTP via addHeaders - were never added to it, a CWE-290 authentication-bypass-by-spoofing weakness in which the trust boundary is crossed by header manipulation rather than credential compromise. The upstream commit (240526a8004077edad4fb96d25b382bfc3901357) converts the map into an exported DefaultProtectHeaders and, in main.go, canonicalizes and inserts the configured RequestID, ClientIPHeader, and TLSHeader names via textproto.CanonicalMIMEHeaderKey before wiring ProtectHeaders into the proxy, closing the gap by making the protected set configuration-aware. The CPE string cpe:2.3:a:fabiolb:fabio:*:*:*:*:*:*:*:* reflects that all Fabio releases in the vulnerable range are affected regardless of platform.

Know when Fabio gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (GitHub_M) PRIMARY 5.8 MEDIUM
AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N
vuln.today AI 5.8 MEDIUM

Unauthenticated network request (PR:N/AV:N/AC:L); scope change (S:C) since integrity harm lands on the backend authority, limited to lost trust signals (I:L), no C/A impact.

3.1 AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:L/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Changed
Confidentiality
None
Integrity
Low
Availability
None

Lifecycle Timeline

1
Patch available
Sep 21, 2026 - 17:02 EUVD

DescriptionCVE.org

Fabio is an HTTP(S) and TCP router for deploying applications managed by consul. From 1.6.6 until 1.7.2, the CVE-2025-48865 fix in proxy/http_headers.go uses protectHeaders for a hardcoded set of forwarded headers but omits the operator-configured ClientIPHeader, TLSHeader, and RequestID names. In proxy/http_proxy.go, HTTPProxy.ServeHTTP calls addHeaders to set these trust headers before Go ReverseProxy processes the inbound Connection header, allowing an unauthenticated client to name and remove the configured headers before the request reaches the backend. Deployments that enable the corresponding proxy.header options can therefore lose client-IP, TLS-termination, or request-correlation signals used by backend authorization and auditing; the options are empty by default, and the hardcoded protected forwarded headers are unaffected. This issue is fixed in version 1.7.2.

Threat Intelligence Overview

EPSS Score
0.2%
Top 94% exploitable
Prevalence
Low
niche open-source HTTP/TCP router tied to Consul service-mesh deployments
Threat Intel
1
1 sources
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
Yes
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

29
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +29
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy