{"id":"CVE-2026-84231","kind":"vulnerability","aliases":["CVE-2026-84231"],"related":[],"title":"Apache Wicket: ExternalLink on non-anchor tags runs attacker script on click","description":"Improper neutralization of input during web page generation in Apache Wicket.\n\norg.apache.wicket.markup.html.link.ExternalLink builds a JavaScript click handler and writes it into the tag's onclick attribute whenever the markup tag the component is bound to is not an a, link or area element. The URL held in the component's model is concatenated into a single-quoted JavaScript string literal in that handler without being escaped for that context. The same happens on the neighbouring branch, taken when popup settings are attached, where the value is concatenated into the window.open() call built by org.apache.wicket.markup.html.link.PopupSettings#getPopupJavaScript(). The only escaping applied is the markup escaping that every attribute value receives as the tag is written, which replaces an apostrophe with a character reference. A browser decodes character references in an attribute value before it compiles the event handler, so the apostrophe is restored, closes the string literal, and the rest of the model value is executed as script in the application's origin.\n\nAn application is affected where it binds an ExternalLink to a markup tag that is not an anchor, such as a button or a span, and the URL in the model holds data an attacker can influence, which is the ordinary use of the component rather than a misuse of it. Nothing runs until a user activates the element.\n\nThis issue affects Apache Wicket: from 8.0.0 through 8.19.0. Users of Apache Wicket 7.x or older, which are no longer supported, should upgrade to a supported version.\n\nUsers are recommended to upgrade to version 8.20.0, which fixes the issue.","summary":"ExternalLink writes its URL into a single-quoted JavaScript string in an onclick attribute when bound to a non-anchor tag such as a button or span, and only HTML-escapes the value. The browser decodes the escaped apostrophe, so an attacker-influenced URL breaks out of the string and runs script in the application's origin once a user clicks the element.","severity":"high","cvss":7.4,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["apache-wicket","java","package","web-apps"],"not_affected_if":["anchor-only-links","no-external-link","wicket-8.20.0-or-later"],"how_to_check":"- Search templates and Java code for `ExternalLink` bound to tags other than `a`, `link` or `area`, such as `<button wicket:id=...>` or `<span wicket:id=...>`.\n- Check the Wicket version in the build file: `org.apache.wicket:wicket-core` between `8.0.0` and `8.19.0`, or any `7.x` release.","fix":"- Apache Wicket: upgrade to `8.20.0`.\n- Apache Wicket 7.x and older: no supported fix; move to a supported version.","status":"open","published_at":"2026-11-01T23:17:30+00:00","first_seen_at":"2026-11-01T23:22:40+00:00","triaged_at":"2026-11-01T23:23:27+00:00","updated_at":"2026-11-01T23:23:27+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-01T23:23:27Z","model":"claude-haiku-5-5","output":{"fix":"- Apache Wicket: upgrade to `8.20.0`.\n- Apache Wicket 7.x and older: no supported fix; move to a supported version.","reach":"internet","title":"Apache Wicket: ExternalLink on non-anchor tags runs attacker script on click","impact":"high","summary":"ExternalLink writes its URL into a single-quoted JavaScript string in an onclick attribute when bound to a non-anchor tag such as a button or span, and only HTML-escapes the value. The browser decodes the escaped apostrophe, so an attacker-influenced URL breaks out of the string and runs script in the application's origin once a user clicks the element.","audience":"businesses","category":"package","nicknames":[],"who_cares":["apache-wicket","java","web-apps"],"confidence":0.8,"fix_status":"available","needs_auth":"unknown","worst_case":"script runs in the application's origin, reading session data","analyst_note":"","how_to_check":"- Search templates and Java code for `ExternalLink` bound to tags other than `a`, `link` or `area`, such as `<button wicket:id=...>` or `<span wicket:id=...>`.\n- Check the Wicket version in the build file: `org.apache.wicket:wicket-core` between `8.0.0` and `8.19.0`, or any `7.x` release.","plain_action":"","needs_analyst":false,"not_affected_if":["anchor-only-links","no-external-link","wicket-8.20.0-or-later"],"who_is_affected":"Applications built on Apache Wicket 8.0.0 through 8.19.0 are exposed when they bind an ExternalLink to a non-anchor markup tag and the URL in its model can be influenced by an attacker. Applications that only use ExternalLink on a, link or area tags, or that do not use ExternalLink, are not affected by the described path. Wicket 7.x and older are also affected and are no longer supported.","user_interaction":"yes","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000798,"input_tokens":4517,"output_tokens":693,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-2026':15A,18A '-84231':16A,19A '7':329C '8.0.0':322C '8.19.0':324C '8.20.0':351C 'activ':313C 'affect':260C,318C 'anchor':7A,49B,274C 'apach':1A,21B,104C,319C,327C 'apache-wicket':20B 'apostroph':69B,212C,234C 'app':27B 'appli':194C 'applic':86B,254C,258C 'area':136C 'attach':177C 'attack':10A,73B,291C 'attacker-influenc':72B 'attribut':42B,120C,201C,224C 'bind':263C 'bound':44B,128C 'branch':171C 'break':76B 'browser':65B,218C 'build':107C 'built':187C 'button':54B,278C 'call':186C 'charact':215C,220C 'click':13A,92B,110C 'close':237C 'compil':228C 'compon':126C,143C,301C 'concaten':147C,182C 'context':164C 'cve':14A,17A 'data':289C 'decod':66B,219C 'element':94B,137C,315C 'escap':61B,68B,161C,193C,198C 'event':230C 'everi':200C 'execut':249C 'externallink':3A,28B,265C 'fix':353C 'generat':102C 'getpopupjavascript':190C 'handler':111C,158C,231C 'happen':167C 'held':140C 'hold':288C 'html':60B 'html-escap':59B 'improp':95C 'influenc':74B,293C 'input':98C 'issu':317C,355C 'java':23B 'javascript':37B,109C,153C 'link':134C 'liter':155C,240C 'longer':336C 'markup':123C,197C,268C 'misus':305C 'model':145C,246C,287C 'neighbour':170C 'neutral':96C 'non':6A,48B 'non-anchor':5A,47B 'noth':308C 'older':332C 'onclick':41B,119C 'ordinari':297C 'org.apache.wicket.markup.html.link.externallink':106C 'org.apache.wicket.markup.html.link.popupsettings':189C 'origin':88B,256C 'packag':24B 'page':101C 'popup':174C 'quot':36B,152C 'rather':302C 'receiv':203C 'recommend':346C 'refer':216C,221C 'replac':210C 'rest':243C 'restor':236C 'run':9A,82B,309C 'script':11A,83B,251C 'set':175C 'singl':35B,151C 'single-quot':34B,150C 'span':56B,281C 'string':38B,80B,154C,239C 'support':337C,342C 'tag':8A,50B,117C,124C,206C,269C 'taken':172C 'upgrad':339C,348C 'url':31B,75B,139C,284C 'use':298C 'user':91B,312C,325C,344C 'valu':63B,180C,202C,225C,247C 'version':343C,350C 'web':26B,100C 'web-app':25B 'whenev':121C 'wicket':2A,22B,105C,320C,328C 'window.open':185C 'without':159C 'write':29B,113C 'written':208C 'x':330C","nicknames":[],"mitigations":[],"who_affected":"Applications built on Apache Wicket 8.0.0 through 8.19.0 are exposed when they bind an ExternalLink to a non-anchor markup tag and the URL in its model can be influenced by an attacker. Applications that only use ExternalLink on a, link or area tags, or that do not use ExternalLink, are not affected by the described path. Wicket 7.x and older are also affected and are no longer supported.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"first_public_at":"2026-11-01T23:17:30+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:A/VC:H/VI:H/VA:N/SC:N/SI:N/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@apache.org","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-84231","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-84231","severity":null,"published_at":"2026-11-01T23:17:30+00:00","modified_at":"2026-11-01T23:17:30+00:00","first_seen_at":"2026-11-01T23:22:40+00:00","fetched_at":"2026-11-01T23:22:40+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}