XWiki Platform Applications Tag and XWiki Platform Tag UI vulnerable to Eval Injection
Description
XWiki Platform Applications Tag and XWiki Platform Tag UI are tag applications for XWiki, a generic wiki platform. Starting with version 1.7 in XWiki Platform Applications Tag and prior to 13.10.6 and 14.4 in XWiki Platform Tag UI, the tags document Main.Tags in XWiki didn't sanitize user inputs properly. This allowed users with view rights on the document (default in a public wiki or for authenticated users on private wikis) to execute arbitrary Groovy, Python and Velocity code with programming rights. This also allowed bypassing all rights checks and thus both modification and disclosure of all content stored in the XWiki installation. The vulnerability could be used to impact the availability of the wiki. On XWiki versions before 13.10.4 and 14.2, this can be combined with CVE-2022-36092, meaning that no rights are required to perform the attack. The vulnerability has been patched in versions 13.10.6 and 14.4. As a workaround, the patch that fixes the issue can be manually applied to the document Main.Tags or the updated version of that document can be imported from version 14.4 of xwiki-platform-tag-ui using the import feature in the administration UI on XWiki 10.9 and later.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
org.xwiki.platform:xwiki-platform-tag-uiMaven | < 13.10.6 | 13.10.6 |
org.xwiki.platform.applications:xwiki-application-tagMaven | >= 1.7 | — |
org.xwiki.platform:xwiki-platform-tag-uiMaven | >= 14.0, < 14.4 | 14.4 |
Affected products
1- Range: >= 1.7, < 13.10.6
Patches
1604868033ebdXWIKI-19747: Escape tag names
1 file changed · +9 −8
xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-ui/src/main/resources/Main/Tags.xml+9 −8 modified@@ -51,14 +51,15 @@ $xwiki.ssx.use('Main.Tags')## ## #set ($do = "$!{request.get('do')}") #set ($tag = "$!{request.get('tag')}") +#set ($wikiEscapedTag = $services.rendering.escape($tag, 'xwiki/2.1')) #set ($urlEscapedTag = $escapetool.url($tag)) #set ($htmlEscapedTag = $escapetool.xml($tag)) ## ## Macro displayTagAppTitle. Display level1 title of this app. ## #macro (displayTagAppTitle $urlEscapedTag $htmlEscapedTag $displayButtons) (% class="xapp" %) - = (% class="highlight tag" %)${tag}## + = (% class="highlight tag" %)${wikiEscapedTag}## #if ($xwiki.hasAdminRights() && $displayButtons) ## [[$services.localization.render('xe.tag.rename.link')>>||queryString="do=prepareRename&tag=${urlEscapedTag}" class="button rename" rel="nofollow"]] [[$services.localization.render('xe.tag.delete.link')>>||queryString="do=prepareDelete&tag=${urlEscapedTag}" class="button delete" rel="nofollow"]]## #end @@ -74,14 +75,14 @@ $xwiki.ssx.use('Main.Tags')## ## #displayTagAppTitle($urlEscapedTag $htmlEscapedTag true) #if ("$!{request.get('renamedTag')}" != '') - {{info}}$services.localization.render('xe.tag.rename.success', ["//${request.get('renamedTag')}//"]){{/info}} + {{info}}$services.localization.render('xe.tag.rename.success', ["//${services.rendering.escape(${request.get('renamedTag')}, 'xwiki/2.1')}//"]){{/info}} #end #set ($list = $xwiki.tag.getDocumentsWithTag($tag)) {{container layoutStyle="columns"}} ((( (% class="xapp" %) - === $services.localization.render('xe.tag.alldocs', ["//${tag}//"]) === + === $services.localization.render('xe.tag.alldocs', ["//${wikiEscapedTag}//"]) === #if ($list.size()> 0) {{html}}#displayDocumentList($list false $blacklistedSpaces){{/html}} @@ -91,8 +92,8 @@ $xwiki.ssx.use('Main.Tags')## ))) ((( (% class="xapp" %) - === $services.localization.render('xe.tag.activity', ["//${tag}//"]) === - {{notifications useUserPreferences="false" displayOwnEvents="true" tags="$tag" displayRSSLink="true" /}} + === $services.localization.render('xe.tag.activity', ["//${wikiEscapedTag}//"]) === + {{notifications useUserPreferences="false" displayOwnEvents="true" tags="$wikiEscapedTag" displayRSSLink="true" /}} ))) {{/container}} #elseif ($do == 'prepareRename') @@ -123,7 +124,7 @@ $xwiki.ssx.use('Main.Tags')## #set ($urlEscapedRenameTo = $escapetool.url($renameTo)) $response.sendRedirect($doc.getURL('view', "do=viewTag&tag=${urlEscapedRenameTo}&renamedTag=${urlEscapedTag}")) #else - {{error}}$services.localization.render('xe.tag.rename.failure', ["//${tag}//", "//${renameTo}//"]){{/error}} + {{error}}$services.localization.render('xe.tag.rename.failure', ["//${wikiEscapedTag}//", "//${services.rendering.escape($renameTo, 'xwiki/2.1')}//"]){{/error}} #end #elseif ($do == 'prepareDelete') ## @@ -148,15 +149,15 @@ $xwiki.ssx.use('Main.Tags')## #if ($success == true || $success == 'OK') $response.sendRedirect($doc.getURL('view', "deletedTag=${urlEscapedTag}")) #else - {{error}}$services.localization.render('xe.tag.delete.failure', ["//${tag}//"]){{/error}} + {{error}}$services.localization.render('xe.tag.delete.failure', ["//${wikiEscapedTag}//"]){{/error}} #end #else ## ## View all tags (Tag Cloud) ## #set ($title = 'All Tags') #if ("$!{request.get('deletedTag')}" != '') - {{info}}$services.localization.render('xe.tag.delete.success', ["//${request.get('deletedTag')}//"]){{/info}} + {{info}}$services.localization.render('xe.tag.delete.success', ["//${services.rendering.escape($request.get('deletedTag'), 'xwiki/2.1')}//"]){{/info}} #end {{tagcloud/}}
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-2g5c-228j-p52xghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2022-36100ghsaADVISORY
- github.com/xwiki/xwiki-platform/commit/604868033ebd191cf2d1e94db336f0c4d9096427ghsax_refsource_MISCWEB
- github.com/xwiki/xwiki-platform/security/advisories/GHSA-2g5c-228j-p52xghsax_refsource_CONFIRMWEB
- jira.xwiki.org/browse/XWIKI-19747ghsax_refsource_MISCWEB
News mentions
0No linked articles in our index yet.