Page MenuHomePhabricator

CVE-2026-0671: Multiple stored i18n/message-key XSSes in UploadWizard
Closed, ResolvedPublicSecurity

Description

Summary

The UploadWizard extension is vulnerable to i18n/system-message stored XSS attacks via at least the following system messages (and, from looking at the code, probably more):

  • mwe-upwiz-blacklisted-details-titleblacklist-custom-filename-text
  • mwe-upwiz-too-many-files-text
  • mwe-upwiz-file-too-large-text
  • mwe-upwiz-license-external-invalid
  • mwe-upwiz-other-v2
  • mwe-upwiz-submitting-details
  • mwe-upwiz-published

Prerequisites to reproduce

  • Have a demo wiki with ext:UploadWizard (and, to reproduce vuln [1], ext:TitleBlacklist) loaded.
  • In your demo wiki's LocalSettings.php, ensure $wgEnableUploads is set to true.
  • As an admin (i.e., a user with the editinterface rights, but not the editsitejs right):
    • For each of the message keys above, create the page MediaWiki:<message-key> with the content <script>alert("XSS: <message-key>");</script>.

      (Alternatively, add $wgUseXssLanguage = true; to your demo wiki's LocalSettings.php, & access pages using ?uselang=x-xss.)

Stored system-message XSS via...

[1] ...the popup that appears after clicking the 'view examples' link in a title-blacklist error message
  1. As an admin:
    1. Add the following rule at MediaWiki:Titleblacklist (the important part for these reproduction steps is the errmsg being titleblacklist-custom-filename):
      • .*generic-filename.* <errmsg=titleblacklist-custom-filename>
  2. As an unprivileged/regular user (i.e., someone without the tboverride right):
    1. Navigate to Special:UploadWizard.
    2. Select a file to upload.
    3. On the 'Release rights' step, select any values that allow you to get to the next stage.
    4. Under 'Title', enter "generic-filename".
    5. Click on the "view examples" link in the error message that appears:
      screenshot.png (593×1 px, 104 KB)

Note: The possibility of an XSS vulnerability here jumped out to me when I was looking at UploadWizard's en.json & noticed that the default 'mwe-upwiz-blacklisted-details-titleblacklist-custom-filename-text' message contained an <a> tag, given that - to my knowledge - HTML anchor tags don't work in regular wikitext.

[2] ...the popup that appears when attempting to upload too many files at once
  1. For ease of reproducibility (ie., to avoid having to upload 50 items at once in order to reproduce this vuln), add the following line to your demo wiki's LocalSettings.php:
    • $wgUploadWizardConfig['maxUploads'] = 2;
  2. Navigate to Special:UploadWizard.
  3. Either:
    1. Click on "Select media files to share", & select more than two images; or
    2. Drag-and-drop more than two image files onto the part of the page labelled "Drop files here".
[3] ...the popup that appears when attempting to upload a file that's above the max upload size
  1. For ease of reproducibility (ie., to avoid having to upload a 100MB file in order to reproduce this vuln), add the following line to your demo wiki's LocalSettings.php:
    • $wgMaxUploadSize = 1024 * 1024; [1MB]
  2. Navigate to Special:UploadWizard.
  3. Select/Drag-and-drop a file to upload that's over 1MB in size.
[4] ...the popup that appears when attempting to import an image from Flickr that has an incompatible license
  1. Add the following lines (adapted from https://www.mediawiki.org/wiki/Extension:UploadWizard#Enabling_Flickr_uploads) to your demo wiki's LocalSettings.php, in order to allow the UploadWizard Flickr integration to work:
  2. Navigate to Special:UploadWizard.
  3. Select 'Share images from Flickr'.
  4. Paste in the URL of a photo on Flickr that has a license marked as 'invalid' in this array (e.g., https://www.flickr.com/photos/zeeyolqpictures/45925416992).
  5. Click the 'Get from Flickr' button.
[5] ...the 'Any other information you want to include' field-label
  1. Navigate to Special:UploadWizard
  2. Select a file to upload.
  3. On the 'Release rights' step, select any values that allow you to get to the next stage, and click 'Next'. (The XSS occurs immediately after reaching the next stage - 'Describe'.)
[6] [7] ...the status-text that indicates the status of an upload in progress
  1. Follow the steps in [5] above.
  2. On the 'Describe' step, enter any value in the 'Description' & 'Date' fields.
  3. Click the 'Publish files' button. (The two XSSes here occur in quick succession, presumably depending on how long it takes the wiki to publish the file(s) after the information about them has been submitted.)

What happens?

In each case, you get XSSed: a JavaScript alertbox appears, indicating that - through overriding these system messages - the admin account with editinterface rights (but without editsitejs rights) has been able to inject JavaScript to be executed by the end-user's browser.

[1][2][3][4][5][6][7]
screenshot.png (582×928 px, 77 KB)
screenshot.png (988×1 px, 141 KB)
screenshot.png (962×1 px, 137 KB)
screenshot.png (958×1 px, 171 KB)
screenshot.png (986×1 px, 229 KB)
screenshot.png (1×1 px, 175 KB)
screenshot.png (632×1 px, 77 KB)

What should have happened?

No XSSes (i.e. the alertboxes shouldn't've appeared).

Software versions

mw/core @ ce36ccce81
mw/exts/UploadWizard @ 2b5c27014c
mw/exts/TitleBlacklist @ 7efae546ae

Other information/Notes

Related Objects

Event Timeline

There are a very large number of changes, so older changes are hidden. Show Older Changes
A_smart_kitten added a subscriber: Soda.

Also ccing @Soda here in case you're interested in this, as it looks like you've been working on UploadWizard a bit recently (though to be clear, I don't mean to imply any obligation on you to fix this bug!)


This patch should (imo) fix it.

Thanks for the patch @Soda! Mini review:

Subject: [PATCH] Parse titleblacklist message as wikitext before showing in
 error dialog

Nitpick: the commit-message subject for security fixes should be prefixed with SECURITY: IIUC.

-	"mwe-upwiz-blacklisted-details-titleblacklist-custom-filename-text": "<p><b>Examples of good file names:</b></p><ul><li>Nodnol skyline from Nodnol City Hall - Aug 2022</li><li>1875 Meeting of Settlers at Falconer Bay, New Nodland</li><li>Pseudohedron with no vertex visible from center</li></ul><br><p><b>Examples of bad file names:</b></p><ul><li>Image01</li><li>Joe</li><li>DSC00001</li><li>Foo.svg.png</li><li>30996951316264l</li><li>PSEUDOHEDRON WITH NO VERTEX VISIBLE FROM CENTER</li></ul><p><a href='https://commons.wikimedia.org/wiki/MediaWiki:Titleblacklist-custom-filename' target='_blank'>Learn more</a></p>",
+	"mwe-upwiz-blacklisted-details-titleblacklist-custom-filename-text": "<p><b>Examples of good file names:</b></p><ul><li>Nodnol skyline from Nodnol City Hall - Aug 2022</li><li>1875 Meeting of Settlers at Falconer Bay, New Nodland</li><li>Pseudohedron with no vertex visible from center</li></ul><br><p><b>Examples of bad file names:</b></p><ul><li>Image01</li><li>Joe</li><li>DSC00001</li><li>Foo.svg.png</li><li>30996951316264l</li><li>PSEUDOHEDRON WITH NO VERTEX VISIBLE FROM CENTER</li></ul><p>[https://commons.wikimedia.org/wiki/MediaWiki:Titleblacklist-custom-filename Learn more]</p>",

Following the change from .text() to .parse() in uw.TitleDetailsWidget.js, the <br> in this system message doesn't seem to be parsed:

screenshot.png (496×624 px, 61 KB)

Functionality-wise, this patch also loses the benefit of the 'Learn more' link opening in a new tab (given that it was the <a> tag's target='_blank' attribute that previously caused this behaviour). I'm not immediately sure whether there's another way to achieve this, though.

(There's also the general advice to avoid touching i18n files in patches for security-deployment, though I'll leave that for the secteam to comment on whether it'd be an issue here or not [given they'd probably be the folks deploying it].)


It's probably also worth noting that (IIUC) the translations for mwe-upwiz-blacklisted-details-titleblacklist-custom-filename-text from translatewiki would break slightly if/when this patch gets deployed to Wikimedia production (see screenshot); given that the <a>-tags they contain would no longer be parsed. (Actually, maybe that's also a reason in favour of temporarily hard-coding the modified system message?)

screenshot.png (332×620 px, 31 KB)

Anyhow -- on the matter of the XSS, I tested the patch locally; and (at a first glance), with it applied, I no longer seem to be able to reproduce it using the steps in the task description :)

screenshot.png (400×804 px, 59 KB)

Also, FYI all, after searching through the UploadWizard code some more, I've found a couple more i18n-XSSes within the extension (with slightly different reproduction steps to this one) [0]. Please could someone let me know if they'd prefer me to combine them into this security task, or if it'd be better to open up separate security tasks for them? I'm happy to do either.

[0] They're similar but different -- in that they each have different reproduction steps, but they each relate to system messages that get passed into UploadWizard's mw.errorDialog function.

Please could someone let me know if they'd prefer me to combine them into this security task, or if it'd be better to open up separate security tasks for them?
...
[0] They're similar but different -- in that they each have different reproduction steps, but they each relate to system messages that get passed into UploadWizard's mw.errorDialog function.

If it's not too many, I'd recommend adding them to the patch here since they're for the same extension and roughly the same issue (system message XSSes).

Ack; will add them to the task description when I get a chance (probably tomorrow). ty!

Following the change from .text() to .parse() in uw.TitleDetailsWidget.js, the <br> in this system message doesn't seem to be parsed:

This might be partially-related to this current, still-undisclosed security issue: T251032. Basically, parse() doesn't actually parse wikitext or html in the sense of running it through parsoid or MediaWiki's parser. It parses MediaWiki messages via mw.format and then does some last-minute, basic html-escaping, the same as escaped().

Following the change from .text() to .parse() in uw.TitleDetailsWidget.js, the <br> in this system message doesn't seem to be parsed:

This might be partially-related to this current, still-undisclosed security issue: T251032. Basically, parse() doesn't actually parse wikitext or html in the sense of running it through parsoid or MediaWiki's parser. It parses MediaWiki messages via mw.format and then does some last-minute, basic html-escaping, the same as escaped().

That not-actually-a-parser is replaced by a real parser (but quite limited) when the 'mediawiki.jqueryMsg' module is loaded, here: https://gerrit.wikimedia.org/g/mediawiki/core/+/050bc8d455e70c3306a58fd52e4710124aea8c6f/resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js#1495

I think its parser doesn't support self-closing HTML tags. I'm not sure if that's an intended limitation or a bug, it's not mentioned either way at https://www.mediawiki.org/wiki/Manual:Messages_API#Feature_support_in_JavaScript.

Since this message doesn't take any parameters, but it is otherwise quite complex, it would probably be better to parse it server-side using the normal wikitext parser. The result can be included as part of the ResourceLoader module and displayed by the client-side code. I think this could be done in a security patch, but if it seems like too big of a change, it could also happen in a non-security patch later. Here's an example from another extension:

A_smart_kitten renamed this task from Stored i18n/message-key XSS in UploadWizard via the 'view examples' popup in a title-blacklist error message to Multiple stored i18n/message-key XSSes in UploadWizard.Oct 16 2025, 7:33 PM
A_smart_kitten updated the task description. (Show Details)

Ack; will add them to the task description when I get a chance (probably tomorrow). ty!

Done - apologies, in the process of typing them up, I ended up finding even more that I didn't know about yesterday. I tried as best I could to not make the task description overly long, while still conveying enough reproduction information for each of them. Let me know if it'd be better to split any of them out into their own task(s); I'd be happy to do so.

Following the change from .text() to .parse() in uw.TitleDetailsWidget.js, the <br> in this system message doesn't seem to be parsed:

This might be partially-related to this current, still-undisclosed security issue: T251032. Basically, parse() doesn't actually parse wikitext or html in the sense of running it through parsoid or MediaWiki's parser. It parses MediaWiki messages via mw.format and then does some last-minute, basic html-escaping, the same as escaped().

That not-actually-a-parser is replaced by a real parser (but quite limited) when the 'mediawiki.jqueryMsg' module is loaded, here: https://gerrit.wikimedia.org/g/mediawiki/core/+/050bc8d455e70c3306a58fd52e4710124aea8c6f/resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js#1495

I think its parser doesn't support self-closing HTML tags. I'm not sure if that's an intended limitation or a bug, it's not mentioned either way at https://www.mediawiki.org/wiki/Manual:Messages_API#Feature_support_in_JavaScript.

FWIW, when attempting to mentally work my way through the relevant code here yesterday, my thoughts were that:

  • the parserDefaults variable in jqueryMsg seems to get its list of allowed HTML elements from the server,
  • which seems to then generate its list of allowed 'single' html elements by finding the elements in Sanitizer::getRecognizedTagData()'s htmlsingle array that aren't present in its htmlsingleonly array;
  • and <br> _is_ in the htmlsingleonly array; so therefore, I guess it doesn't end up in parserDefaults' list of allowed HTML elements.

git blame on the code in Resources.php takes me back to https://gerrit.wikimedia.org/r/85153; the commit message for which suggests that the limitation is at least known about (and is intentionally coded for on the server-side).


(Also, to be clear @sbassett I know it's not your fault personally & I want to be clear that I don't mean anything ill against you, or anything like that. But I have to be honest: one of my first reactions to seeing a still-open security task that starts with T25 was something like... :( *sadface*. Again, I know it's not your own personal fault here, but I really wish more WMF resources were put into fixing security issues & fixing them quickly.)

(Also, to be clear @sbassett I know it's not your fault personally & I want to be clear that I don't mean anything ill against you, or anything like that. But I have to be honest: one of my first reactions to seeing a still-open security task that starts with T25 was something like... :( *sadface*. Again, I know it's not your own personal fault here, but I really wish more WMF resources were put into fixing security issues & fixing them quickly.)

No offense taken. I don't want to derail this task too much, but I'll state that the Security-Team (now a part of Product Safety and Integrity) is tasked with many responsibilities, including reviewing anything that comes into Phab as a "security issue". We've been able to mostly stay on top of these tasks by at least triaging them during our weekly clinics, and trying to get more serious issues quickly resolved. But sometimes that doesn't happen for a number of reasons and is likely why we still have quite the security issue backlog. While many of those 1,069 tasks are probably low-risk and/or irrelevant at this point, a good portion are likely higher risk and still a concern. I would encourage you or anyone in the Community who finds this concerning to mention this during any engagement with WMF staff and leadership, be those feedback sessions, Community requests, wish list items, etc.

cc @SomeRandomDeveloper in case you're interested as you've been doing things around i18n-XSSes recently :)

Suggested patch that should cover all XSSs mentioned in the task description:


The approach I've taken here is to always escape the error/status messages in mw.errorDialog as well as setStatus in mw.UploadWizardDetails.js, unless they're objects (AFAIK this is also done that way in mw.message). This way, it's possible to pass jQuery objects and HTML strings (using Object.assign) to the methods, but it isn't as easy as before to accidentally create an i18n XSS.
As a result of this, I've changed a bunch of mw.message() invocations to pass the messages to mw.errorDialog using the text output mode instead of escaping them.

Current issues:

  • The link in mwe-upwiz-blacklisted-details-titleblacklist-custom-filename-text doesn't open in a new tab anymore (I guess we could construct the link using jQuery and insert it as a parameter if that's necessary?)
  • <br><br> in mwe-upwiz-license-external-invalid is not parsed
  • <br> in mwe-upwiz-blacklisted-details-titleblacklist-custom-filename-text is not parsed

I haven't looked into the code yet that is causing <br> to not be parsed, but if nobody else has written a patch for that yet or is considering writing a patch, I could look into that as well.

I'm not familiar enough with the UploadWizard extension to feel comfortable giving a +1 here; but after applying the patch locally, I can no longer repro the XSSes listed in the description.
A few extra notes on the patch (F69894453), in addition to what you've already noted:

  • IIUC, Bug: T407157 should be added as a footer in the commit message.
  • The advice to avoid touching i18n files in patches for security-deployment also applies AFAIK, but tbh I'll let the Security-Team comment on whether that'd be a problem in terms of deployment.
  • As in T407157#11276478, the translations for [...]-titleblacklist-custom-filename-text from translatewiki would break slightly if/when the patch gets deployed to WMF prod, due to containing <a> tags that would no longer be parsed. For the patch that gets deployed, I wonder if that's a reason in favour of temporarily hard-coding the (updated) English version of that message?

The link in mwe-upwiz-blacklisted-details-titleblacklist-custom-filename-text doesn't open in a new tab anymore

Re this, one worry is that - if people click the link, and then get taken to a different page in their current tab (which they're using UploadWizard in) - they might worry that their progress in the upload wizard has gone away, and that they'll have to go through the process again from the start. I'll let someone else decide whether this'd be an issue for the patch here, though.

  • IIUC, Bug: T407157 should be added as a footer in the commit message.
  • The advice to avoid touching i18n files in patches for security-deployment also applies AFAIK, but tbh I'll let the Security-Team comment on whether that'd be a problem in terms of deployment.
  • As in T407157#11276478, the translations for [...]-titleblacklist-custom-filename-text from translatewiki would break slightly if/when the patch gets deployed to WMF prod, due to containing <a> tags that would no longer be parsed. For the patch that gets deployed, I wonder if that's a reason in favour of temporarily hard-coding the (updated) English version of that message?

Updated patch which specifies the bug in the commit message (I keep forgetting this for some reason) and hardcodes the affected message in JS while not modifying any i18n files:


The line with the hardcoded message is 627 characters long, but I assume that doesn't matter since this will never go through gerrit and CI.

The link in mwe-upwiz-blacklisted-details-titleblacklist-custom-filename-text doesn't open in a new tab anymore

Re this, one worry is that - if people click the link, and then get taken to a different page in their current tab (which they're using UploadWizard in) - they might worry that their progress in the upload wizard has gone away, and that they'll have to go through the process again from the start.

Good point. I just tried this and fortunately, there is a prompt that prevents this from happening:

image.png (176×415 px, 20 KB)

I think if we still want to fix this, we could just hardcode the HTML link for now since we hardcoded the rest of the message anyway. For the gerrit patch, we'd need to extract "Learn more" into a new message, build a link with this text using jQuery, and then pass it to mwe-upwiz-blacklisted-details-titleblacklist-custom-filename-text as a parameter. This might require additional logic since this code handles multiple messages at once, but we only want to pass the parameter to this specific one.
However, this way it wouldn't be possible to configure the target of the link anymore (it links to commons by default). We could extract that to another message, but that would be even more complicated because now we'd have to sanitize this message before using it as the href. This was done using server-side parsing in T400525 (and using an ugly JS hack for REL1_39), but I feel like that's a lot of effort simply for having a link open in a new tab.

(I'm getting a bit off-topic here, but issues like this are why I think that we either need to improve jqueryMsg by e.g. adding support for <br> and links that open in a new tab, properly documenting how to use raw parameters, etc. so it's easier to avoid both XSSs and complicated logic, or server-side-parsed messages should be easier to use. The current state of the APIs available in JS, which require complicated workarounds for simple things like having a link open in a new tab without having to add two separate messages, is not really great.)

For the gerrit patch, we'd need to extract "Learn more" into a new message, build a link with this text using jQuery, and then pass it to mwe-upwiz-blacklisted-details-titleblacklist-custom-filename-text as a parameter.

I just realized that in theory, we could also go through the nodes of the parsed DOM returned by jqueryMsg and set the target of each link to _blank. However, that's a worse solution IMO.

The link in mwe-upwiz-blacklisted-details-titleblacklist-custom-filename-text doesn't open in a new tab anymore

Re this, one worry is that - if people click the link, and then get taken to a different page in their current tab (which they're using UploadWizard in) - they might worry that their progress in the upload wizard has gone away, and that they'll have to go through the process again from the start.

Good point. I just tried this and fortunately, there is a prompt that prevents this from happening:

image.png (176×415 px, 20 KB)

Unfortunately, I don't know if that's supported/respected by all browsers :/
[edit: changed link]

I've considered multiple solutions here, such as using multiple messages and building the link using jQuery, or creating the link/message on the server, but the simplest, albeit not the cleanest, solution seems to be to add the target="_blank" attribute to all links in the parsed message using jQuery. I didn't add a check for the message key as IMO it makes sense to do this for any links displayed in the modal.
Updated patch:

I've started working on a core patch to add support for self-closing tags like <br> to jqueryMsg (I've got it working, but I still need to properly test it and do some cleaning up). I assume it's fine if this goes through the normal gerrit review process and gets a separate public task, since it's not specifically related to this vulnerability?

I've started working on a core patch to add support for self-closing tags like <br> to jqueryMsg (I've got it working, but I still need to properly test it and do some cleaning up). I assume it's fine if this goes through the normal gerrit review process and gets a separate public task, since it's not specifically related to this vulnerability?

Not a member of the Security-Team but I would personally think so. (Although FWIW, if you're planning to rely on that proposed core patch for the UW security patch, it'd presumably need to be backported to at least REL1_43; but I don't know whether feature-adding patches such as that are typically backported.)

if you're planning to rely on that proposed core patch for the UW security patch, it'd presumably need to be backported to at least REL1_43; but I don't know whether feature-adding patches such as that are typically backported.

Ideally I would prefer backporting this if possible, since it's a rather small change code-wise and it's not a user-facing feature (it mostly gives developers more options). The alternative would be using server-side parsing in UW, but that's not as easy as in the WikiLove patch because ext.uploadWizard uses scripts and migrating to packageFiles doesn't seem feasible for a security patch. Using virtual files with scripts also seems to be possible since MW 1.41, but as far as I can see it would require a more hacky solution on the JS-side. In the end, we also still have to fix the link so it opens in a new tab, which afaik isn't possible with the PHP parser either, so we'd either have to construct the link using Html::element and two separate messages, or re-parse the HTML in JS to modify it, which is also not optimal.
Ideally, I'd also like to hear the maintainer's opinion on this (assuming that the extension has active maintainers) to figure out what solution makes more sense in the context of the codebase.

Fixed version of the patch in T407157#11356911 to use .find instead of .children so all elements are selected:

Fixed version of the patch in T407157#11356911 to use .find instead of .children so all elements are selected:

Patch looks reasonable to me. We can try to get this deployed during today's window.

Fixed version of the patch in T407157#11356911 to use .find instead of .children so all elements are selected:

Patch looks reasonable to me. We can try to get this deployed during today's window.

The <br> tags in three messages are not parsed by jqueryMsg currently; this patch depends on https://gerrit.wikimedia.org/r/c/mediawiki/core/+/1203448

Ideally, I'd also like to hear the maintainer's opinion on this (assuming that the extension has active maintainers) to figure out what solution makes more sense in the context of the codebase.

For the record, whether or not UploadWizard has an active maintainer is unfortunately a thing in itself (T404286: Clarify the status of Structured Content / Structured Data team, T401435#11280987). It was previously the Structured Data team, but then that seems to no longer be the case now that the SD team seems to no longer exist.

The <br> tags in three messages are not parsed by jqueryMsg currently; this patch depends on https://gerrit.wikimedia.org/r/c/mediawiki/core/+/1203448

With https://gerrit.wikimedia.org/r/1203448 now merged, it should ride this week's train, and then we can deploy the aforementioned security patch this Thursday, 2025-11-20.

Fixed version of the patch in T407157#11356911 to use .find instead of .children so all elements are selected:

Deployed

sbassett changed the task status from Open to In Progress.Nov 20 2025, 10:31 PM
sbassett assigned this task to SomeRandomDeveloper.
sbassett triaged this task as Low priority.
sbassett removed a project: Patch-For-Review.
sbassett moved this task from Security Patch To Deploy to Watching on the Security-Team board.
sbassett changed Author Affiliation from N/A to Wikimedia Communities.
sbassett changed Risk Rating from N/A to Low.

I'll look into creating a separate patch for 1.44, 1.43 and 1.39 soon. @Catrope do you think we could backport https://gerrit.wikimedia.org/r/1203448 to 1.45, so we can at least use the easier UW patch for that version?

Ah damn, @SomeRandomDeveloper I closed the subtask forgetting about your request in T407157#11358305 to backport the patch. Apologies & feel free to reopen it!

Ah damn, @SomeRandomDeveloper I closed the subtask forgetting about your request in T407157#11358305 to backport the patch. Apologies & feel free to reopen it!

No worries, it wasn't a goal of the subtask to backport the change, so I would consider it resolved as well. The backport would only be useful for this task.

The jqueryMsg patch for T295568 was backported to REL1_44 and REL1_43, so we can use the same fix for all branches.

Gerrit patch for master, REL1_45 and REL1_44 (without the hardcoded message):


Gerrit patch for REL1_43 (rebased):

1.39 is going to be EOL this month, so I'm not sure whether it's worth creating a separate patch for REL1_39, assuming the supplemental won't happen before the EOL date...

Change #1224146 had a related patch set uploaded (by Mmartorana; author: SomeRandomDeveloper):

[mediawiki/extensions/UploadWizard@master] SECURITY: Fix several stored i18n XSS vulnerabilities

https://gerrit.wikimedia.org/r/1224146

Change #1224146 abandoned by Mmartorana:

[mediawiki/extensions/UploadWizard@master] SECURITY: Fix several stored i18n XSS vulnerabilities

https://gerrit.wikimedia.org/r/1224146

Change #1224146 restored by Mmartorana:

[mediawiki/extensions/UploadWizard@master] SECURITY: Fix several stored i18n XSS vulnerabilities

https://gerrit.wikimedia.org/r/1224146

Change #1224711 had a related patch set uploaded (by Mmartorana; author: SomeRandomDeveloper):

[mediawiki/extensions/UploadWizard@REL1_43] SECURITY: Fix several stored i18n XSS vulnerabilities

https://gerrit.wikimedia.org/r/1224711

Change #1224711 merged by jenkins-bot:

[mediawiki/extensions/UploadWizard@REL1_43] SECURITY: Fix several stored i18n XSS vulnerabilities

https://gerrit.wikimedia.org/r/1224711

Change #1224146 merged by jenkins-bot:

[mediawiki/extensions/UploadWizard@master] SECURITY: Fix several stored i18n XSS vulnerabilities

https://gerrit.wikimedia.org/r/1224146

Change #1224829 had a related patch set uploaded (by SomeRandomDeveloper; author: SomeRandomDeveloper):

[mediawiki/extensions/UploadWizard@REL1_45] SECURITY: Fix several stored i18n XSS vulnerabilities

https://gerrit.wikimedia.org/r/1224829

Change #1224830 had a related patch set uploaded (by SomeRandomDeveloper; author: SomeRandomDeveloper):

[mediawiki/extensions/UploadWizard@REL1_44] SECURITY: Fix several stored i18n XSS vulnerabilities

https://gerrit.wikimedia.org/r/1224830

Change #1224830 merged by jenkins-bot:

[mediawiki/extensions/UploadWizard@REL1_44] SECURITY: Fix several stored i18n XSS vulnerabilities

https://gerrit.wikimedia.org/r/1224830

Change #1224829 merged by jenkins-bot:

[mediawiki/extensions/UploadWizard@REL1_45] SECURITY: Fix several stored i18n XSS vulnerabilities

https://gerrit.wikimedia.org/r/1224829

mmartorana renamed this task from Multiple stored i18n/message-key XSSes in UploadWizard to CVE-2026-0671: Multiple stored i18n/message-key XSSes in UploadWizard.Jan 9 2026, 2:47 PM
mmartorana closed this task as Resolved.
mmartorana changed the visibility from "Custom Policy" to "Public (No Login Required)".Jan 9 2026, 2:49 PM
mmartorana changed the edit policy from "Custom Policy" to "All Users".