VYPR
Critical severityNVD Advisory· Published Apr 15, 2023· Updated Feb 6, 2025

org.xwiki.platform:xwiki-platform-notifications-ui Eval Injection vulnerability

CVE-2023-29210

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.

PackageAffected versionsPatched versions
org.xwiki.platform:xwiki-platform-notifications-uiMaven
>= 13.2-rc-1, < 13.10.1113.10.11
org.xwiki.platform:xwiki-platform-notifications-uiMaven
>= 14.0-rc-1, < 14.4.714.4.7
org.xwiki.platform:xwiki-platform-notifications-uiMaven
>= 14.5, < 14.1014.10

Affected products

1

Patches

1
cebf9167e4fd

XWIKI-20259: Improve escaping in Notification Preferences Macros

https://github.com/xwiki/xwiki-platformMichael HamannOct 26, 2022via ghsa
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' &amp;&amp; "$!wikimacro.parameters.user" != "" &amp;&amp; !$services.security.authorization.hasAccess('admin', $wikimacro.parameters.user.reference) &amp;&amp; !$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' &amp;&amp; "$!wikimacro.parameters.user" != "" &amp;&amp; !$services.security.authorization.hasAccess('admin', $wikimacro.parameters.user.reference) &amp;&amp; !$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" != "" &amp;&amp; $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" != "" &amp;&amp; !$services.security.authorization.hasAccess('admin', $wikimacro.parameters.user.reference) &amp;&amp; !$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"}}
    -&lt;div class="filterPreferences xform" data-user-url="$escapetool.xml($services.rest.url($targetUser))" data-user="$services.model.serialize($targetUser)"&gt;
    +&lt;div class="filterPreferences xform" data-user-url="$escapetool.xml($services.rest.url($targetUser))"
    +  data-user="$escapetool.xml($services.model.serialize($targetUser))"&gt;
       &lt;div class="row"&gt;
         &lt;p class="xHint col-xs-12 col-sm-9 col-md-8 col-lg-9"&gt;
           $escapetool.xml($services.localization.render('notifications.settings.filters.preferences.hint'))
    @@ -1109,7 +1110,8 @@ require(['jquery', 'AddNotificationFilterPreferenceLivetable', 'xwiki-bootstrap-
     ######################################################
     ### ADD FILTER MODAL
     ######################################################
    -&lt;div class="modal fade" tabindex="-1" role="dialog" id="modal-add-filter-preference" data-user="$services.model.serialize($targetUser)"&gt;
    +&lt;div class="modal fade" tabindex="-1" role="dialog" id="modal-add-filter-preference"
    +  data-user="$escapetool.xml($services.model.serialize($targetUser))"&gt;
       &lt;div class="modal-dialog" role="document"&gt;
         &lt;div class="modal-content"&gt;
           &lt;div class="modal-header"&gt;
    
  • 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

News mentions

0

No linked articles in our index yet.