css_parser
A set of classes for parsing CSS in Ruby.
Activity
- Latest release
- 5d ago
- Total releases
- 66
- Cadence
- ~2 months
- Last 12 months
- 6
Details
- License
- MIT
- First release
- Nov 19, 2007
| Version | Released | |
|---|---|---|
3.1.0
minor
| ||
3.0.0
major
| ||
1.22.0
minor
1 CVE
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
2.2.0
minor
1 CVE
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
2.1.0
minor
1 CVE
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
2.0.0
major
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.21.1
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.21.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.20.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.19.1
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.19.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.17.1
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
|
1.17.1
patch
Dependencies (9)
+ 1 more
Changelog
Compare changes
|
|
1.17.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
|
1.17.0
minor
Dependencies (9)
+ 1 more
Changelog
Compare changes
|
|
1.16.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
|
1.16.0
minor
Dependencies (9)
+ 1 more
Changelog
Compare changes
|
|
1.15.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
|
1.15.0
minor
Dependencies (9)
+ 1 more
Changelog
Compare changes
|
|
1.14.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
|
1.14.0
minor
Dependencies (9)
+ 1 more
Changelog
Compare changes
|
|
1.13.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
|
1.13.0
minor
Dependencies (9)
+ 1 more
Changelog
Compare changes
|
|
1.12.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
|
1.12.0
minor
Dependencies (9)
+ 1 more
Changelog
Compare changes
|
|
1.11.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
|
1.11.0
minor
Dependencies (9)
+ 1 more
Changelog
Compare changes
|
|
1.10.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
|
1.10.0
minor
Dependencies (9)
+ 1 more
Changelog
Compare changes
|
|
1.9.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
|
1.9.0
minor
Dependencies (9)
+ 1 more
Changelog
Compare changes
|
|
1.8.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
|
1.8.0
minor
Dependencies (9)
+ 1 more
Changelog
Compare changes
|
|
1.7.1
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.7.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.6.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.5.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.5.0.pre2
pre
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.5.0.pre
pre
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.4.10
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.4.9
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.4.8
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.4.7
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.4.6
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.4.5
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.4.4
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.4.3
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.4.2
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.4.1
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.4.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.3.7
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.3.6
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.3.5
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.3.0
minor
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.3.3
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.3.4
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.3.2
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.3.1
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.2.6
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.2.2
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
| ||
1.2.3
patch
2 CVEs
CVE-2026-53727
GHSA-9pmc-p236-855h
Jul 09, 2026
Ruby CSS Parser: SSRF and Local File Disclosure in `CssParser::Parser#read_remote_file`
High
Network
Low
None
None
Summary
In practice, any consumer of Vulnerable code
There is no validation of The user-facing entry points that reach this sink are:
Threat model and scope| Capability | Reachable? | Notes |
|---|---|---|
| Arbitrary outbound File-disclosure scope (cross-scheme redirect leg)The
Empirical results against vulnerable 2.2.0 with | File contents | Recoverable through In practice this means high-value targets that aren't CSS-shaped — TLS keys, SSH keys, JWTs, The stronger recovery channel is the SSRF leg, not file disclosure: when the response comes from an internal HTTP service, Premailer-style consumers serialize the parsed CSS back into rendered HTML/email output, and any CSS-shaped bytes in the response surface there. Is it "blind"?It is not a classic blind SSRF. The bug has two recovery channels:
ReproductionA minimal, self-contained reproducer is attached as
Actual output
Minimal one-line triggersThe smallest possible attacker payload is a single 1. Internal block-DSL config via cross-scheme redirect → file:// — nginx, HCL/Terraform, Caddy, BIND, etc. all use
Result: the full 2. Side-effecting internal admin GET — even when the response is not CSS-shaped, the request still executes against the internal service:
No data exfiltration is required for this to be a vulnerability: the attacker has achieved an authenticated-from-localhost GET against an internal control-plane endpoint. 3. Internal HTTP service whose body happens to be CSS-shaped — a status / debug page or a config endpoint that emits
All three payloads are parsed via:
Standalone
|