Apache Wicket XSS Fixes Put Component Context Ahead Of Generic Escaping
Three Apache Wicket XSS flaws affect links and window state. Patch exact release lines, audit component use, and preserve nonce-based CSP.
Apache Wicket has disclosed three high-severity cross-site scripting flaws involving different component paths: an `ExternalLink` rendered on a non-link tag, automatic linkification in `SmartLinkLabel`, and remembered `window.name` state in `AjaxNewWindowNotifyingBehavior`. Each flaw puts attacker-influenced data into a browser execution context that ordinary markup escaping does not make safe. The paths have distinct prerequisites, and none means every Wicket application is automatically exploitable.
Applications should move Wicket 8 to 8.20.0, Wicket 9 to 9.25.0, and Wicket 10 to 10.12.0 at minimum, while planning away from the now end-of-life 8.x and 9.x lines. Wicket 11.0.0 is also available on the project's new quarterly track. Teams should search code and templates for the named components, test attacker-controlled values in the exact browser context, keep Wicket's nonce-based Content Security Policy intact, invalidate exposed sessions where evidence supports execution, and treat the final 8.x/9.x patch as a bridge to a supported line.
Key Takeaways
- check_circle CVE-2026-84231 affects Wicket 8.0.0 through 8.19.0 when `ExternalLink` is bound to a non-link element and its URL model is attacker-influenced.
- check_circle CVE-2026-83539 affects Wicket 8.0.0 through 8.19.0, 9.0.0 through 9.24.0, and 10.0.0 through 10.11.0 when SmartLink components turn untrusted text into clickable URLs.
- check_circle CVE-2026-82956 affects those same three ranges when an application explicitly installs `AjaxNewWindowNotifyingBehavior` and retains attacker-controlled `window.name` state.
- check_circle All three flaws execute in the affected application's origin, so a successful path can act with the victim's browser session and page-visible data.
- check_circle Wicket 9 and 10 nonce-based CSP blocks the SmartLink script scheme under the default policy, but a weakened policy removes that layer and other paths still require the fixed code.
- check_circle Wicket 8.20.0 and 9.25.0 are final releases. Their fixes buy migration time but do not restore ongoing security support.
Three Flaws, Three Component Prerequisites
The advisories describe three cross-site scripting paths rather than one framework-wide parser failure. CVE-2026-84231 is limited to Wicket 8 and `ExternalLink` behavior on markup tags that are not `a`, `link`, or `area`. CVE-2026-83539 applies to the `SmartLinkLabel` and `SmartLinkMultiLineLabel` components in supported affected 8.x, 9.x, and 10.x ranges. CVE-2026-82956 applies only when an application explicitly adds `AjaxNewWindowNotifyingBehavior`.
That component specificity should drive triage. An application that does not use a named class or configuration is not exposed through that path merely because the Wicket library is present. Conversely, a dependency scanner that reports only the version cannot determine whether attacker-controlled data reaches the vulnerable component. Teams need both a runtime or software-bill-of-materials inventory and a source or template search.
The advisories rate the issues High and describe confidentiality and integrity impact in the vulnerable system. They do not report active exploitation, a campaign, or a universal proof that a deployed application is compromised. Patch urgency comes from same-origin script execution and public technical detail. Incident status still depends on an application's component use, data provenance, user interaction, CSP, logs, and observed session activity.
ExternalLink Crosses From HTML Into JavaScript
`ExternalLink` normally represents a destination URL. On a non-link tag such as a button or span, affected Wicket 8 code constructs an inline click handler and places the model URL inside a single-quoted JavaScript string. A similar branch passes the value to `window.open()` when popup settings are present. The URL is therefore not merely an HTML attribute value. It becomes JavaScript source code.
Wicket's ordinary markup escaping can encode an apostrophe as an HTML character reference. That sounds safe when reasoning only about HTML parsing. The browser decodes the character reference while reading the attribute, then compiles the resulting click handler as JavaScript. The apostrophe returns before JavaScript parsing, can close the string, and lets following input become code. Context changes the meaning of the same bytes.
Exploitation requires an application to bind `ExternalLink` to a non-link element, allow an attacker to influence the URL model, and persuade a user to activate that element. Rendering the page alone is not enough according to the advisory. Wicket 8.20.0 fixes the issue. Newer Wicket lines are not listed as affected by this CVE, so teams should not broaden the version range without evidence.
SmartLink Turns Untrusted Text Into An Active URL
`SmartLinkLabel` and `SmartLinkMultiLineLabel` are designed to find URLs in text and make them clickable. In affected versions, the parser accepts a general `scheme://rest` pattern and copies the matched value into an anchor destination without an allowed-scheme decision. A scheme that causes browser script execution can therefore become an active link in the application's origin when a user clicks it.
Escaping the text first does not solve this path. The dangerous value does not need an HTML tag or a quote to become active; it is dangerous because the browser interprets the final value as a URL with executable semantics. Correct handling requires an allowlist of schemes appropriate to the application, not another round of generic string replacement. The project says no other component uses this parser, which provides a useful search boundary.
The advisory identifies an important mitigating condition. Wicket 9.x and 10.x ship a nonce-based CSP that, under its default policy, permits script only when it carries the response nonce. A script-bearing URL cannot supply that nonce, so the policy blocks execution. Wicket 8 lacks that CSP support, and applications that disabled or weakened the default policy lose the protection. Patch even where CSP blocked a test payload because policy can drift and the component remains semantically unsafe.
Remembered Window State Becomes Stored Script Input
`AjaxNewWindowNotifyingBehavior` detects that a page instance opened in another browser window or tab. It asks the browser for `window.name`, receives that client-controlled value as a request parameter, and stores it in the behavior's serialized page state. On later renders, affected code substitutes the remembered value into a single-quoted JavaScript precondition without escaping it for the JavaScript-string context.
An attacker-controlled quote can end the literal and turn the remainder into same-origin script. Unlike the two click-triggered paths, the advisory classifies user interaction as passive because the remembered value is emitted during later page rendering. The stateful design also changes evidence: the initial request that seeds the name and the later response that renders it may be separated in time and may involve a persisted page-store object.
Applications are affected only when they explicitly add this behavior. Search Java configuration, component construction, inherited base pages, and internal libraries rather than assuming the framework installs it. Review request parameters named `windowName`, unusual serialized page-state changes, repeated renders, CSP reports, and session activity around a suspected seed request. Do not log or reproduce a full live payload in tickets where it can execute in administrative tools.
Patch Every Wicket Module And Leave Old Lines
For the shared 8.x, 9.x, and 10.x affected ranges, the published fixed boundaries are 8.20.0, 9.25.0, and 10.12.0. `ExternalLink` CVE-2026-84231 lists only 8.20.0 because only Wicket 8 is affected. Update all Wicket modules in a deployment to the same release. Mixing `wicket-core`, `wicket-extensions`, `wicket-spring`, or transitive integration versions creates an unsupported state and can leave the vulnerable class on the runtime path.
The support boundary matters as much as the patch boundary. Apache says 8.20.0 and 9.25.0 are the final releases of their lines and that neither line will receive another security fix. Wicket 10.12.0 remains the long-term support release until July 2027. Wicket 11.0.0 is the current quarterly release and moves to Java 21 and Jakarta EE 11. A final 8.x or 9.x update closes these known paths but should be paired with a funded move to a supported release.
Stage the update with the application's actual Java, Servlet or Jakarta, Spring, Guice, and component-library requirements. Use dependency resolution output and the built artifact to prove the deployed modules, then run focused browser tests for links, popups, automatically linkified content, new-window behavior, CSP headers, Ajax actions, and session continuity. A passing unit test over an escaped string is not enough because these flaws depend on final browser interpretation.
Investigate The Browser Session, Not Only The Payload
Same-origin script executes with the authority the page gives ordinary first-party JavaScript. Depending on the application, that can include reading page data, issuing authenticated requests, changing visible forms, collecting anti-CSRF material available to script, or sending data to a permitted destination. It does not automatically bypass server-side authorization, browser isolation between origins, or a restrictive CSP. Scope impact from the affected user's privileges and the exact actions the application accepts.
Preserve access logs, application events, page-store and session identifiers, CSP violation reports, reverse-proxy records, web application firewall events, authentication and authorization logs, and high-value business actions. Correlate the request that supplied attacker content, the user who viewed or activated it, and later requests from that session. Search for newly created tokens, changed profile or recovery data, administrative operations, downloads, or outbound browser connections that fit the exposure window.
If evidence supports script execution, invalidate the affected session and other derived browser authority, review high-value changes, and rotate secrets only where the page or session could access them. Remove temporary CSP weakening introduced during testing. Longer term, treat output context as a typed boundary: HTML text, HTML attributes, JavaScript strings, URLs, and CSS each need their own safe construction rules. Framework escaping helps only when the framework knows the final context and the application preserves its policy controls.
Checklist
- Inventory runtime Wicket modules and versions from resolved dependencies, packaged artifacts, and deployed processes.
- Search for `ExternalLink` on non-link tags, SmartLink components, `DefaultLinkParser`, and `AjaxNewWindowNotifyingBehavior`.
- Upgrade affected lines to at least 8.20.0, 9.25.0, or 10.12.0 and keep every Wicket module on the same version.
- Plan migration from end-of-life Wicket 8 or 9 to supported Wicket 10 LTS or the current quarterly line.
- Verify nonce-based CSP headers in production and remove `unsafe-inline`, broad schemes, or other unnecessary weakening.
- Test hostile values in the final browser context without placing executable payloads in shared tickets or dashboards.
- Correlate input, page-state, CSP, session, authorization, and business-action logs before declaring compromise or clearing exposure.
Sources
- Apache advisory for CVE-2026-84231: ExternalLink JavaScript-string injection open_in_new
- Apache advisory for CVE-2026-83539: unsafe URL schemes in SmartLink components open_in_new
- Apache advisory for CVE-2026-82956: stored window.name JavaScript injection open_in_new
- Apache Wicket 10.12.0 release: supported LTS update and CSP-related changes open_in_new
- Apache Wicket 11.0.0 release: quarterly support model and migration boundary open_in_new
- Apache Wicket release policy: current versions, end-of-life lines, and upgrade paths open_in_new
- OWASP XSS Prevention Cheat Sheet: context-specific output handling and CSP limitations open_in_new
Continue Reading
Barracuda Appliance Chain Makes The Admin Interface A Root Boundary
Barracuda flaws can alter ESG configuration and turn admin access into root commands. Patch every appliance, isolate management, and verify state.
Android WAP Push Flaw Turns One Silent Text Into A Telephony Outage
A malformed WAP Push SMS can crash Android telephony without a tap. Verify device patch delivery, protect critical phones, and plan recovery.
Polymarket Script Compromise Turns Browser Sessions Into Wallet Authority
A hijacked performance script used active Polymarket sessions to sell positions and move funds. Audit browser vendors, sessions, DNS, CSP, and integrity.