{"id":"CVE-2026-120350","kind":"vulnerability","aliases":["CVE-2026-120350"],"related":[],"title":"Vaadin Rich Text Editor: crafted video embed runs script in browsers","description":"The Vaadin Rich Text Editor exports a video embed without escaping its value, and then parses the resulting HTML into live DOM. A value crafted to break out of the href attribute therefore runs script in the viewer's browser. An attacker who can edit shared content pastes a video embed carrying the payload, the delta is stored, and the script runs when any user opens the page, including in read only mode.\n\nOnly content persisted through asDelta() is affected. The default HTML value, set and read through setValue and getValue, is sanitized on the server with a safelist that has no iframe, so the embed does not survive that path. Vaadin 24 and older are not affected: they build the HTML value from the editor's own innerHTML, which the browser escapes.\n\nUsers of affected versions should apply the following mitigation or upgrade. Releases that have fixed this issue include:\n\nProduct version\nVaadin 25.0.0 - 25.0.13\nVaadin 25.1.0 - 25.1.13\nVaadin 25.2.0 - 25.2.12\nVaadin 25.3.0 - 25.3.4\n\nMitigation\nNo fixed release on this line, upgrade to 25.2.13 or newer\nNo fixed release on this line, upgrade to 25.2.13 or newer\nUpgrade to 25.2.13\nUpgrade to 25.3.5","summary":"The Vaadin Rich Text Editor writes a video embed value into HTML without escaping it, then parses that HTML into live page content. A crafted value breaks out of the href attribute and runs script in the browser of anyone who opens the page, including read-only viewers.","severity":"medium","cvss":5.1,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["java","package","rich-text-editor","vaadin"],"not_affected_if":["default-html-value-only","no-asdelta-persistence","vaadin-24-or-older"],"how_to_check":"- Check the Vaadin version in the project build file; affected versions are 25.0.0-25.0.13, 25.1.0-25.1.13, 25.2.0-25.2.12 and 25.3.0-25.3.4.\n- Search the code for `asDelta()`; only content persisted through asDelta() is affected, while the default setValue/getValue HTML path is sanitized.","fix":"- Vaadin 25.0.x and 25.1.x: no fixed release on these lines; upgrade to `25.2.13` or newer.\n- Vaadin 25.2.x: upgrade to `25.2.13`.\n- Vaadin 25.3.x: upgrade to `25.3.5`.","status":"open","published_at":"2026-11-10T12:17:17+00:00","first_seen_at":"2026-11-10T12:21:53+00:00","triaged_at":"2026-11-10T12:22:54+00:00","updated_at":"2026-11-10T12:22:54+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-10T12:22:54Z","model":"claude-haiku-5-5","output":{"fix":"- Vaadin 25.0.x and 25.1.x: no fixed release on these lines; upgrade to `25.2.13` or newer.\n- Vaadin 25.2.x: upgrade to `25.2.13`.\n- Vaadin 25.3.x: upgrade to `25.3.5`.","reach":"internet","title":"Vaadin Rich Text Editor: crafted video embed runs script in browsers","impact":"high","summary":"The Vaadin Rich Text Editor writes a video embed value into HTML without escaping it, then parses that HTML into live page content. A crafted value breaks out of the href attribute and runs script in the browser of anyone who opens the page, including read-only viewers.","audience":"developers","category":"package","nicknames":[],"who_cares":["vaadin","java","rich-text-editor"],"confidence":0.8,"fix_status":"available","needs_auth":"yes","worst_case":"Script runs in any viewer's browser, even read-only.","analyst_note":"","how_to_check":"- Check the Vaadin version in the project build file; affected versions are 25.0.0-25.0.13, 25.1.0-25.1.13, 25.2.0-25.2.12 and 25.3.0-25.3.4.\n- Search the code for `asDelta()`; only content persisted through asDelta() is affected, while the default setValue/getValue HTML path is sanitized.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["vaadin-24-or-older","default-html-value-only","no-asdelta-persistence"],"who_is_affected":"Apps built with Vaadin 25 that store rich text through asDelta() and let users edit shared content are exposed, because a stored video embed can carry the script. Vaadin 24 and older are not affected, and apps that only use the default setValue/getValue HTML value are not affected because the server sanitizer removes the iframe. Teams that do not persist deltas can skip it.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"unknown"},"cost_usd":0.001648,"input_tokens":4891,"output_tokens":2318,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-120350':14A,17A '-2026':13A,16A '24':186C '25.0.0':228C '25.0.13':229C '25.1.0':231C '25.1.13':232C '25.2.0':234C '25.2.12':235C '25.2.13':248C,259C,264C '25.3.0':237C '25.3.4':238C '25.3.5':267C 'affect':153C,191C,209C 'anyon':64B 'appli':212C 'asdelta':151C 'attack':115C 'attribut':56B,105C 'break':51B,100C 'browser':11A,62B,113C,205C 'build':193C 'carri':125C 'content':47B,120C,148C 'craft':5A,49B,98C 'cve':12A,15A 'default':155C 'delta':129C 'dom':95C 'edit':118C 'editor':4A,23B,29B,78C,199C 'emb':7A,33B,82C,124C,179C 'escap':38B,84C,206C 'export':79C 'fix':221C,241C,252C 'follow':214C 'getvalu':164C 'href':55B,104C 'html':36B,43B,92C,156C,195C 'ifram':176C 'includ':69B,142C,224C 'innerhtml':202C 'issu':223C 'java':18B 'line':245C,256C 'live':45B,94C 'mitig':215C,239C 'mode':146C 'newer':250C,261C 'older':188C 'open':66B,139C 'packag':19B 'page':46B,68B,141C 'pars':41B,89C 'past':121C 'path':184C 'payload':127C 'persist':149C 'product':225C 'read':71B,144C,160C 'read-on':70B 'releas':218C,242C,253C 'result':91C 'rich':2A,21B,27B,76C 'rich-text-editor':20B 'run':8A,58B,107C,135C 'safelist':172C 'sanit':166C 'script':9A,59B,108C,134C 'server':169C 'set':158C 'setvalu':162C 'share':119C 'store':131C 'surviv':182C 'text':3A,22B,28B,77C 'therefor':106C 'upgrad':217C,246C,257C,262C,265C 'user':138C,207C 'vaadin':1A,24B,26B,75C,185C,227C,230C,233C,236C 'valu':34B,50B,86C,97C,157C,196C 'version':210C,226C 'video':6A,32B,81C,123C 'viewer':73B,111C 'without':37B,83C 'write':30B","nicknames":[],"mitigations":[],"who_affected":"Apps built with Vaadin 25 that store rich text through asDelta() and let users edit shared content are exposed, because a stored video embed can carry the script. Vaadin 24 and older are not affected, and apps that only use the default setValue/getValue HTML value are not affected because the server sanitizer removes the iframe. Teams that do not persist deltas can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["java","medium","package","richtexteditor","vaadin"],"campaign_type":null,"search_a":"'-120350':14A,17A '-2026':13A,16A 'browser':11A 'craft':5A 'cve':12A,15A 'editor':4A 'emb':7A 'rich':2A 'run':8A 'script':9A 'text':3A 'vaadin':1A 'video':6A","search_b":"'anyon':64B 'attribut':56B 'break':51B 'browser':62B 'content':47B 'craft':49B 'editor':23B,29B 'emb':33B 'escap':38B 'href':55B 'html':36B,43B 'includ':69B 'java':18B 'live':45B 'open':66B 'packag':19B 'page':46B,68B 'pars':41B 'read':71B 'read-on':70B 'rich':21B,27B 'rich-text-editor':20B 'run':58B 'script':59B 'text':22B,28B 'vaadin':24B,26B 'valu':34B,50B 'video':32B 'viewer':73B 'without':37B 'write':30B","search_c":"'24':186C '25.0.0':228C '25.0.13':229C '25.1.0':231C '25.1.13':232C '25.2.0':234C '25.2.12':235C '25.2.13':248C,259C,264C '25.3.0':237C '25.3.4':238C '25.3.5':267C 'affect':153C,191C,209C 'appli':212C 'asdelta':151C 'attack':115C 'attribut':105C 'break':100C 'browser':113C,205C 'build':193C 'carri':125C 'content':120C,148C 'craft':98C 'default':155C 'delta':129C 'dom':95C 'edit':118C 'editor':78C,199C 'emb':82C,124C,179C 'escap':84C,206C 'export':79C 'fix':221C,241C,252C 'follow':214C 'getvalu':164C 'href':104C 'html':92C,156C,195C 'ifram':176C 'includ':142C,224C 'innerhtml':202C 'issu':223C 'line':245C,256C 'live':94C 'mitig':215C,239C 'mode':146C 'newer':250C,261C 'older':188C 'open':139C 'page':141C 'pars':89C 'past':121C 'path':184C 'payload':127C 'persist':149C 'product':225C 'read':144C,160C 'releas':218C,242C,253C 'result':91C 'rich':76C 'run':107C,135C 'safelist':172C 'sanit':166C 'script':108C,134C 'server':169C 'set':158C 'setvalu':162C 'share':119C 'store':131C 'surviv':182C 'text':77C 'therefor':106C 'upgrad':217C,246C,257C,262C,265C 'user':138C,207C 'vaadin':75C,185C,227C,230C,233C,236C 'valu':86C,97C,157C,196C 'version':210C,226C 'video':81C,123C 'viewer':111C 'without':83C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-10T12:17:17+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"security@vaadin.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-120350","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-120350","severity":null,"published_at":"2026-11-10T12:17:17+00:00","modified_at":"2026-11-10T12:17:17+00:00","first_seen_at":"2026-11-10T12:21:53+00:00","fetched_at":"2026-11-10T12:21:53+00:00","note":null}],"documents":[],"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"}