Missing checks for notification filter preferences editions in XWiki Platform
Description
XWiki Platform is a generic wiki platform offering runtime services for applications built on top of it. It's possible for any user knowing the ID of a notification filter preference of another user, to enable/disable it or even delete it. The impact is that the target user might start loosing notifications on some pages because of this. This vulnerability is present in XWiki since 13.2-rc-1. This vulnerability has been patched in XWiki 14.10.21, 15.5.5, 15.10.1, 16.0-rc-1. The patch consists in checking properly the rights of the user before performing any action on the filters. Users are advised to upgrade. It's possible to fix manually the vulnerability by editing the document XWiki.Notifications.Code.NotificationPreferenceService to apply the changes performed in commit e8acc9d8e6af7dfbfe70716ded431642ae4a6dd4.
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, < 14.10.21 | 14.10.21 |
org.xwiki.platform:xwiki-platform-notifications-uiMaven | >= 15.0-rc-1, < 15.5.5 | 15.5.5 |
org.xwiki.platform:xwiki-platform-notifications-uiMaven | >= 15.6-rc-1, < 15.10.1 | 15.10.1 |
Affected products
1- Range: >= 13.2-rc-1, < 14.10.21
Patches
499193a7e9a20XWIKI-20337: Bad condition for editing notification filter preferences
1 file changed · +1 −1
xwiki-platform-core/xwiki-platform-notifications/xwiki-platform-notifications-ui/src/main/resources/XWiki/Notifications/Code/NotificationPreferenceService.xml+1 −1 modified@@ -52,7 +52,7 @@ #elseif ("$!request.target" == 'user') #set ($targetDoc = $xwiki.getDocument($targetUser)) #set ($targetRef = $services.model.resolveDocument($targetUser)) - #set($isActionAllowed = ($services.security.authorization.hasAccess('admin', $requestedUserDocRef) || $xcontext.userReference.equals($targetRef))) + #set($isActionAllowed = ("$!request.action" == 'watchUser' || "$!request.action" == 'unwatchUser' || $services.security.authorization.hasAccess('admin', $requestedUserDocRef) || $xcontext.userReference.equals($targetRef))) #end #if ("$!request.action" == "" && $request.method.equalsIgnoreCase('get')) This is a technical page for Notifications macro.
b9180b874a22XWIKI-20337: Bad condition for editing notification filter preferences
1 file changed · +1 −1
xwiki-platform-core/xwiki-platform-notifications/xwiki-platform-notifications-ui/src/main/resources/XWiki/Notifications/Code/NotificationPreferenceService.xml+1 −1 modified@@ -52,7 +52,7 @@ #elseif ("$!request.target" == 'user') #set ($targetDoc = $xwiki.getDocument($targetUser)) #set ($targetRef = $services.model.resolveDocument($targetUser)) - #set($isActionAllowed = ($services.security.authorization.hasAccess('admin', $requestedUserDocRef) || $xcontext.userReference.equals($targetRef))) + #set($isActionAllowed = ("$!request.action" == 'watchUser' || "$!request.action" == 'unwatchUser' || $services.security.authorization.hasAccess('admin', $requestedUserDocRef) || $xcontext.userReference.equals($targetRef))) #end #if ("$!request.action" == "" && $request.method.equalsIgnoreCase('get')) This is a technical page for Notifications macro.
4771573dac88XWIKI-20337: Bad condition for editing notification filter preferences
1 file changed · +5 −2
xwiki-platform-core/xwiki-platform-notifications/xwiki-platform-notifications-ui/src/main/resources/XWiki/Notifications/Code/NotificationPreferenceService.xml+5 −2 modified@@ -37,6 +37,7 @@ <syntaxId>xwiki/2.1</syntaxId> <hidden>true</hidden> <content>{{velocity}} +#set($isActionAllowed = false) #if ("$!request.user" != "") #if ($request.user.contains(".")) #set ($targetUser = $request.user) @@ -47,15 +48,17 @@ #if ("$!request.target" == 'wiki') #set ($targetDoc = $xwiki.getDocument($services.model.createDocumentReference('', ['XWiki', 'Notifications', 'Code'], 'NotificationAdministration'))) #set ($targetRef = $services.wiki.getCurrentWikiReference()) + #set($isActionAllowed = $hasAdmin) #elseif ("$!request.target" == 'user') #set ($targetDoc = $xwiki.getDocument($targetUser)) - #set ($targetRef = $targetUser) + #set ($targetRef = $services.model.resolveDocument($targetUser)) + #set($isActionAllowed = ($services.security.authorization.hasAccess('admin', $requestedUserDocRef) || $xcontext.userReference.equals($targetRef))) #end #if ("$!request.action" == "" && $request.method.equalsIgnoreCase('get')) This is a technical page for Notifications macro. #elseif (!$services.csrf.isTokenValid($request.csrf)) #set ($discard = $response.sendError(401, $services.localization.render('notifications.settings.error.badCSRF'))) -#elseif ("$!request.target" == 'wiki' && !$hasAdmin) +#elseif (!$isActionAllowed) #set ($discard = $response.sendError(401)) #elseif ("$!request.action" == "" || "$!request.target" == "" || ("$!request.target" == 'user' && "$!request.user" == "")) #set ($discard = $response.sendError(400, $services.localization.render('notifications.settings.error.badParameters')))
e8acc9d8e6afXWIKI-20337: Bad condition for editing notification filter preferences
1 file changed · +5 −2
xwiki-platform-core/xwiki-platform-notifications/xwiki-platform-notifications-ui/src/main/resources/XWiki/Notifications/Code/NotificationPreferenceService.xml+5 −2 modified@@ -37,6 +37,7 @@ <syntaxId>xwiki/2.1</syntaxId> <hidden>true</hidden> <content>{{velocity}} +#set($isActionAllowed = false) #if ("$!request.user" != "") #if ($request.user.contains(".")) #set ($targetUser = $request.user) @@ -47,15 +48,17 @@ #if ("$!request.target" == 'wiki') #set ($targetDoc = $xwiki.getDocument($services.model.createDocumentReference('', ['XWiki', 'Notifications', 'Code'], 'NotificationAdministration'))) #set ($targetRef = $services.wiki.getCurrentWikiReference()) + #set($isActionAllowed = $hasAdmin) #elseif ("$!request.target" == 'user') #set ($targetDoc = $xwiki.getDocument($targetUser)) - #set ($targetRef = $targetUser) + #set ($targetRef = $services.model.resolveDocument($targetUser)) + #set($isActionAllowed = ($services.security.authorization.hasAccess('admin', $requestedUserDocRef) || $xcontext.userReference.equals($targetRef))) #end #if ("$!request.action" == "" && $request.method.equalsIgnoreCase('get')) This is a technical page for Notifications macro. #elseif (!$services.csrf.isTokenValid($request.csrf)) #set ($discard = $response.sendError(401, $services.localization.render('notifications.settings.error.badCSRF'))) -#elseif ("$!request.target" == 'wiki' && !$hasAdmin) +#elseif (!$isActionAllowed) #set ($discard = $response.sendError(401)) #elseif ("$!request.action" == "" || "$!request.target" == "" || ("$!request.target" == 'user' && "$!request.user" == "")) #set ($discard = $response.sendError(400, $services.localization.render('notifications.settings.error.badParameters')))
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
8- github.com/advisories/GHSA-r95w-889q-x2gxghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2024-46978ghsaADVISORY
- github.com/xwiki/xwiki-platform/commit/4771573dac88e0cf04e30f1a8dfa183c048d503aghsaWEB
- github.com/xwiki/xwiki-platform/commit/99193a7e9a203b5bb8b2583ac96f5f4d56b9aa1aghsaWEB
- github.com/xwiki/xwiki-platform/commit/b9180b874a22e383ad5f2cd9e25bfed4594d4955ghsaWEB
- github.com/xwiki/xwiki-platform/commit/e8acc9d8e6af7dfbfe70716ded431642ae4a6dd4ghsax_refsource_MISCWEB
- github.com/xwiki/xwiki-platform/security/advisories/GHSA-r95w-889q-x2gxghsax_refsource_CONFIRMWEB
- jira.xwiki.org/browse/XWIKI-20337ghsax_refsource_MISCWEB
News mentions
0No linked articles in our index yet.