Skip to main content

Apache Wicket EUVDEUVD-2026-114903

| CVE-2026-95863 HIGH
Cross-site Scripting (XSS) (CWE-79)
2026-11-01 apache GHSA-f4x7-9w8x-8x82
7.6
CVSS 4.0 · Vendor: apache
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Inject quote/backslash into id-derived data
  2. Delivery
    Victim loads rendered Wicket page
  3. Exploit
    Crafted value breaks out of JS string literal
  4. Execution
    Injected script runs in app origin (CSP nonce trusted)
  5. Impact
    Session/DOM actions in victim context

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires that the application supplies a component markup id (via Component#setMarkupId, an id attribute in markup, or a component id derived from data) or a form component id containing a single quote or backslash - Wicket itself never generates such characters, so the tainted value must originate from application data flow. Affected sinks include Form (its markup id and hidden-fields container id on all affected versions; plus an input name in a submitting link on 8.x and an unescaped name attribute via appendDefaultButtonField on 8.x/9.x, where a double quote breaks out of the attribute into markup), FormComponentUpdatingBehavior, MultiFileUploadField, and numerous wicket-extensions components (AjaxEditableLabel, AjaxIndicatorAppender, UploadProgressBar, KittenCaptchaPanel, Palette, FilterForm, and TrapFocusBehavior/AjaxListPanel on 9.x/10.x). Limiting factors: a victim must load the affected rendered page (UI:P), and the application must actually place externally-influenced data into an id - static developer-set ids are not exploitable. The default Wicket 9.x/10.x CSP does NOT limit it, as the injected code sits in a nonce-trusted script element.

Impact

This is a genuine but conditional cross-site scripting flaw (CWE-79) in Apache Wicket, reported by the vendor (Apache) itself. The supplied CVSS 4.0 vector (CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N, score 7.6) shows a network-reachable, low-complexity, unauthenticated flaw - but two signals pull against raw severity. First, AT:P (a specific attack requirement) and UI:P (passive user interaction, i.e. the victim must load the rendered page) mean exploitation is not universal: per the description, the injected value only reaches a JavaScript string literal when the application itself places a single quote or backslash into a component's markup id, its id attribute, or a component id derived from data - Wicket never introduces such characters on its own. So real-world risk is gated by whether a given application routes attacker-influenced data into those identifiers. Second, there is no EPSS score and no CISA KEV listing in the provided data, and no proof-of-concept is supplied - only the Apache advisory thread is referenced. The vuln.today decision label is 'this_week', consistent with a serious, vendor-confirmed issue that is not under active exploitation. Note the default Content-Security-Policy shipped by Wicket 9.x/10.x does NOT mitigate this, because the generated script carries the per-response nonce the policy trusts - a defender might wrongly assume their CSP covers it, so that assumption should be corrected explicitly. Net: a real priority for teams running affected Wicket versions whose applications derive ids from external data, but lower urgency for applications that only use static, developer-set ids.

Exploit ScenarioDerived

An application sets a component's markup id (or a component id used to build a form input name) from attacker-influenced data - for example a record key shown in a list - and that value contains a single quote or backslash. Wicket writes the value unescaped into a single-quoted JavaScript string literal in the script it generates, so the attacker's value closes the literal and the remainder executes as script in the application's origin when a victim loads the page. No authentication is required and the default CSP does not block it; no public proof-of-concept is available at time of analysis.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
No patch listed yet 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Nov 01, 2026

Cross-site scripting in Apache Wicket 8.0.0 through 8.19.0, 9.0.0 through 9.24.0 and 10.0.0 through 10.11.0 lets a value that the application places into a component markup id or a component id break out of a single-quoted JavaScript string literal that Wicket itself generates, so the injected script executes in the application's origin when the page loads. Exploitation is conditional: Wicket never generates a quote or backslash in these identifiers, so the tainted value must originate from application data flow (a value passed to Component#setMarkupId, an id attribute in a template, or a component id derived from data), and a victim must load the affected rendered page; the supplied independent assessment scores this as CVSS 3.1 AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N, i.e. a genuine but conditional flaw rather than a trivially reachable one. No KEV listing is present and no public exploit code is identified in the available intelligence; the vendor's own advisory carries a CVSS 4.0 score of 7.6 and a this_week remediation priority.

RemediationAI

Vendor-released patches fix this in Apache Wicket 8.20.0, 9.25.0 and 10.12.0; upgrade wicket-core and wicket-extensions together to the branch you need (8.20.0, 9.25.0 or 10.12.0) as documented at https://lists.apache.org/thread.html/5wg754b873tlnsc268myrwcoy9lt046v, and note that 7.x and earlier are unsupported and must be moved to a supported line. The fixed versions validate identifiers at the point of entry rather than escaping at each output: a component id or markup id may no longer contain a quote, backquote, backslash, brace, angle bracket, semicolon, ampersand or control character, and markup ids may additionally not contain parentheses or square brackets, with constructors throwing an exception on violation - so expect applications that legitimately use such characters in ids to fail at startup or render time and plan a code review alongside the upgrade. Where an immediate upgrade is not possible, apply the same validation ahead of Wicket in your own code: reject or transform any markup id passed to Component#setMarkupId, any id attribute in templates, and any component id derived from external data so that it contains only a conservative alphanumeric/dash/underscore character set, and in particular never derive component ids from user-controlled strings; the trade-off is that this is application-level discipline that must be repeated for every component and does not close the 8.x/9.x appendDefaultButtonField attribute-injection path. Because the default 9.x/10.x nonce-based Content-Security-Policy admits the generated script, CSP tuning is not a substitute for the fix, and the changed id rules mean any existing ids that rely on the now-rejected characters must be renamed as part of the upgrade.

Affected VersionsENISA

Apache Wicket 10.0.0 ≤10.11.0
Apache Wicket 8.0.0 ≤8.19.0
Apache Wicket 9.0.0 ≤9.24.0

Affected Packages

euvd apache_wicket no fix

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Apache Wicket is a Java component-oriented web framework whose rendering pipeline emits small JavaScript snippets that refer back to the DOM elements it produced - for example Wicket.Event.add calls keyed on a component's markup id. The root cause is CWE-79 (improper neutralization of input during web page generation): OnEventHeaderItem#forMarkupId(String, String, CharSequence) in wicket-core quotes the id it receives into such a JavaScript call, and components in both wicket-core and wicket-extensions reach it through #forComponent(Component, String, CharSequence), but the value is placed inside a single-quoted string literal without escaping for the JavaScript context. A markup id is taken from Component#setMarkupId(String), else the element's id attribute in markup, else a Wicket-generated id (which can never contain the dangerous characters); markup ids and component ids are supplied in an HTML context where quotes and backslashes are legal, and Wicket escapes them correctly when writing the same value into an id attribute - the JavaScript sink is simply a different grammar with different escaping rules. Form component input names are built from the ids of the components between the form and the form component, and component ids were historically rejected only for ':' and '~'. On all affected versions org.apache.wicket.markup.html.form.Form writes its markup id and the id of its hidden-fields container into such literals, FormComponentUpdatingBehavior writes an input name, and MultiFileUploadField writes two markup ids and an input name; on 8.x Form additionally writes an input name into the action of a submitting link, and on 8.x and 9.x Form#appendDefaultButtonField writes an input name into a name attribute with no escaping at all, so a double quote escapes the attribute into markup. wicket-extensions is affected in its own right, not just transitively: AjaxEditableLabel, AjaxIndicatorAppender, AjaxDisableComponentListener, UploadProgressBar, KittenCaptchaPanel, Palette and FilterForm build their own JavaScript containing a markup id, as do TrapFocusBehavior and AjaxListPanel on 9.x and 10.x. The default Content-Security-Policy in Wicket 9.x and 10.x does not mitigate this, because the generated script is written into a script element carrying the per-response nonce and is therefore admitted by the policy. The specific trigger path by which an application would surface such an id is not described in the available sources beyond the application-supplied id conditions above.

Know when Apache Wicket gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (apache) PRIMARY 7.6 HIGH
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N
vuln.today AI 4.7 MEDIUM

Unauthenticated network XSS requiring victim page load (UI:R) and the non-default precondition that the app routes tainted data into an id (AC:H); scope changes into the browser (S:C) with C:L/I:L - higher impact is defensible given full script execution in app origin.

3.1 AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:P/PR:N/UI:A/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N

Primary rating from Vendor (apache).

CVSS VectorVendor: apache

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
Passive
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
High
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

DescriptionCVE.org

Improper neutralization of input during web page generation in Apache Wicket.

Apache Wicket generates JavaScript that refers to the elements it renders, and writes into that JavaScript two values it derives itself: a component's markup id, and the input name of a form component, which is built from component ids. Both are placed inside single-quoted JavaScript string literals without being escaped for that context, so a value containing a single quote or a backslash ends the literal, and what follows is parsed as script and runs in the application's origin when the page loads.

A markup id is the value passed to org.apache.wicket.Component#setMarkupId(String), or the id attribute written in the component's markup, or an id Wicket generates, in that order. The first two are supplied by the application in an HTML context, where both characters are legal and where Wicket escapes them correctly when it writes the same value into the id attribute of the element; a generated id cannot contain either. An input name is derived from the ids of the components between the form and the form component, and a component id was rejected only for ':' and '~'.

In org.apache.wicket:wicket-core on 9.x and 10.x, org.apache.wicket.markup.head.OnEventHeaderItem#forMarkupId(String, String, CharSequence) quotes the id it is given into a Wicket.Event.add call, and components in both wicket-core and wicket-extensions reach it through #forComponent(Component, String, CharSequence). On every affected version, org.apache.wicket.markup.html.form.Form writes its markup id and the id of its hidden-fields container into such literals, org.apache.wicket.markup.html.form.FormComponentUpdatingBehavior writes an input name, and org.apache.wicket.markup.html.form.upload.MultiFileUploadField writes two markup ids and an input name. On 8.x, Form also writes an input name into the action of a submitting link, and on 8.x and 9.x Form#appendDefaultButtonField writes an input name into a name attribute with no escaping at all, so a value containing a double quote escapes the attribute into markup.

org.apache.wicket:wicket-extensions is affected in its own right and not only through wicket-core: AjaxEditableLabel, AjaxIndicatorAppender, AjaxDisableComponentListener, UploadProgressBar, KittenCaptchaPanel, Palette, FilterForm and, on 9.x and 10.x, TrapFocusBehavior and AjaxListPanel each build their own JavaScript containing a markup id.

An application is affected where a markup id or a component id carries one of those characters. Wicket does not put one there itself, so the value comes from the application: an id set on a component, an id attribute in a template, or a component id derived from data. None of those is a JavaScript context from the application's point of view.

The Content-Security-Policy that Apache Wicket 9.x and 10.x send by default does not prevent this. The generated script is written into a script element carrying the per-response nonce, so the injected code is part of a script the policy admits.

The fixed versions check an id where it enters instead of escaping each place it is written. A component id and a markup id may no longer contain a quote, a backquote, a backslash, braces, angle brackets, a semicolon, an ampersand or a control character, and a markup id may not contain parentheses or square brackets either; a component constructed with such an id, or given such a markup id, fails with an exception.

This issue affects Apache Wicket: from 8.0.0 through 8.19.0, from 9.0.0 through 9.24.0, from 10.0.0 through 10.11.0. Users of Apache Wicket 7.x or older, which are no longer supported, should upgrade to a supported version. Users are recommended to upgrade to version 8.20.0, 9.25.0 or 10.12.0, which fix the issue.

Executive ViewAI

Why It Matters

A high-severity cross-site scripting vulnerability in Apache Wicket (CVE-2026-95863) affects versions 8.x, 9.x, and 10.x, potentially allowing an attacker to execute scripts in the context of our web applications. This could lead to session hijacking or data theft for users of applications built on these Wicket versions. Leadership should prioritize remediation because the vulnerability is conditional but could be exploited by a determined attacker with application-specific knowledge, and no patch is currently available.

Business Impact: High
Compensating Controls

Implement strict input validation and output encoding for all component markup IDs and component IDs, ensure they are generated from trusted sources, and deploy a web application firewall (WAF) with rules to detect and block XSS attempts targeting Wicket-generated JavaScript.

Threat Intelligence Overview

EPSS Score
0.3%
Top 73% exploitable
Prevalence
Low
Apache Wicket is a niche Java web framework with limited enterprise footprint
Social Media
1
Sightings
Data Quality
3 sources
Confidence: Low

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.3%
Patch available No
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact
High

Priority Score

38
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +38
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

CVE-2026-43975 MEDIUM POC
6.5 May 06

Path traversal vulnerability in Apache Wicket's FolderUploadsFileManager allows unauthenticated attackers to read arbitr

CVE-2026-84170 HIGH
8.3 Nov 01

Apache Wicket's form-less upload endpoint (AbstractFileUploadResource, the server side of FileUploadToResourceField, or

CVE-2026-83594 HIGH
8.3 Nov 01

Heap-exhaustion denial of service in Apache Wicket 9.14.0 through 9.24.0 and 10.0.0 through 10.11.0, reachable without a

CVE-2026-111089 HIGH
7.6 Nov 01

Cross-site scripting in Apache Wicket 8.0.0 through 8.19.0, 9.0.0 through 9.24.0 and 10.0.0 through 10.11.0 allows text

CVE-2026-82956 HIGH
7.6 Nov 01

Stored cross-site scripting in Apache Wicket's AjaxNewWindowNotifyingBehavior allows a client-supplied browser window na

CVE-2026-84231 HIGH
7.4 Nov 01

Cross-site scripting in Apache Wicket 8.0.0 through 8.19.0 lets remote attackers get script executed in the application'

CVE-2026-83559 HIGH
7.4 Nov 01

Apache Wicket's public JavaScriptUtils.escapeQuotes() helper fails to escape backslashes before quotes, so attacker-infl

CVE-2026-83539 HIGH
7.4 Nov 01

Cross-site scripting in Apache Wicket's SmartLinkLabel and SmartLinkMultiLineLabel components turns attacker-influenced

CVE-2026-82840 HIGH
7.2 Nov 01

Session fixation in Apache Wicket's role-based authentication module leaves the container session id unchanged when an a

CVE-2026-82704 MEDIUM
6.9 Nov 01

Missing authorization in Apache Wicket 8.x, 9.x and 10.x allows unauthenticated remote attackers to invoke a component's

CVE-2026-82557 MEDIUM
6.9 Nov 01

Missing authorization in Apache Wicket 10.3.0 through 10.11.0 allows a remote unauthenticated caller to invoke the serve

CVE-2026-66391 MEDIUM
6.5 Jul 27

Unauthenticated remote attackers can partially read and modify data in Apache Wicket versions 9.0.0 through 9.23.0 and 1

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy