{"id":"GHSA-w67g-2h6v-vjgq","aliases":[],"url":"https://o3.security/vulnerability/GHSA-w67g-2h6v-vjgq","summary":"Phlex XSS protection bypass via attribute splatting, dynamic tags, and href values","details":"### Impact\n\nDuring 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.\n\n1. The first bypass could happen if user-provided attributes with string keys were splatted into HTML tag, e.g. `div(**user_attributes)`.\n2. The second bypass could happen if user-provided tag names were passed to the `tag` method, e.g. `tag(some_tag_name_from_user)`.\n3. The third bypass could happen if user’s links were passed to `href` attributes, e.g. `a(href: user_provided_link)`.\n\nAll three of these patterns are meant to be safe and all have now been patched.\n\n### Patches\n\nPhlex has patched all three issues and introduced new tests that run against Safari, Firefox and Chrome.\n\nThe patched versions are:\n\n- [2.4.1](https://rubygems.org/gems/phlex/versions/2.4.1)\n- [2.3.2](https://rubygems.org/gems/phlex/versions/2.3.2)\n- [2.2.2](https://rubygems.org/gems/phlex/versions/2.2.2)\n- [2.1.3](https://rubygems.org/gems/phlex/versions/2.1.3)\n- [2.0.2](https://rubygems.org/gems/phlex/versions/2.0.3)\n- [1.11.1](https://rubygems.org/gems/phlex/versions/1.11.1)\n\nPhlex has also patched the [`main`](https://github.com/yippee-fun/phlex) branch in GitHub.\n\n### Workarounds\nIf 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.","published":"2026-02-06T19:35:09Z","modified":"2026-02-06T20:58:00.573179Z","cvss":{"score":7.1,"severity":"HIGH","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:L/A:N"},"epss":null,"cisaKev":null,"exploitsKnown":0,"affectedPackages":[{"ecosystem":"RubyGems","name":"phlex","fixedVersion":"2.4.1"},{"ecosystem":"RubyGems","name":"phlex","fixedVersion":"2.3.2"},{"ecosystem":"RubyGems","name":"phlex","fixedVersion":"2.2.2"},{"ecosystem":"RubyGems","name":"phlex","fixedVersion":"2.1.3"},{"ecosystem":"RubyGems","name":"phlex","fixedVersion":"2.0.2"},{"ecosystem":"RubyGems","name":"phlex","fixedVersion":"1.11.1"}],"fix":{"url":"https://github.com/yippee-fun/phlex/commit/1d85da417cb15eb8cb2f54a68d531c9b35d9d03a","label":"yippee-fun/phlex@1d85da4"},"references":[{"type":"WEB","url":"https://github.com/yippee-fun/phlex/security/advisories/GHSA-w67g-2h6v-vjgq"},{"type":"WEB","url":"https://github.com/yippee-fun/phlex/commit/1d85da417cb15eb8cb2f54a68d531c9b35d9d03a"},{"type":"WEB","url":"https://github.com/yippee-fun/phlex/commit/556441d5a64ff93f749e8116a05b2d97264468ee"},{"type":"WEB","url":"https://github.com/yippee-fun/phlex/commit/74e3d8610ffabc2cf5f241945e9df4b14dceb97d"},{"type":"WEB","url":"https://github.com/yippee-fun/phlex/commit/9f56ad13bea9a7d6117fdfd510446c890709eeac"},{"type":"WEB","url":"https://github.com/yippee-fun/phlex/commit/fe9ea708672f9fa42526d9b47e1cdc4634860ef1"},{"type":"PACKAGE","url":"https://github.com/yippee-fun/phlex"}],"provenance":{"sources":["OSV.dev","FIRST.org (EPSS)"],"lastVerified":"2026-02-06T20:58:00.573179Z"}}