Severity: moderate 
    CVSS 4.0: 7.4 (high) 
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

Affected versions:

- Apache Wicket (org.apache.wicket:wicket-core) 8.0.0 through 8.19.0
- Apache Wicket (org.apache.wicket:wicket-core) 9.0.0 through 9.24.0
- Apache Wicket (org.apache.wicket:wicket-core) 10.0.0 through 10.11.0

Description:

Improper encoding or escaping of output in Apache Wicket.

org.apache.wicket.core.util.string.JavaScriptUtils#escapeQuotes() replaces each 
single quote in its input with a backslash and a single quote, and each double 
quote with a backslash and a double quote, so that the value can be placed 
inside a JavaScript string literal. It does not escape the backslash, which is 
the character that has to be escaped, and escaped first, for the rest of that 
escaping to hold. A value that already holds a backslash immediately before a 
quote therefore ends up with two backslashes in front of that quote: the first 
escapes the second, the quote itself is left unescaped, and it closes the 
literal. Whatever the value carries after that point is no longer text but 
JavaScript, and it runs in the application's origin and in the session of the 
user looking at the page. The method is public, is not deprecated, and its 
documentation states that its result can be part of a JavaScript call such as 
an alert; the only limitation it notes concerns JSON values, which need 
different escaping.

An application is affected wherever it calls the method itself and places the 
result inside a JavaScript string literal, from its own code or from a 
component of its own or of a third party, and the value it escapes holds data 
an attacker can influence. There is no further condition, and no component of 
Wicket has to be involved: the application is using the method for what its 
documentation offers, and the method does not deliver it.

Two components shipped with Wicket Extensions pass a value through the method. 
org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel writes the 
editor's first error feedback message into a single-quoted JavaScript string 
literal in the Ajax response, so an application is affected through that 
component where the message shown for a failed edit holds data an attacker can 
influence, whether that is the submitted value itself or another variable the 
application sets on the validation error. A validation message can carry the 
submitted value, because input is a message variable that every form component 
supplies for its own validation errors, and the documentation shows overriding 
a validator's message to include it; none of the message bundles shipped with 
Wicket interpolates it, so an application that has not written such a message 
is not affected through this component. 
org.apache.wicket.extensions.ajax.markup.html.repeater.AjaxListPanel passes the 
serialized markup tag of an appended component through the method and is not 
affected: the tag comes from the panel's own markup file, and a quote in any of 
its attribute values, the component's markup id included, is written as a 
character reference by the tag serialization and cannot close the literal.

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.

Credit:

Emond Papegaaij (finder)

References:

https://wicket.apache.org/
https://www.cve.org/CVERecord?id=CVE-2026-83559

Reply via email to