Read the docs
TI-2026-66206 Aliases GHSA-w67g-2h6v-vjgq

Phlex XSS protection bypass via attribute splatting, dynamic tags, and href values

Priority LOW 38CWE-79Published · Updated

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

Fix Fixed phlex (RubyGems): 2.4.1, 2.3.2, 2.2.2 +3

SSVC decision points

Not available: CISA has not published SSVC decision points for this record.

Affected products

VendorProductAffected versionsFixed inStatusSource
—phlex (RubyGems)2.4.0.beta1 to before 2.4.12.4.1Patch availableGHSA-w67g-2h6v-vjgq
—phlex (RubyGems)2.3.0 to before 2.3.22.3.2Patch availableGHSA-w67g-2h6v-vjgq
—phlex (RubyGems)2.2.0 to before 2.2.22.2.2Patch availableGHSA-w67g-2h6v-vjgq
—phlex (RubyGems)2.1.0 to before 2.1.32.1.3Patch availableGHSA-w67g-2h6v-vjgq
—phlex (RubyGems)2.0.0.beta1 to before 2.0.22.0.2Patch availableGHSA-w67g-2h6v-vjgq
—phlex (RubyGems)before 1.11.11.11.1Patch availableGHSA-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

  1. 2026-10-03 Threatist record created from GHSA-w67g-2h6v-vjgq

References

Sources

This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences