CVE-2026-32762
Rack: Forwarded Header semicolon injection enables Host and Scheme spoofing
Rack is a modular Ruby web server interface. From versions 3.0.0.beta1 to before 3.1.21 and 3.2.0 to before 3.2.6, Rack::Utils.forwarded_values parses the RFC 7239 Forwarded header by splitting on semicolons before handling quoted-string values. Because quoted values may legally contain semicolons, a header can be interpreted by Rack as multiple Forwarded directives rather than as a single quoted for value. In deployments where an upstream proxy, WAF, or intermediary validates or preserves quoted Forwarded values differently, this discrepancy can allow an attacker to smuggle host, proto, for, or by parameters through a single header value. This issue has been patched in versions 3.1.21 and 3.2.6.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
4.8
Rack: Forwarded Header semicolon injection enables Host and Scheme spoofing
Rack is a modular Ruby web server interface. From versions 3.0.0.beta1 to before 3.1.21 and 3.2.0 to before 3.2.6, Rack::Utils.forwarded_values parses the RFC 7239 Forwarded header by splitting on semicolons before handling quoted-string values. Because quoted values may legally contain semicolons, a header can be interpreted by Rack as multiple Forwarded directives rather than as a single quoted for value. In deployments where an upstream proxy, WAF, or intermediary validates or preserves quoted Forwarded values differently, this discrepancy can allow an attacker to smuggle host, proto, for, or by parameters through a single header value. This issue has been patched in versions 3.1.21 and 3.2.6.
- Record
CVE-2026-32762- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - Weakness
- CWE-436
- Updated
- 2026-11-02
EUVDEUVD-2026-18423
4.8
Rack is a modular Ruby web server interface. From versions 3.0.0.beta1 to before 3.1.21 and 3.2.0 to before 3.2.6, Rack::Utils.forwarded_values parses the RFC 7239 Forwarded header by splitting on semicolons before handling quoted-string values. Because quoted values may legally contain semicolons, a header can be interpreted by Rack as multiple Forwarded directives rather than as a single quoted for value. In deployments where an upstream proxy, WAF, or intermediary validates or preserves quoted Forwarded values differently, this discrepancy can allow an attacker to smuggle host, proto, for, or by parameters through a single header value. This issue has been patched in versions 3.1.21 and 3.2.6.
- Record
EUVD-2026-18423- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-qfgr-crr9-7r49
4.8
Rack: Forwarded Header semicolon injection enables Host and Scheme spoofing
Summary
Rack::Utils.forwarded_values parses the RFC 7239 Forwarded header by splitting on semicolons before handling quoted-string values. Because quoted values may legally contain semicolons, a header such as:
Forwarded: for="127.0.0.1;host=evil.com;proto=https"
can be interpreted by Rack as multiple Forwarded directives rather than as a single quoted for value.
In deployments where an upstream proxy, WAF, or intermediary validates or preserves quoted Forwarded values differently, this discrepancy can allow an attacker to smuggle host, proto, for, or by parameters through a single header value.
Details
Rack::Utils.forwarded_values processes the header using logic equivalent to:
forwarded_header.split(';').each_with_object({}) do |field, values|
field.split(',').each do |pair|
pair = pair.split('=').map(&:strip).join('=')
return nil unless pair =~ /\A(by|for|host|proto)="?([^"]+)"?\Z/i
(values[$1.downcase.to_sym] ||= []) << $2
end
end
The method splits on ; before it parses individual name=value pairs. This is inconsistent with RFC 7239, which permits quoted-string values, and quoted strings may contain semicolons as literal content.
As a result, a header value such as:
Forwarded: for="127.0.0.1;host=evil.com;proto=https"
is not treated as a single for value. Instead, Rack may interpret it as if the client had supplied separate for, host, and proto directives.
This creates an interpretation conflict when another component in front of Rack treats the quoted value as valid literal content, while Rack reparses it as multiple forwarding parameters.
Impact
Applications that rely on Forwarded to derive request metadata may observe attacker-controlled values for host, proto, for, or related URL components.
In affected deployments, this can lead to host or scheme spoofing in derived values such as req.host, req.scheme, req.base_url, or req.url. Applications that use those values for password reset links, redirects, absolute URL generation, logging, IP-based decisions, or backend requests may be vulnerable to downstream security impact.
The practical security impact depends on deployment architecture. If clients can already supply arbitrary trusted Forwarded parameters directly, this bug may not add meaningful attacker capability. The issue is most relevant where an upstream component and Rack interpret the same Forwarded header differently.
Mitigation
- Update to a patched version of Rack that parses
Forwardedquoted-string values before splitting on parameter delimiters. - Avoid trusting client-supplied
Forwardedheaders unless they are normalized or regenerated by a trusted reverse proxy. - Prefer stripping inbound
Forwardedheaders at the edge and reconstructing them from trusted proxy metadata. - Avoid using
req.host,req.scheme,req.base_url, orreq.urlfor security-sensitive operations unless the forwarding chain is explicitly trusted and validated.
- Record
GHSA-qfgr-crr9-7r49- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - Weakness
- CWE-436
- Updated
- 2026-11-02
NVD
4.8
Rack is a modular Ruby web server interface. From versions 3.0.0.beta1 to before 3.1.21 and 3.2.0 to before 3.2.6, Rack::Utils.forwarded_values parses the RFC 7239 Forwarded header by splitting on semicolons before handling quoted-string values. Because quoted values may legally contain semicolons, a header can be interpreted by Rack as multiple Forwarded directives rather than as a single quoted for value. In deployments where an upstream proxy, WAF, or intermediary validates or preserves quoted Forwarded values differently, this discrepancy can allow an attacker to smuggle host, proto, for, or by parameters through a single header value. This issue has been patched in versions 3.1.21 and 3.2.6.
- Record
CVE-2026-32762- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N - Weakness
- CWE-436
- Updated
- 2026-11-02
OSV
4.8
Rack: Forwarded Header semicolon injection enables Host and Scheme spoofing
Rack is a modular Ruby web server interface. From versions 3.0.0.beta1 to before 3.1.21 and 3.2.0 to before 3.2.6, Rack::Utils.forwarded_values parses the RFC 7239 Forwarded header by splitting on semicolons before handling quoted-string values. Because quoted values may legally contain semicolons, a header can be interpreted by Rack as multiple Forwarded directives rather than as a single quoted for value. In deployments where an upstream proxy, WAF, or intermediary validates or preserves quoted Forwarded values differently, this discrepancy can allow an attacker to smuggle host, proto, for, or by parameters through a single header value. This issue has been patched in versions 3.1.21 and 3.2.6.
- Record
CVE-2026-32762- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - Weakness
- CWE-436
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-32762
6.5
Rack is a modular Ruby web server interface. From versions 3.0.0.beta1 to before 3.1.21 and 3.2.0 to before 3.2.6, Rack::Utils.forwarded_values parses the RFC 7239 Forwarded header by splitting on semicolons before handling quoted-string values. Because quoted values may legally contain semicolons, a header can be interpreted by Rack as multiple Forwarded directives rather than as a single quoted for value. In deployments where an upstream proxy, WAF, or intermediary validates or preserves quoted Forwarded values differently, this discrepancy can allow an attacker to smuggle host, proto, for, or by parameters through a single header value. This issue has been patched in versions 3.1.21 and 3.2.6.
- Record
DEBIAN-CVE-2026-32762- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N - Updated
- 2026-11-02
Show 4 moreShow less
OSVGHSA-qfgr-crr9-7r49
4.8
Rack: Forwarded Header semicolon injection enables Host and Scheme spoofing
Summary
Rack::Utils.forwarded_values parses the RFC 7239 Forwarded header by splitting on semicolons before handling quoted-string values. Because quoted values may legally contain semicolons, a header such as:
Forwarded: for="127.0.0.1;host=evil.com;proto=https"
can be interpreted by Rack as multiple Forwarded directives rather than as a single quoted for value.
In deployments where an upstream proxy, WAF, or intermediary validates or preserves quoted Forwarded values differently, this discrepancy can allow an attacker to smuggle host, proto, for, or by parameters through a single header value.
Details
Rack::Utils.forwarded_values processes the header using logic equivalent to:
forwarded_header.split(';').each_with_object({}) do |field, values|
field.split(',').each do |pair|
pair = pair.split('=').map(&:strip).join('=')
return nil unless pair =~ /\A(by|for|host|proto)="?([^"]+)"?\Z/i
(values[$1.downcase.to_sym] ||= []) << $2
end
end
The method splits on ; before it parses individual name=value pairs. This is inconsistent with RFC 7239, which permits quoted-string values, and quoted strings may contain semicolons as literal content.
As a result, a header value such as:
Forwarded: for="127.0.0.1;host=evil.com;proto=https"
is not treated as a single for value. Instead, Rack may interpret it as if the client had supplied separate for, host, and proto directives.
This creates an interpretation conflict when another component in front of Rack treats the quoted value as valid literal content, while Rack reparses it as multiple forwarding parameters.
Impact
Applications that rely on Forwarded to derive request metadata may observe attacker-controlled values for host, proto, for, or related URL components.
In affected deployments, this can lead to host or scheme spoofing in derived values such as req.host, req.scheme, req.base_url, or req.url. Applications that use those values for password reset links, redirects, absolute URL generation, logging, IP-based decisions, or backend requests may be vulnerable to downstream security impact.
The practical security impact depends on deployment architecture. If clients can already supply arbitrary trusted Forwarded parameters directly, this bug may not add meaningful attacker capability. The issue is most relevant where an upstream component and Rack interpret the same Forwarded header differently.
Mitigation
- Update to a patched version of Rack that parses
Forwardedquoted-string values before splitting on parameter delimiters. - Avoid trusting client-supplied
Forwardedheaders unless they are normalized or regenerated by a trusted reverse proxy. - Prefer stripping inbound
Forwardedheaders at the edge and reconstructing them from trusted proxy metadata. - Avoid using
req.host,req.scheme,req.base_url, orreq.urlfor security-sensitive operations unless the forwarding chain is explicitly trusted and validated.
- Record
GHSA-qfgr-crr9-7r49- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - Weakness
- CWE-436
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-32762
4.8
Rack is a modular Ruby web server interface. From versions 3.0.0.beta1 to before 3.1.21 and 3.2.0 to before 3.2.6, Rack::Utils.forwarded_values parses the RFC 7239 Forwarded header by splitting on semicolons before handling quoted-string values. Because quoted values may legally contain semicolons, a header can be interpreted by Rack as multiple Forwarded directives rather than as a single quoted for value. In deployments where an upstream proxy, WAF, or intermediary validates or preserves quoted Forwarded values differently, this discrepancy can allow an attacker to smuggle host, proto, for, or by parameters through a single header value. This issue has been patched in versions 3.1.21 and 3.2.6.
- Record
UBUNTU-CVE-2026-32762- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N - Updated
- 2026-11-04
OSVMGASA-2026-0226 No score
Updated ruby-rack packages fix security vulnerabilities
CVE-2026-26961 Greedy multipart boundary parsing can cause parser
differentials and WAF bypass. Forwarded header semicolon injection
enables Host and Scheme spoofing.
CVE-2026-34230 Quadratic complexity in
Rack::Utils.select_best_encoding via wildcard Accept-Encoding
header.
CVE-2026-34763 Root directory disclosure via unescaped regex
interpolation in Rack::Directory.
CVE-2026-34785 Rack::Static prefix matching can expose unintended
files under the static root.
CVE-2026-34786 Rack::Static header_rules bypass via URL-encoded path
mismatch.
CVE-2026-34826 Multipart byte range processing allows denial of service
via excessive overlapping ranges.
CVE-2026-34827 Multipart header parsing allows denial of service via
escape-heavy quoted parameters.
CVE-2026-34829 Multipart parsing without Content-Length header allows
unbounded chunked file uploads.
CVE-2026-34830 Rack::Sendfile header-based X-Accel-Mapping regex
injection enables unauthorized X-Accel-Redirect.
CVE-2026-34831 Content-Length mismatch in Rack::Files error
responses.
CVE-2026-34835 Rack::Request accepts invalid Host characters, enabling
host allowlist bypass.
- Record
MGASA-2026-0226- Updated
- 2026-11-02
OSVUSN-8989-1 No score
ruby-rack vulnerabilities
Andrew Lacambra discovered that Rack did not properly parse certain regular expressions. An attacker could possibly use this issue to bypass network security filters. (CVE-2026-26961)
William T. Nelson discovered that Rack did not handle multipart headers correctly. An attacker could possibly use this issue to cause downstream parsing issues or a denial of service. (CVE-2026-26962)
It was discovered that Rack did not handle the Forwarded header correctly. An attacker could possibly use this issue to manipulate header values. (CVE-2026-32762)
It was discovered that Rack could consume excessive CPU when handling certain Accept-Encoding values. An attacker could possibly use this issue to cause a denial of service. (CVE-2026-34230)
Haruki Oyama discovered that certain configurations of Rack could erroneously fail to derive the displayed directory path, and expose the full file system path. An attacker could possibly use this issue to disclose deployment details such as layout and usernames. (CVE-2026-34763)
It was discovered that Rack did not properly handle static file paths. An attacker could possibly use this issue to exfiltrate unintentionally served data. (CVE-2026-34785)
Haruki Oyama discovered that Rack did not apply header rules to certain requests for URL-encoded static paths. An attacker could possibly use this issue to bypass security-relevant response headers. (CVE-2026-34786)
It was discovered that Rack did not limit the number of ranges requested in the Range header. An attacker could possibly use this issue to cause a denial of service. (CVE-2026-34826)
It was discovered that Rack could consume excessive CPU when parsing certain multipart parameters. An attacker could possibly use this issue to cause a denial of service. (CVE-2026-34827)
It was discovered that Rack could consume unbounded disk space when handling requests without a Content-Length header. An attacker could possibly use this issue to cause a denial of service. (CVE-2026-34829)
Mehtab Zafar discovered that Rack directly interpreted the X-Accel-Mapping header as a regular expression without escaping. An attacker could possibly use this issue to exfiltrate arbitrary files from internal locations. (CVE-2026-34830)
It was discovered that Rack did not properly handle messages with Unicode. An attacker could possibly use this issue to cause a denial of service. (CVE-2026-34831)
It was discovered that Rack did not properly parse the Host header. An attacker could possibly use this issue to bypass security filters or poison generated links. (CVE-2026-34835)
- Record
USN-8989-1- Updated
- 2026-11-04
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
rackRubyGems |
3.0.0.beta1 up to 3.1.21 | 3.1.21 |
rackRubyGems |
3.2.0 up to 3.2.6 | 3.2.6 |
ruby-rackDebian:13 |
before 3.1.20-0+deb13u2, plus listed versions 3.1.16-0.13.1.18-13.1.18-1~deb13u13.1.20-0+deb13u1 |
3.1.20-0+deb13u2 |
ruby-rackDebian:14 |
before 3.2.6-2, plus listed versions 3.1.16-0.13.1.18-13.1.18-1~deb13u13.2.4-13.2.5-13.2.5-23.2.6-1 |
3.2.6-2 |
rackRubyGems |
3.0.0.beta1 up to 3.1.21, plus listed versions 3.0.03.0.0.rc13.0.13.0.103.0.11 Show 40 moreShow less3.0.123.0.133.0.143.0.153.0.163.0.173.0.183.0.23.0.33.0.43.0.4.13.0.4.23.0.53.0.63.0.6.13.0.73.0.83.0.93.0.9.13.1.03.1.13.1.103.1.113.1.123.1.133.1.143.1.153.1.163.1.173.1.183.1.193.1.23.1.203.1.33.1.43.1.53.1.63.1.73.1.83.1.9 |
3.1.21 |
rackRubyGems |
3.2.0 up to 3.2.6, plus listed versions 3.2.13.2.23.2.33.2.43.2.5 |
3.2.6 |
ruby-rackMageia:9 From an advisory covering 12 CVEs |
before 2.2.23-1.mga9 | 2.2.23-1.mga9 |
ruby-rackUbuntu:25.10 |
before 3.1.16-0.1ubuntu0.3, plus listed versions 2.2.7-1.13.1.16-0.13.1.16-0.1ubuntu0.13.1.16-0.1ubuntu0.2 |
3.1.16-0.1ubuntu0.3 |
ruby-rackUbuntu:26.04:LTS |
before 3.2.4-1ubuntu1.1, plus listed versions 3.1.16-0.13.1.18-13.1.18-1build13.2.4-1ubuntu1 |
3.2.4-1ubuntu1.1 |
ruby-rackUbuntu:26.04:LTS From an advisory covering 13 CVEs |
before 3.2.4-1ubuntu1.1, plus listed versions 3.1.16-0.13.1.18-13.1.18-1build13.2.4-1ubuntu1 |
3.2.4-1ubuntu1.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected | ||
| affected, aliases, references | OSV | |
| affected, facts | OSV | |
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-32762 is a medium vulnerability (CVSS 4.8) in Rack, published April 2, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.19%, the 8th percentile. Fixed in rack 3.1.21.
References
github.com/rack/rack/security/advisories/GHSA-qfgr-crr9-7r49
nvd.nist.gov/vuln/detail/CVE-2026-32762
github.com/rubysec/ruby-advisory-db/blob/master/gems/rack/CVE-2026-32762.yml
github.com/advisories/GHSA-qfgr-crr9-7r49
github.com/CVEProject/cvelistV5/tree/main/cves/2026/32xxx/CVE-2026-32762.json
security-tracker.debian.org/tracker/CVE-2026-32762
Show 30 moreShow less
github.com/rack/rack
advisories.mageia.org/MGASA-2026-0226.html
bugs.mageia.org/show_bug.cgi?id=35446
github.com/rack/rack/security/advisories/GHSA-vgpv-f759-9wx3
github.com/rack/rack/security/advisories/GHSA-v569-hp3g-36wr
github.com/rack/rack/security/advisories/GHSA-7mqq-6cf9-v2qp
github.com/rack/rack/security/advisories/GHSA-h2jq-g4cq-5ppq
github.com/rack/rack/security/advisories/GHSA-q4qf-9j86-f5mh
github.com/rack/rack/security/advisories/GHSA-x8cg-fq8g-mxfx
github.com/rack/rack/security/advisories/GHSA-v6x5-cg8r-vv6x
github.com/rack/rack/security/advisories/GHSA-8vqr-qjwx-82mw
github.com/rack/rack/security/advisories/GHSA-qv7j-4883-hwh7
github.com/rack/rack/security/advisories/GHSA-q2ww-5357-x388
github.com/rack/rack/security/advisories/GHSA-g2pf-xv49-m2h5
ubuntu.com/security/CVE-2026-32762
cve.org/CVERecord?id=CVE-2026-32762
ubuntu.com/security/notices/USN-8182-1
ubuntu.com/security/notices/USN-8989-1
ubuntu.com/security/CVE-2026-26961
ubuntu.com/security/CVE-2026-26962
ubuntu.com/security/CVE-2026-34230
ubuntu.com/security/CVE-2026-34763
ubuntu.com/security/CVE-2026-34785
ubuntu.com/security/CVE-2026-34786
ubuntu.com/security/CVE-2026-34826
ubuntu.com/security/CVE-2026-34827
ubuntu.com/security/CVE-2026-34829
ubuntu.com/security/CVE-2026-34830
ubuntu.com/security/CVE-2026-34831
ubuntu.com/security/CVE-2026-34835