Skip to main content

Crass CVE-2026-116695

| EUVDEUVD-2026-111386 MEDIUM
Interpretation Conflict (CWE-436)
2026-10-27 GitHub_M GHSA-pq4g-8rxf-4g29
5.3
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Craft CSS with bad URL token
  2. Delivery
    Submit to Crass-based sanitizer
  3. Exploit
    Escaped-backslash-plus-paren evades termination
  4. Execution
    Smuggled CSS reserialized into page
  5. Persist
    Victim browser renders live CSS
  6. Impact
    UI redress or CSS data exfiltration

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V4 - API and Web Service Interpretation consistency
Exploitation Conditions

Exploitation requires that a downstream application parse attacker-supplied untrusted CSS with Crass (< 1.0.8) through a sanitizer that makes allow/deny decisions and then re-serializes the result without rejecting bad URL tokens - confirmed affected sanitizers are Sanitize through 7.0.0 (CSS.properties, style attributes, CSS.stylesheet, <style> elements), Loofah (scrub_css), and rails-html-sanitizer (sanitize_css, and sanitize when style is a permitted attribute). The attacker-controlled CSS must contain a bad URL token in which a ')' follows an escaped backslash so that Crass over-consumes and smuggles declarations, style rules, or at-rules such as @import. Limiting factors: there is no impact unless such a Crass-based sanitize-and-reserialize pipeline is in use; the CVSS UI:P reflects that a victim must render the sanitized output in a browser for impact to occur; and the ceiling on impact is CSS-only effects (UI redress/clickjacking, external resource loading, CSS-based data exfiltration) - it does NOT allow script execution in modern browsers. There is no practical workaround other than upgrading to Crass 1.0.8; the advisory notes that rejecting any CSS containing the '\' sequence would block the known trigger but is a blunt measure that may reject legitimate CSS.

Impact

This is a moderate, conditional risk rather than a drop-everything emergency. The CVSS 4.0 base is 5.3 (Medium) with vector AV:N/AC:L/AT:N/PR:N/UI:P and impact only on the subsequent system (SC:L/SI:L) - i.e., the browser that renders the sanitizer's output, not the Crass library or host itself. Crass by itself merely mis-tokenizes input (CWE-436, interpretation conflict); real impact only materializes when Crass sits inside a CSS sanitizer that makes allow/deny decisions and re-serializes untrusted CSS - the advisory confirms this for Sanitize (through 7.0.0), Loofah, and rails-html-sanitizer. The vendor-assigned decision label is 'this_month' (not act_now/emergency), which aligns with the medium severity. No EPSS score was provided and the CVE is not in CISA KEV, so there is no signal of active or widespread exploitation; absence of these is not itself evidence of safety but does argue against an imminent mass-exploitation scenario. No standalone public exploit code is referenced - only an advisory that confirms the smuggling technique works in Chromium against the named sanitizers, plus regression tests in the fix commit. The main caveat: the PR:N/AV:N metrics describe the ease of delivering malicious CSS, but actual exploitability hinges entirely on whether a downstream application parses-and-reserializes untrusted CSS through an affected sanitizer - a condition the raw CVSS score does not capture. The explicit ceiling on impact is important: this does NOT enable script execution in modern browsers.

Exploit ScenarioDerived

An attacker submits untrusted content containing crafted CSS (for example a user-supplied style attribute, comment, or rich-text field) to a web application that uses a Crass-based sanitizer such as Sanitize, Loofah, or rails-html-sanitizer. Because Crass mis-tokenizes a bad URL whose escaped backslash is followed by ')', the sanitizer treats smuggled declarations, rules, or @import at-rules as part of an inert bad-URL token and passes them through on re-serialization; a victim who later views the page has their browser parse and apply that live CSS, enabling UI redress, loading of attacker-controlled external resources, or CSS-based data exfiltration. No weaponized public exploit is referenced, but the advisory confirms the bypass against the named sanitizers' output in Chromium.

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

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

Alert me

AnalysisAIv1 – Oct 28, 2026

CSS sanitizer bypass in Crass, the Ruby CSS parser, affects versions prior to 1.0.8 and allows unauthenticated remote attackers to smuggle declarations, style rules, or at-rules past sanitizers that parse untrusted CSS with Crass and re-serialize it without rejecting bad URL tokens. Confirmed downstream impact requires a vulnerable sanitizer such as Sanitize through 7.0.0, Loofah's scrub_css, or rails-html-sanitizer, and a victim rendering the sanitized output; the result is limited to UI redress, external resource loading, or CSS-based data exfiltration, not script execution in modern browsers. No public exploit identified at time of analysis, and the vendor has released Crass 1.0.8 as the fix.

RemediationAI

Upgrade Crass to 1.0.8 or later; vendor-released patch: 1.0.8. Applications that use Sanitize, Loofah, rails-html-sanitizer, or any other Crass-based CSS sanitizer should update the Crass dependency to 1.0.8 or later. See the GitHub advisory https://github.com/rgrove/crass/security/advisories/GHSA-pq4g-8rxf-4g29, the fix commit https://github.com/rgrove/crass/commit/689fc45c632fdf3803b2f4e844ffc9cca3b08f34, and the release https://github.com/rgrove/crass/releases/tag/v1.0.8. The advisory states there are no practical workarounds other than upgrading; rejecting any CSS input containing the character sequence backslash-backslash would block the known trigger, but this is a blunt measure that may reject legitimate CSS.

Affected VersionsENISA

crass < 1.0.8

Affected Packages

rubygems crass fix: 1.0.8

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in rubygems

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

Technical ContextAI · show details

Crass implements the CSS Syntax Level 3 tokenizer, including the algorithm for consuming the remnants of a bad URL (CSS Syntax section 4.3.15). In the flawed implementation, the tokenizer checked whether the previously consumed code point and the next code point formed a valid escape in addition to checking the next two unconsumed code points; after an escaped backslash, the previous code point is a backslash, so a following closing parenthesis was incorrectly treated as escaped and the bad URL token continued to the next unescaped closing parenthesis or end of input. Browsers terminate the bad URL at that closing parenthesis, so content Crass treated as part of the bad URL is live CSS to a browser. This is a CWE-436 interpretation conflict between Crass and browser tokenization; the fix in commit 689fc45c632fdf3803b2f4e844ffc9cca3b08f34 changes the valid_escape? checks to pass explicit character lookahead and removes the erroneous previous-code-point check in consume_bad_url. The flaw itself only mis-tokenizes; security impact arises when a sanitizer makes allow/deny decisions with Crass and re-serializes the output.

Know when Crass gets its next vulnerability

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

No credit card · 7-day full trial

Severity by source

Vendor (GitHub_M) PRIMARY 5.3 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N
vuln.today AI 6.1 MEDIUM

Untrusted CSS is delivered remotely without auth (AV:N/PR:N); a victim must render the sanitized output (UI:R); the flaw in Crass impacts the downstream browser, a scope change (S:C), with limited confidentiality/integrity and no availability impact.

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

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
Passive
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
None
Subsequent system: Confidentiality
Low
Subsequent system: Integrity
Low
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Oct 27, 2026 - 21:18 EUVD
CVE Published
Oct 27, 2026 - 20:10 cve.org
MEDIUM 5.3

DescriptionCVE.org

Crass is a Ruby CSS parser that is compliant with the CSS Syntax Level 3 specification. Prior to 1.0.8, Crass incorrectly treats a closing parenthesis after an escaped backslash as escaped while consuming the remnants of a bad URL. Crass therefore keeps declarations, style rules, or at-rules inside a bad URL token even though a browser treats them as live CSS. A sanitizer that parses untrusted CSS with Crass and reserializes it without rejecting the bad URL can allow CSS used for UI redress, external resource loading, or CSS-based data exfiltration, but this issue does not enable script execution in modern browsers. This issue is fixed in version 1.0.8.

Threat Intelligence Overview

EPSS Score
0.4%
Top 71% exploitable
Prevalence
High
underpins Sanitize, Loofah and rails-html-sanitizer across Ruby/Rails apps
Threat Intel
1
1 source
Exploit
POC
Public exploit code exists
Data Quality
5 sources
Confidence: Medium

How this decision was reached

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

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

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
Poc
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
Medium

Priority Score

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

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

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