Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessRequest bookmarkable listener URL omitting page identifier
-
DeliveryNew page instance constructed, configure()/onConfigure() skipped
-
ExploitConstructor-default visibility flag counts component visible
-
ExecutionInvoke listener on RENDER-denied component
-
ImpactPerform unauthorized action on attacker-supplied models
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization checks on every request
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitable only against a Wicket application that withholds an individual component in one of two specific ways: (1) denying the Component.RENDER action through IAuthorizationStrategy - including MetaDataRoleAuthorizationStrategy and AuthorizeAction from wicket-auth-roles - or (2) setting the component's visible/enabled flag inside Component#onConfigure(), the callback Wicket's docs recommend for both. The page carrying that component must also be constructible from a bookmarkable or mounted URL, i.e. it must have a public constructor taking no arguments or a PageParameters argument. Attached AJAX behaviours pass the same gate and are equally exposed. Two trigger routes exist, neither needing more than a request: on a stateful page the caller omits the page identifier from the listener URL; on a page Wicket treats as stateless (which a RENDER-denied component can itself cause) Wicket already emits page-id-less listener URLs, so nothing must be altered. Limiting factors: no authentication is required (PR:N); instantiation authorization (isInstantiationAuthorized()) still runs, so page-level guards remain effective; the ENABLE decision and requests supplying a real identifier of an already-rendered page still refuse - but components disabled only in onConfigure() are protected by none of these because that callback never runs. Upgrading to 8.20.0, 9.25.0, or 10.12.0 is the stated fix. |
| Impact | Signals are moderate and broadly consistent. The vendor-supplied CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N) with a vulnerable-system impact of integrity-low only (VC:N/VI:L/VA:N, score 6.9 MEDIUM) describes a remote, unauthenticated authorization-bypass whose damage is confined to invoking a single withheld component's listener/behaviour and acting on attacker-supplied models - not data theft or service disruption. The vuln.today decision label is this_month, i.e. patch on a normal cycle rather than emergency. There is no CISA KEV listing and no EPSS score in the input, so exploitation status is: no public exploit identified at time of analysis; the only reference is the Apache advisory thread, not a PoC. The gap between the CVSS 'AC:L/PR:N' rating and real-world reach is the application-specific precondition: exploitation only matters where an app actually withholds a component via IAuthorizationStrategy RENDER denial or via onConfigure() visibility/enablement, and where the hosting page is constructible from a bookmarkable/mounted URL. This makes it a genuine but conditional priority - serious for apps using wicket-auth-roles or onConfigure-based hiding, largely moot for apps that guard whole pages (isInstantiationAuthorized() is unaffected). No key signals conflict; the main missing data is EPSS and any independent exploitation telemetry. |
| Exploit ScenarioDerived | An application hides an admin-only link or AJAX behaviour by denying its RENDER action (e.g. via MetaDataRoleAuthorizationStrategy/AuthorizeAction) or by clearing its visibility in Component#onConfigure(). An unauthenticated attacker requests a bookmarkable/mounted listener URL for that component with the page identifier omitted, so Wicket builds a fresh page instance and invokes the listener before configure()/onConfigure() ever run, executing the denied callback on models derived from the attacker's own page parameters. No public exploit code is identified at time of analysis; only the vendor advisory is referenced. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Nov 01, 2026
Missing authorization in Apache Wicket 8.x, 9.x and 10.x allows unauthenticated remote attackers to invoke a component's IRequestListener even though the application's IAuthorizationStrategy denied the Component.RENDER action for that component, or even though the application set the component invisible or disabled in Component#onConfigure(). The flaw is reachable with nothing more than a crafted or simply unmodified request, because Wicket can build a listener URL without a page identifier and then invokes the listener on a freshly constructed page instance before any render pass has populated the authorization-derived visibility flag; the impact is limited to integrity (low), with no confidentiality or availability effect assessed. Exploitation requires a Wicket application that withholds an individual component via a RENDER denial or via visibility/enablement set in onConfigure(), on a page that is reachable from a bookmarkable or mounted URL and has a public no-argument or PageParameters constructor; signals are moderate and broadly consistent, and no public exploit identified at time of analysis.
RemediationAI
Upgrade to a fixed release on the applicable branch: Apache Wicket 8.20.0 (from 8.0.0-8.19.0), 9.25.0 (from 9.0.0-9.24.0), or 10.12.0 (from 10.0.0-10.11.0), as stated in the Apache advisory at https://lists.apache.org/thread.html/yrtov7vfmj7c7wl7j1tt0dsv2t0zwy9b. Because the defect is bypassed at listener dispatch time, the protections that remain effective pending upgrade are precisely those that run on the request path in the affected code: a guard placed on the page through IAuthorizationStrategy#isInstantiationAuthorized(), which is still consulted when the new page instance is created and therefore still holds against the page-id-less route, and a component withheld through the ENABLE decision of IAuthorizationStrategy, which is re-evaluated on every invocation and still refuses. A component whose visibility or enabled flag is set only inside Component#onConfigure() is protected by neither of these, since that callback never runs on the affected path, so such components must be moved behind a page-level instantiation guard or an ENABLE denial until the upgrade is applied. Denying RENDER is itself insufficient and can even cause the page to be treated as stateless, which produces the page-id-less listener URLs automatically.
Affected VersionsENISA
Affected Packages
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
The root cause is a CWE-862 missing authorization defect in Wicket's listener dispatch path. org.apache.wicket.core.request.handler.ListenerRequestHandler invokes an IRequestListener only when Component#canCallListener() permits it, and that method is the conjunction of isEnabledInHierarchy() and isVisibleInHierarchy(). The visibility half reads a flag that caches the outcome of IAuthorizationStrategy#isActionAuthorized() for the Component.RENDER action, and that flag is written in exactly one place, Component#configure(), during the render phase. Listener URLs produced by subclasses of org.apache.wicket.core.request.mapper.AbstractBookmarkableMapper pack the page identifier and the component path into a single parameter, and the page identifier may be empty. When it is empty, a new page instance is constructed, PageProvider#wasExpired() returns false because no identifier was supplied, and PageAndComponentProvider#getComponent() resolves the component directly on that new instance, so neither a render pass nor Component#configure() ever runs before the listener fires. The flag retains its constructor default, the component is treated as visible, and the denied listener executes. The same request also skips Component#onConfigure(), so visibility and enablement that an application sets there are likewise not applied. Two routes reach this state and neither needs more than a request: on a stateful page the caller omits the page identifier from a listener URL that would otherwise carry it, and on a page Wicket considers stateless nothing has to be altered at all, because Wicket itself emits page-id-less listener URLs for those pages and a component denied RENDER is treated as stateless (so denying RENDER can itself produce the page-id-less form). The ENABLE decision of IAuthorizationStrategy is consulted on every invocation and still refuses, as does a request that supplies the real identifier of an already-rendered page instance, but a component disabled only in Component#onConfigure() is protected by neither. Behaviours pass through the same gate, so an AJAX behaviour attached to such a component is equally exposed, and separately a listener on a page Wicket considers stateful is invoked on an instance constructed by the request itself, acting on models built from caller-supplied page parameters rather than on the state the application last rendered. Instantiation authorization is unaffected: IAuthorizationStrategy#isInstantiationAuthorized() is still consulted when the new page instance is created, so guards placed on the page rather than on the individual component continue to hold.
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
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N
Remote, unauthenticated, single request (AV:N/AC:L/PR:N/UI:N); only a withheld component's action runs, giving limited integrity impact (I:L) with no confidentiality or availability loss.
Primary rating from Vendor (apache).
CVSS VectorVendor: apache
DescriptionCVE.org
Missing authorization in Apache Wicket.
org.apache.wicket.core.request.handler.ListenerRequestHandler invokes an IRequestListener only when org.apache.wicket.Component#canCallListener() allows it, and that method is isEnabledInHierarchy() && isVisibleInHierarchy(). The visibility half reads a flag that carries the outcome of IAuthorizationStrategy#isActionAuthorized() for the Component.RENDER action, and that flag is written in one place only, Component#configure(), during the render phase. A listener URL built by a subclass of org.apache.wicket.core.request.mapper.AbstractBookmarkableMapper carries the page identifier and the component path in a single parameter, and the page identifier may be empty. When it is, a new page instance is constructed, PageProvider#wasExpired() is false because no identifier was supplied, and PageAndComponentProvider#getComponent() finds the component directly on the new instance, so neither a render pass nor Component#configure() runs before the listener is invoked. The flag therefore still holds its constructor default, the component counts as visible, and the listener of a component the authorization strategy denied RENDER for is executed. The same request also skips Component#onConfigure(), so visibility and enablement an application sets there are not applied either.
There are two ways to reach this, and neither requires anything but a request. On a page that is stateful, the caller omits the page identifier from a listener URL that would otherwise carry it. On a page that Wicket considers stateless, nothing has to be altered at all: Wicket itself writes listener URLs without a page identifier for such pages, and a component the strategy denies RENDER for is treated as stateless and therefore does not keep the page stateful, so denying RENDER can itself produce the page-id-less form. The second route has never been refused. The ENABLE decision of IAuthorizationStrategy is consulted on every invocation and still refuses, as does a request that supplies the real identifier of a page instance that has already been rendered; a component the application disabled in Component#onConfigure() is protected by neither, because that callback has not run.
An application is affected where it withholds an individual component from the caller, either by denying the RENDER action through IAuthorizationStrategy, including through the MetaDataRoleAuthorizationStrategy and AuthorizeAction facilities of wicket-auth-roles, or by setting the component's visibility or enabled flag in Component#onConfigure(), the callback Wicket's own documentation directs applications to use for both. The page carrying such a component has to be constructible from a bookmarkable or mounted URL, which requires a public constructor taking either no arguments or a PageParameters argument. Behaviours pass through the same gate, so an AJAX behaviour attached to such a component is equally exposed. Separately, and whether or not any component is withheld, a listener on a page Wicket considers stateful is invoked on an instance the request itself constructed, so it acts on models built from page parameters the caller supplied rather than on the state the application last rendered. Instantiation authorization is unaffected: IAuthorizationStrategy#isInstantiationAuthorized() is still consulted when the new page instance is created, so a guard placed on the page rather than on the individual component continues to hold.
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 are recommended to upgrade to version 8.20.0, 9.25.0 or 10.12.0, which fix the issue.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
More in Apache Wicket
View allPath traversal vulnerability in Apache Wicket's FolderUploadsFileManager allows unauthenticated attackers to read arbitr
Apache Wicket's form-less upload endpoint (AbstractFileUploadResource, the server side of FileUploadToResourceField, or
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
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
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
Stored cross-site scripting in Apache Wicket's AjaxNewWindowNotifyingBehavior allows a client-supplied browser window na
Cross-site scripting in Apache Wicket 8.0.0 through 8.19.0 lets remote attackers get script executed in the application'
Apache Wicket's public JavaScriptUtils.escapeQuotes() helper fails to escape backslashes before quotes, so attacker-infl
Cross-site scripting in Apache Wicket's SmartLinkLabel and SmartLinkMultiLineLabel components turns attacker-influenced
Session fixation in Apache Wicket's role-based authentication module leaves the container session id unchanged when an a
Missing authorization in Apache Wicket 10.3.0 through 10.11.0 allows a remote unauthenticated caller to invoke the serve
Unauthenticated remote attackers can partially read and modify data in Apache Wicket versions 9.0.0 through 9.23.0 and 1
EUVD-2026-114890
GHSA-6m6x-fvwc-5g3p
NVD
CVE.org
EPSS
Exploit-DB