org.xwiki.platform:xwiki-platform-notifications-ui Eval Injection vulnerability
Description
XWiki Commons are technical libraries common to several other top level XWiki projects. Any user with view rights on commonly accessible documents including the notification preferences macros can execute arbitrary Groovy, Python or Velocity code in XWiki leading to full access to the XWiki installation. The root cause is improper escaping of the user parameter of the macro that provide the notification filters. These macros are used in the user profiles and thus installed by default in XWiki. The vulnerability has been patched in XWiki 13.10.11, 14.4.7 and 14.10.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
org.xwiki.platform:xwiki-platform-notifications-uiMaven | >= 13.2-rc-1, < 13.10.11 | 13.10.11 |
org.xwiki.platform:xwiki-platform-notifications-uiMaven | >= 14.0-rc-1, < 14.4.7 | 14.4.7 |
org.xwiki.platform:xwiki-platform-notifications-uiMaven | >= 14.5, < 14.10 | 14.10 |
Affected products
1- Range: >= 13.2-rc-1, < 13.10.11
Patches
1cebf9167e4fdXWIKI-20259: Improve escaping in Notification Preferences Macros
6 files changed · +13 −11
xwiki-platform-core/xwiki-platform-notifications/xwiki-platform-notifications-ui/src/main/resources/XWiki/Notifications/Code/NotificationsApplicationsPreferencesMacro.xml+1 −1 modified@@ -982,7 +982,7 @@ require(['jquery', 'xwiki-meta', 'ApplicationWidget', 'xwiki-bootstrap-switch', #set ($targetUser = $xcontext.userReference) #set ($targetUserReference = $services.user.currentUserReference) #end - #set ($divData = "data-user=""$services.model.serialize($targetUser)""") + #set ($divData = "data-user=""$escapetool.xml($services.model.serialize($targetUser))""") #end #set ($userDoc = $xwiki.getDocument($targetUser)) ######################################################
xwiki-platform-core/xwiki-platform-notifications/xwiki-platform-notifications-ui/src/main/resources/XWiki/Notifications/Code/NotificationsAutoWatchPreferencesMacro.xml+2 −2 modified@@ -391,7 +391,7 @@ {{/error}} #elseif ($wikimacro.parameters.target == 'user' && "$!wikimacro.parameters.user" != "" && !$services.security.authorization.hasAccess('admin', $wikimacro.parameters.user.reference) && !$xcontext.userReference.equals($wikimacro.parameters.user.reference)) {{error}} - {{translation key="notifications.settings.error.userReferenceAdminForbidden" parameters="$wikimacro.parameters.user" /}} + {{translation key="notifications.settings.error.userReferenceAdminForbidden" parameters="~"${services.rendering.escape($escapetool.java($wikimacro.parameters.user), 'xwiki/2.1')}~"" /}} {{/error}} #else #set ($discard = $xwiki.jsx.use('XWiki.Notifications.Code.NotificationsAutoWatchPreferencesMacro')) @@ -403,7 +403,7 @@ #set ($dataUser = "") #if ($wikimacro.parameters.target == 'user') #set ($mode = $services.notification.watch.getAutomaticWatchMode($targetUser)) - #set ($dataUser = "data-user=""$services.model.serialize($targetUser)""") + #set ($dataUser = "data-user=""$escapetool.xml($services.model.serialize($targetUser))""") #else #set ($mode = $services.notification.watch.defaultAutomaticWatchMode) #end
xwiki-platform-core/xwiki-platform-notifications/xwiki-platform-notifications-ui/src/main/resources/XWiki/Notifications/Code/NotificationsCustomFiltersPreferencesMacro.xml+1 −1 modified@@ -1083,7 +1083,7 @@ require(['jquery', 'AddCustomNotificationFilterPreferenceLivetable', 'xwiki-boot #else #set ($targetUser = $xcontext.userReference) #end - #set ($divData = "data-doc-url=""$escapetool.xml($services.rest.url($targetUser))"" data-user=""$services.model.serialize($targetUser)""") + #set ($divData = "data-doc-url=""$escapetool.xml($services.rest.url($targetUser))"" data-user=""$escapetool.xml($services.model.serialize($targetUser))""") #end ###################################################### ### CSS and JAVASCRIPTS
xwiki-platform-core/xwiki-platform-notifications/xwiki-platform-notifications-ui/src/main/resources/XWiki/Notifications/Code/NotificationsEmailPreferencesMacro.xml+2 −2 modified@@ -423,7 +423,7 @@ {{/error}} #elseif ($wikimacro.parameters.target == 'user' && "$!wikimacro.parameters.user" != "" && !$services.security.authorization.hasAccess('admin', $wikimacro.parameters.user.reference) && !$xcontext.userReference.equals($wikimacro.parameters.user.reference)) {{error}} - {{translation key="notifications.settings.error.userReferenceAdminForbidden" parameters="$wikimacro.parameters.user" /}} + {{translation key="notifications.settings.error.userReferenceAdminForbidden" parameters="$~"${services.rendering.escape($escapetool.java($wikimacro.parameters.user), 'xwiki/2.1')}~"" /}} {{/error}} #else @@ -434,7 +434,7 @@ #end #set ($dataUser = "") #if ($wikimacro.parameters.target == 'user') - #set ($dataUser = "data-user=""$services.model.serialize($targetUser)""") + #set ($dataUser = "data-user=""$escapetool.xml($services.model.serialize($targetUser))""") #end #set ($discard = $xwiki.jsx.use('XWiki.Notifications.Code.NotificationsEmailPreferencesMacro')) {{html clean="false"}}
xwiki-platform-core/xwiki-platform-notifications/xwiki-platform-notifications-ui/src/main/resources/XWiki/Notifications/Code/NotificationsFiltersPreferencesMacro.xml+6 −4 modified@@ -1050,11 +1050,11 @@ require(['jquery', 'AddNotificationFilterPreferenceLivetable', 'xwiki-bootstrap- ## This should be improved later with such API. #elseif ("$!wikimacro.parameters.user" != "" && $wikimacro.parameters.user.class.simpleName != 'DocumentUserReference') {{error}} - This macro only allows to handle DocumentUserReference references and you specified a $wikimacro.parameters.user.class.simpleName reference. + This macro only allows to handle DocumentUserReference references and you specified a $services.rendering.escape($wikimacro.parameters.user.class.simpleName, 'xwiki/2.1') reference. {{/error}} #elseif ("$!wikimacro.parameters.user" != "" && !$services.security.authorization.hasAccess('admin', $wikimacro.parameters.user.reference) && !$xcontext.userReference.equals($wikimacro.parameters.user.reference)) {{error}} - You don't have administration right on $wikimacro.parameters.user. + You don't have administration right on $services.rendering.escape($wikimacro.parameters.user, 'xwiki/2.1'). {{/error}} #else #set ($discard = $services.logging.deprecate("NotificationsFiltersPreferencesMacro", "This macro should not be used anymore in favor of SystemNotificationsFiltersPreferencesMacro and CustomNotificationsFiltersPreferencesMacro.")) @@ -1075,7 +1075,8 @@ require(['jquery', 'AddNotificationFilterPreferenceLivetable', 'xwiki-bootstrap- ### MACRO CONTENT ###################################################### {{html clean="false"}} -<div class="filterPreferences xform" data-user-url="$escapetool.xml($services.rest.url($targetUser))" data-user="$services.model.serialize($targetUser)"> +<div class="filterPreferences xform" data-user-url="$escapetool.xml($services.rest.url($targetUser))" + data-user="$escapetool.xml($services.model.serialize($targetUser))"> <div class="row"> <p class="xHint col-xs-12 col-sm-9 col-md-8 col-lg-9"> $escapetool.xml($services.localization.render('notifications.settings.filters.preferences.hint')) @@ -1109,7 +1110,8 @@ require(['jquery', 'AddNotificationFilterPreferenceLivetable', 'xwiki-bootstrap- ###################################################### ### ADD FILTER MODAL ###################################################### -<div class="modal fade" tabindex="-1" role="dialog" id="modal-add-filter-preference" data-user="$services.model.serialize($targetUser)"> +<div class="modal fade" tabindex="-1" role="dialog" id="modal-add-filter-preference" + data-user="$escapetool.xml($services.model.serialize($targetUser))"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header">
xwiki-platform-core/xwiki-platform-notifications/xwiki-platform-notifications-ui/src/main/resources/XWiki/Notifications/Code/NotificationsSystemFiltersPreferencesMacro.xml+1 −1 modified@@ -845,7 +845,7 @@ require(['jquery', 'xwiki-bootstrap-switch', 'xwiki-events-bridge'], function ($ #else #set ($targetUser = $xcontext.userReference) #end - #set ($divData = "data-doc-url=""$escapetool.xml($services.rest.url($targetUser))"" data-user=""$services.model.serialize($targetUser)""") + #set ($divData = "data-doc-url=""$escapetool.xml($services.rest.url($targetUser))"" data-user=""$escapetool.xml($services.model.serialize($targetUser))""") #end ###################################################### ### CSS and JAVASCRIPTS
Vulnerability mechanics
Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
5- github.com/advisories/GHSA-p9mj-v5mf-m82xghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2023-29210ghsaADVISORY
- github.com/xwiki/xwiki-platform/commit/cebf9167e4fd64a8777781fc56461e9abbe0b32aghsax_refsource_MISCWEB
- github.com/xwiki/xwiki-platform/security/advisories/GHSA-p9mj-v5mf-m82xghsax_refsource_CONFIRMWEB
- jira.xwiki.org/browse/XWIKI-20259ghsax_refsource_MISCWEB
News mentions
0No linked articles in our index yet.