Phlex XSS protection bypass via attribute splatting, dynamic tags, and href values
Key facts
- Attack vector
- —
- Privileges required
- —
- User interaction
- —
- Attack complexity
- —
- Impact type
- Cross-site scripting
- Confidentiality · integrity · availability
- —
- Fix status
- Fixed
No CVSS vector from any source. Fix status from GitHub. Impact type from CWE-79.
Summary
### Impact During a security audit conducted with Claude Opus 4.6 and GPT-5.3-Codex, we identified three specific ways to bypass the XSS (cross-site-scripting) protection built into Phlex. 1. The first bypass could happen if user-provided attributes with string keys were splatted into HTML tag, e.g. `div(**user_attributes)`. 2. The second bypass could happen if user-provided tag names were passed to the `tag` method, e.g. `tag(some_tag_name_from_user)`. 3. The third bypass could happen if user’s links were passed to `href` attributes, e.g. `a(href: user_provided_link)`. All three of these patterns are meant to be safe and all have now been patched. ### Patches Phlex has patched all three issues and introduced new tests that run against Safari, Firefox and Chrome. The patched versions are: - [2.4.1](https://rubygems.org/gems/phlex/versions/2.4.1) - [2.3.2](https://rubygems.org/gems/phlex/versions/2.3.2) - [2.2.2](https://rubygems.org/gems/phlex/versions/2.2.2) - [2.1.3](https://rubygems.org/gems/phlex/versions/2.1.3) - [2.0.2](https://rubygems.org/gems/phlex/versions/2.0.3) - [1.11.1](https://rubygems.org/gems/phlex/versions/1.11.1) Phlex has also patched the [`main`](https://github.com/yippee-fun/phlex) branch in GitHub. ### Workarounds If a project uses a secure CSP (content security policy) or if the application doesn’t use any of the above patterns, it is not at risk.
Why it matters now
SSVC decision points
Not available: CISA has not published SSVC decision points for this record.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| — | phlex (RubyGems) | 2.4.0.beta1 to before 2.4.1 | 2.4.1 | Patch available | GHSA-w67g-2h6v-vjgq |
| — | phlex (RubyGems) | 2.3.0 to before 2.3.2 | 2.3.2 | Patch available | GHSA-w67g-2h6v-vjgq |
| — | phlex (RubyGems) | 2.2.0 to before 2.2.2 | 2.2.2 | Patch available | GHSA-w67g-2h6v-vjgq |
| — | phlex (RubyGems) | 2.1.0 to before 2.1.3 | 2.1.3 | Patch available | GHSA-w67g-2h6v-vjgq |
| — | phlex (RubyGems) | 2.0.0.beta1 to before 2.0.2 | 2.0.2 | Patch available | GHSA-w67g-2h6v-vjgq |
| — | phlex (RubyGems) | before 1.11.1 | 1.11.1 | Patch available | GHSA-w67g-2h6v-vjgq |
- phlex (RubyGems) Vendor— Affected 2.4.0.beta1 to before 2.4.1 Fixed in 2.4.1 Patch available GHSA-w67g-2h6v-vjgq
- phlex (RubyGems) Vendor— Affected 2.3.0 to before 2.3.2 Fixed in 2.3.2 Patch available GHSA-w67g-2h6v-vjgq
- phlex (RubyGems) Vendor— Affected 2.2.0 to before 2.2.2 Fixed in 2.2.2 Patch available GHSA-w67g-2h6v-vjgq
- phlex (RubyGems) Vendor— Affected 2.1.0 to before 2.1.3 Fixed in 2.1.3 Patch available GHSA-w67g-2h6v-vjgq
- phlex (RubyGems) Vendor— Affected 2.0.0.beta1 to before 2.0.2 Fixed in 2.0.2 Patch available GHSA-w67g-2h6v-vjgq
- phlex (RubyGems) Vendor— Affected before 1.11.1 Fixed in 1.11.1 Patch available GHSA-w67g-2h6v-vjgq
Remediation
- Fix · GHSA-w67g-2h6v-vjgq phlex (RubyGems) Fixed in 2.4.1 Advisory →
- Fix · GHSA-w67g-2h6v-vjgq phlex (RubyGems) Fixed in 2.3.2 Advisory →
- Fix · GHSA-w67g-2h6v-vjgq phlex (RubyGems) Fixed in 2.2.2 Advisory →
- Fix · GHSA-w67g-2h6v-vjgq phlex (RubyGems) Fixed in 2.1.3 Advisory →
- Fix · GHSA-w67g-2h6v-vjgq phlex (RubyGems) Fixed in 2.0.2 Advisory →
- Fix · GHSA-w67g-2h6v-vjgq phlex (RubyGems) Fixed in 1.11.1 Advisory →
Timeline
- 2026-10-03 Threatist record created from GHSA-w67g-2h6v-vjgq
References
Other 7
- https://github.com/yippee-fun/phlex/security/advisories/GHSA-w67g-2h6v-vjgq
- https://github.com/yippee-fun/phlex/commit/1d85da417cb15eb8cb2f54a68d531c9b35d9d03a
- https://github.com/yippee-fun/phlex/commit/556441d5a64ff93f749e8116a05b2d97264468ee
- https://github.com/yippee-fun/phlex/commit/74e3d8610ffabc2cf5f241945e9df4b14dceb97d
- https://github.com/yippee-fun/phlex/commit/9f56ad13bea9a7d6117fdfd510446c890709eeac
- https://github.com/yippee-fun/phlex/commit/fe9ea708672f9fa42526d9b47e1cdc4634860ef1
- https://github.com/yippee-fun/phlex
Sources
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences