{"id":"GHSA-68p9-83h6-5wpj","kind":"vulnerability","aliases":["GHSA-68p9-83h6-5wpj"],"related":[],"title":"Possible XSS vulnerability in Action View tag helpers","description":"### Impact\nThe fix for [CVE-2026-33168](https://github.com/rails/rails/security/advisories/GHSA-v55j-83pf-r9cq) skips blank HTML attribute names in Action View tag helpers, but it tests the name before converting it to a string. A Symbol name made only of whitespace, such as `:\" \"`, is not blank, because `Symbol#blank?` is `Symbol#empty?`, so it reaches the attribute escaping, which emits an attribute with no name and produces malformed HTML. The asset tag helpers, such as `image_tag`, `video_tag` and `audio_tag`, symbolize their options, so a whitespace String name passed to them takes the same path. A carefully crafted attribute value could then be misinterpreted by the browser as a separate attribute name, possibly leading to XSS. Applications that allow users to specify custom HTML attribute names are affected.\n\n### Releases\nThe fixed releases are available at the normal locations.\n\nPatches for those who cannot upgrade at once:\n- 8.1: https://github.com/rails/rails/commit/9190210606ffe52f92fdc75637f8ff69404f22c8.patch\n- 8.0: https://github.com/rails/rails/commit/f47452533e1f28d847c63181b9d5f8b7243ef9a4.patch\n\n### Credit\nThis issue was responsibly reported by HackerOne researcher [thepo1es](https://hackerone.com/thepo1es).","summary":"Action View's tag helpers emit malformed HTML when an attribute name is whitespace only, because a blank-name check runs before the name is converted to a string. A crafted attribute value can then be read by a browser as a separate attribute, which may lead to cross-site scripting.","severity":"medium","cvss":4.7,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"actionview","fixed":["8.1.4.1"],"affected":">= 8.1, < 8.1.4.1","ecosystem":"rubygems"},{"name":"actionview","fixed":["8.0.5.2"],"affected":"< 8.0.5.2","ecosystem":"rubygems"}],"ecosystems":["rubygems"],"tags":["actionview","cwe-79","package","rails","ruby"],"not_affected_if":["fixed-attribute-names","no-user-attribute-names"],"how_to_check":"- Check the Rails version in `Gemfile.lock` for `actionview` and compare it with the fixed ranges.\n- Search application code for user-controlled HTML attribute names passed to tag helpers such as `tag.div`, `content_tag`, `image_tag`, `video_tag` or `audio_tag`.","fix":"- `actionview` 8.1.x: move to `8.1.4.1`\n- `actionview` 8.0.x: move to `8.0.5.2`","status":"open","published_at":"2026-11-04T03:02:03+00:00","first_seen_at":"2026-11-09T22:53:29+00:00","triaged_at":"2026-11-09T22:57:08+00:00","updated_at":"2026-11-09T22:57:08+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-09T22:57:08Z","model":"claude-haiku-5-5","output":{"fix":"- `actionview` 8.1.x: move to `8.1.4.1`\n- `actionview` 8.0.x: move to `8.0.5.2`","reach":"internet","title":"Rails Action View: whitespace attribute names can enable XSS in tag helpers","impact":"medium","summary":"Action View's tag helpers emit malformed HTML when an attribute name is whitespace only, because a blank-name check runs before the name is converted to a string. A crafted attribute value can then be read by a browser as a separate attribute, which may lead to cross-site scripting.","audience":"developers","category":"package","nicknames":[],"who_cares":["rails","actionview","ruby"],"confidence":0.8,"fix_status":"available","needs_auth":"unknown","worst_case":"attacker injects script into pages viewed by other users","analyst_note":"","how_to_check":"- Check the Rails version in `Gemfile.lock` for `actionview` and compare it with the fixed ranges.\n- Search application code for user-controlled HTML attribute names passed to tag helpers such as `tag.div`, `content_tag`, `image_tag`, `video_tag` or `audio_tag`.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["fixed-attribute-names","no-user-attribute-names"],"who_is_affected":"Applications built on Rails that let users choose custom HTML attribute names for tag helpers are exposed, since a whitespace-only name reaches the attribute escaping code. Applications that only use fixed attribute names in their templates are not affected by this path. Teams that cannot upgrade immediately can apply the patch linked in the advisory.","user_interaction":"yes","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000805,"input_tokens":5038,"output_tokens":602,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-2026':85C '-33168':86C '-79':23B '/rails/rails/commit/9190210606ffe52f92fdc75637f8ff69404f22c8.patch':228C '/rails/rails/commit/f47452533e1f28d847c63181b9d5f8b7243ef9a4.patch':232C '/rails/rails/security/advisories/ghsa-v55j-83pf-r9cq)':89C '/thepo1es).':245C '5wpj':13A,18A '68p9':11A,16A '8.0':229C '8.1':225C '83h6':12A,17A 'action':5A,27B,96C 'actionview':19A,20A,21B 'affect':206C 'allow':197C 'applic':195C 'asset':147C 'attribut':37B,59B,71B,93C,133C,138C,177C,189C,203C 'audio':157C 'avail':212C 'blank':45B,91C,122C,125C 'blank-nam':44B 'browser':67B,185C 'cannot':221C 'care':175C 'check':47B 'convert':53B,106C 'could':179C 'craft':58B,176C 'credit':233C 'cross':77B 'cross-sit':76B 'custom':201C 'cve':84C 'cwe':22B 'emit':32B,136C 'empti':128C 'escap':134C 'fix':82C,209C 'ghsa':10A,15A 'ghsa-68p9-83h6-5wpj':9A,14A 'github.com':88C,227C,231C 'github.com/rails/rails/commit/9190210606ffe52f92fdc75637f8ff69404f22c8.patch':226C 'github.com/rails/rails/commit/f47452533e1f28d847c63181b9d5f8b7243ef9a4.patch':230C 'github.com/rails/rails/security/advisories/ghsa-v55j-83pf-r9cq)':87C 'hackeron':240C 'hackerone.com':244C 'hackerone.com/thepo1es).':243C 'helper':8A,31B,99C,149C 'html':34B,92C,145C,202C 'imag':152C 'impact':80C 'issu':235C 'lead':74B,192C 'locat':216C 'made':114C 'malform':33B,144C 'may':73B 'misinterpret':182C 'name':38B,46B,51B,94C,104C,113C,141C,166C,190C,204C 'normal':215C 'option':161C 'packag':24B 'pass':167C 'patch':217C 'path':173C 'possibl':1A,191C 'produc':143C 'rail':25B 'reach':131C 'read':64B 'releas':207C,210C 'report':238C 'research':241C 'respons':237C 'rubi':26B 'run':48B 'script':79B 'separ':70B,188C 'site':78B 'skip':90C 'specifi':200C 'string':56B,110C,165C 'symbol':112C,124C,127C,159C 'tag':7A,30B,98C,148C,153C,155C,158C 'take':170C 'test':102C 'thepo1es':242C 'upgrad':222C 'user':198C 'valu':60B,178C 'video':154C 'view':6A,28B,97C 'vulner':3A 'whitespac':40B,117C,164C 'xss':2A,194C","nicknames":[],"mitigations":[],"who_affected":"Applications built on Rails that let users choose custom HTML attribute names for tag helpers are exposed, since a whitespace-only name reaches the attribute escaping code. Applications that only use fixed attribute names in their templates are not affected by this path. Teams that cannot upgrade immediately can apply the patch linked in the advisory.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":["actionview"],"ptokens":["actionview"],"labels":["actionview","cwe79","medium","package","rails","ruby","rubygems"],"campaign_type":null,"search_a":"'5wpj':13A,18A '68p9':11A,16A '83h6':12A,17A 'action':5A 'actionview':19A,20A 'ghsa':10A,15A 'ghsa-68p9-83h6-5wpj':9A,14A 'helper':8A 'possibl':1A 'tag':7A 'view':6A 'vulner':3A 'xss':2A","search_b":"'-79':23B 'action':27B 'actionview':21B 'attribut':37B,59B,71B 'blank':45B 'blank-nam':44B 'browser':67B 'check':47B 'convert':53B 'craft':58B 'cross':77B 'cross-sit':76B 'cwe':22B 'emit':32B 'helper':31B 'html':34B 'lead':74B 'malform':33B 'may':73B 'name':38B,46B,51B 'packag':24B 'rail':25B 'read':64B 'rubi':26B 'run':48B 'script':79B 'separ':70B 'site':78B 'string':56B 'tag':30B 'valu':60B 'view':28B 'whitespac':40B","search_c":"'-2026':85C '-33168':86C '/rails/rails/commit/9190210606ffe52f92fdc75637f8ff69404f22c8.patch':228C '/rails/rails/commit/f47452533e1f28d847c63181b9d5f8b7243ef9a4.patch':232C '/rails/rails/security/advisories/ghsa-v55j-83pf-r9cq)':89C '/thepo1es).':245C '8.0':229C '8.1':225C 'action':96C 'affect':206C 'allow':197C 'applic':195C 'asset':147C 'attribut':93C,133C,138C,177C,189C,203C 'audio':157C 'avail':212C 'blank':91C,122C,125C 'browser':185C 'cannot':221C 'care':175C 'convert':106C 'could':179C 'craft':176C 'credit':233C 'custom':201C 'cve':84C 'emit':136C 'empti':128C 'escap':134C 'fix':82C,209C 'github.com':88C,227C,231C 'github.com/rails/rails/commit/9190210606ffe52f92fdc75637f8ff69404f22c8.patch':226C 'github.com/rails/rails/commit/f47452533e1f28d847c63181b9d5f8b7243ef9a4.patch':230C 'github.com/rails/rails/security/advisories/ghsa-v55j-83pf-r9cq)':87C 'hackeron':240C 'hackerone.com':244C 'hackerone.com/thepo1es).':243C 'helper':99C,149C 'html':92C,145C,202C 'imag':152C 'impact':80C 'issu':235C 'lead':192C 'locat':216C 'made':114C 'malform':144C 'misinterpret':182C 'name':94C,104C,113C,141C,166C,190C,204C 'normal':215C 'option':161C 'pass':167C 'patch':217C 'path':173C 'possibl':191C 'produc':143C 'reach':131C 'releas':207C,210C 'report':238C 'research':241C 'respons':237C 'separ':188C 'skip':90C 'specifi':200C 'string':110C,165C 'symbol':112C,124C,127C,159C 'tag':98C,148C,153C,155C,158C 'take':170C 'test':102C 'thepo1es':242C 'upgrad':222C 'user':198C 'valu':178C 'video':154C 'view':97C 'whitespac':117C,164C 'xss':194C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-04T03:02:03+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"ghsa-repo","external_id":"GHSA-68p9-83h6-5wpj","url":"https://github.com/rails/rails/security/advisories/GHSA-68p9-83h6-5wpj","severity":"medium","published_at":"2026-11-04T03:02:03+00:00","modified_at":"2026-11-04T03:02:03+00:00","first_seen_at":"2026-11-09T22:53:29+00:00","fetched_at":"2026-11-09T22:53:29+00:00","note":null}],"documents":[{"id":110675,"url":"https://github.com/rails/rails/security/advisories/GHSA-68p9-83h6-5wpj","title":"Maintainer's advisory: github.com","kind":"vendor","source":"ghsa-repo","publisher":"vendor","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Maintainer's advisory: github.com"}],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}