CVE-2026-25765
Medium · 5.8CVSS
5.8
EPSS
0.4%
Published
Feb 9, 2026
CISA due date
—
Cloudanix analysis
Some applications using this library could be tricked into contacting a different server than intended, which may expose information from systems the attacker should not reach.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Data Exposure
- Component
- Library
- Class
- SSRF
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Faraday versions prior to 2.14.1 can incorrectly combine a configured base URL with a user-supplied request path using Ruby URI merge behavior. When the supplied path is a protocol-relative URL beginning with double slashes, such as //example.com/path, the host component of the original base URL can be replaced. In applications that pass untrusted input into Faraday request methods such as get(), post(), build_url(), or similar helpers, this enables server-side request forgery by causing the application server to initiate outbound HTTP requests to attacker-chosen hosts. The primary technical risk is unauthorized outbound request routing and potential exposure of response data from reachable internal or external services; integrity and availability impact are not inherent to the library flaw but may arise depending on what the vulnerable application does with the response.
Why it matters to the business
An affected application may be tricked into connecting to unintended systems, including internal services, cloud metadata endpoints, partner APIs, or attacker-controlled infrastructure. This can lead to disclosure of limited sensitive information, leakage of tokens or request metadata, bypass of network access controls, and abuse of trusted application egress paths. The issue is not currently listed in CISA KEV, is not known to be used in ransomware campaigns, and has a low EPSS score with no reported public exploit maturity, so urgency is generally lower than actively exploited vulnerabilities; however, applications that expose Faraday-backed URL or path parameters to unauthenticated users should still prioritize remediation because exploitation requires little complexity.
How an attack unfolds
An attacker first identifies an application feature that accepts a path, endpoint, callback destination, import URL, webhook-like value, or other input that is later passed to Faraday as a request path while the application expects requests to stay under a fixed base URL. Instead of supplying a normal relative path, the attacker supplies a protocol-relative value beginning with //. In vulnerable Faraday versions, the URL-building logic treats that value as a network-path reference and replaces the base URL host with the attacker-supplied host while preserving the scheme. The application then sends the outbound request from the server to the attacker-selected destination. The attacker may point the request at infrastructure they control to confirm exploitability and capture headers, tokens, or request metadata, or may attempt to reach internal-only resources and infer or retrieve sensitive data if the application returns or processes the response.
How to fix it
Upgrade Faraday to version 2.14.1 or later wherever it is used, including transitive dependency paths in Ruby applications. The upstream fix is associated with commit 16cbd38ef252d25dedf416a4d2510a2f3db10c87. Refresh lockfiles and rebuild/redeploy affected services so the patched gem is actually loaded at runtime. As defense in depth, do not pass raw user input directly to Faraday request methods; reject protocol-relative inputs beginning with //, backslash variants, encoded double slashes, absolute URLs where not expected, and unexpected schemes. Enforce an allowlist of permitted destination hosts and paths before making server-side HTTP requests. Add egress controls so application workloads can only reach required external services and cannot access cloud metadata endpoints or internal administrative services unless explicitly needed.
How to confirm the fix worked
Confirm dependency state by checking Gemfile.lock, software composition analysis results, container image SBOMs, and runtime gem inventories for Faraday versions older than 2.14.1. Validate that all deployed artifacts were rebuilt after the dependency update and are not still packaging an older gem. Perform a safe functional test in a non-production or controlled environment by passing a protocol-relative value such as //controlled-test-host.example/path to any relevant application input and confirming the application does not make an outbound request to that host. Review outbound proxy, DNS, and firewall logs during testing to verify the intended base host is preserved or the request is rejected. Also add unit or integration tests around URL construction to ensure user-controlled path values cannot override the configured authority component.
Typical attack path
- Find an externally reachable feature that accepts user-controlled input used in a Faraday request path or URL construction flow.
- Submit a protocol-relative path beginning with double slashes, such as //host.example/path, instead of a normal relative path.
- Rely on vulnerable URL merging behavior to replace the intended base host with the supplied host.
- Observe an outbound request from the application server to the attacker-controlled or otherwise unintended host.
- Iterate with internal addresses, cloud metadata endpoints, or sensitive service names if outbound network controls and application behavior allow it.
- Use any returned response data, error messages, timing differences, or captured request headers to gather information or access secrets.
How to detect it
To determine whether exploitation already occurred, correlate inbound application requests with outbound HTTP, DNS, proxy, firewall, and cloud flow logs from services that use Faraday versions prior to 2.14.1. Look for user-supplied parameters or request paths beginning with //, encoded variants such as %2f%2f, or unusual host-like values in fields that normally contain relative paths. Review outbound connections made immediately after those inbound requests for destinations outside the expected API allowlist, especially attacker-controlled domains, newly registered domains, public IPs not associated with business partners, internal RFC1918 addresses, localhost-style addresses, and cloud metadata endpoints. If Faraday logging, HTTP client debug logs, APM traces, or distributed tracing are enabled, search for requests where the configured logical integration should target one host but the actual URI host differs. Examine whether any responses from unintended destinations were returned to users, stored, or used in downstream workflows. Because there are no universal actor-specific indicators for this issue, detection should focus on payload shape, unexpected egress, DNS lookups, and request/response correlation.
- GET //
- POST //
- PUT //
- PATCH //
- DELETE //
- %2f%2f169.254.169.254
- %2F%2F169.254.169.254
- //169.254.169.254/latest/meta-data
- //169.254.169.254/metadata
- //metadata.google.internal/
- //metadata/computeMetadata/v1
- //localhost/
- //127.0.0.1/
- //0.0.0.0/
- //[::1]/
- //10.
- //172.16.
- //172.17.
- //172.18.
- //172.19.
- //172.20.
- //172.21.
- //172.22.
- //172.23.
- //172.24.
- //172.25.
- //172.26.
- //172.27.
- //172.28.
- //172.29.
- //172.30.
- //172.31.
- //192.168.
- faraday (2.14.0)
- faraday (2.13.
- faraday (2.12.
- lib/faraday/connection.rb
- build_exclusive_url
What your security team should do
- Inventory Ruby applications and services that include Faraday and identify versions prior to 2.14.1.
- Prioritize internet-facing features where unauthenticated or low-privileged users can influence paths, endpoints, import locations, callbacks, webhooks, or proxy-like request parameters.
- Upgrade Faraday to 2.14.1 or later, refresh lockfiles, rebuild images, and redeploy affected services.
- Add input validation that rejects protocol-relative URLs, encoded double slashes, absolute URLs, unexpected schemes, and host override attempts in fields intended to be relative paths.
- Implement destination allowlists and outbound egress restrictions for application workloads that perform server-side HTTP requests.
- Block access from application workloads to cloud metadata services and sensitive internal address ranges unless there is a documented business requirement.
- Search historical application, DNS, proxy, and firewall logs for protocol-relative payloads and unexpected outbound requests from affected services.
- Add regression tests and SAST/dependency checks to prevent reintroduction of unsafe Faraday URL construction patterns.
The record
Faraday is an HTTP client library abstraction layer that provides a common interface over many adapters. Prior to 2.14.1, Faraday's build_exclusive_url method (in lib/faraday/connection.rb) uses Ruby's URI#merge to combine the connection's base URL with a user-supplied path. Per RFC 3986, protocol-relative URLs (e.g. //evil.com/path) are treated as network-path references that override the base URL's host/authority component. This means that if any application passes user-controlled input to Faraday's get(), post(), build_url(), or other request methods, an attacker can supply a protocol-relative URL like //attacker.com/endpoint to redirect the request to an arbitrary host, enabling Server-Side Request Forgery (SSRF). This vulnerability is fixed in 2.14.1.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| RubyGems | faraday | 1.0.0 | 1.10.5 |
| RubyGems | faraday | 2.0.0 | 2.14.1 |
| Chainguard | cinc-auditor | 0 | 7.0.95-r6 |
| Chainguard | gitlab-cng-18.9 | 0 | 18.9.1-r0 |
| Chainguard | kube-fluentd-operator | 0 | 1.18.2-r60 |
| Chainguard | kube-logging-operator-fluentd-outputs | 0 | 6.3.2-r3 |
| Chainguard | logstash-8.17 | 0 | 8.17.10-r12 |
| Chainguard | logstash-8.17-iamguarded-compat | 0 | 8.17.10-r12 |
| Chainguard | logstash-8.17-with-output-opensearch | 0 | 8.17.10-r12 |
| Chainguard | logstash-8.19 | 0 | 8.19.11-r1 |
| Chainguard | logstash-8.19-iamguarded-compat | 0 | 8.19.11-r1 |
| Chainguard | logstash-8.19-with-output-opensearch | 0 | 8.19.11-r1 |
| Chainguard | logstash-9.0 | 0 | 9.0.8-r11 |
| Chainguard | logstash-9.0-iamguarded-compat | 0 | 9.0.8-r11 |
| Chainguard | logstash-9.0-with-output-opensearch | 0 | 9.0.8-r11 |
| Chainguard | logstash-9.1 | 0 | 9.1.10-r1 |
| Chainguard | logstash-9.1-bitnami-compat | 0 | 9.1.10-r1 |
| Chainguard | logstash-9.1-iamguarded-compat | 0 | 9.1.10-r1 |
| Chainguard | logstash-9.1-with-output-opensearch | 0 | 9.1.10-r1 |
| Chainguard | logstash-9.2 | 0 | 9.2.5-r1 |
| Chainguard | logstash-9.2-iamguarded-compat | 0 | 9.2.5-r1 |
| Chainguard | logstash-9.2-with-output-opensearch | 0 | 9.2.5-r1 |
| Chainguard | logstash-9.3 | 0 | 9.3.1-r0 |
| Chainguard | logstash-9.3-iamguarded-compat | 0 | 9.3.1-r0 |
| Chainguard | logstash-9.3-with-output-opensearch | 0 | 9.3.1-r0 |
| Wolfi | cinc-auditor | 0 | 7.0.95-r6 |
| Wolfi | kube-fluentd-operator | 0 | 1.18.2-r60 |
| Wolfi | kube-logging-operator-fluentd-outputs | 0 | 6.3.2-r3 |
| Wolfi | logstash-9.1 | 0 | 9.1.10-r1 |
| Wolfi | logstash-9.1-bitnami-compat | 0 | 9.1.10-r1 |
| Wolfi | logstash-9.1-iamguarded-compat | 0 | 9.1.10-r1 |
| Wolfi | logstash-9.1-with-output-opensearch | 0 | 9.1.10-r1 |
| Wolfi | logstash-9.2 | 0 | 9.2.5-r1 |
| Wolfi | logstash-9.2-iamguarded-compat | 0 | 9.2.5-r1 |
| Wolfi | logstash-9.2-with-output-opensearch | 0 | 9.2.5-r1 |
| Wolfi | logstash-9.3 | 0 | 9.3.1-r0 |
| Wolfi | logstash-9.3-iamguarded-compat | 0 | 9.3.1-r0 |
| Wolfi | logstash-9.3-with-output-opensearch | 0 | 9.3.1-r0 |
Related vulnerabilities
- CVE-2026-33170 Active Support is a toolkit of support libraries and Ruby core extensions extracted from… Also affects cinc-auditor
- CVE-2026-33176 Active Support is a toolkit of support libraries and Ruby core extensions extracted from… Also affects cinc-auditor
- CVE-2026-33169 Active Support is a toolkit of support libraries and Ruby core extensions extracted from… Also affects cinc-auditor
- CVE-2026-33210 Ruby JSON is a JSON implementation for Ruby. Also affects cinc-auditor
- CVE-2026-26007 cryptography is a package designed to expose cryptographic primitives and recipes to… Also affects gitlab-cng-18.9
- CVE-2025-61921 Sinatra is vulnerable to ReDoS through ETag header value generation Also affects gitlab-cng-18.9
- CVE-2024-12797 Issue summary: Clients using RFC7250 Raw Public Keys (RPKs) to authenticate a server may… Also affects gitlab-cng-18.9
- CVE-2024-21510 Versions of the package sinatra from 0.0.0 are vulnerable to Reliance on Untrusted Inputs… Also affects gitlab-cng-18.9