Page MenuHomePhabricator

Application Security Review Request: Wikipedia 25 microsite
Closed, ResolvedPublic

Description

Project Information

TODO

Description of the tool/project:
The 25 Years of Wikipedia microsite is a static HTML/CSS/JS single page site created to celebrate Wikipedia's 25th birthday. It will involve "scrolly-telling" effects designed to take readers on a history of Wikipedia's 25 years of existence.

Description of how the tool will be used at WMF:
The 25 Years of Wikipedia microsite will be part of a broader set of celebrations by the Wikimedia Foundation scheduled for Wikipedia's 25th birthday in January 2026. It will be hosted at **https://wikipedia25.org**

Dependencies
TODO

Has this project been reviewed before?
No

Working test environment
https://wikipedia25-years-of-wikipedia.toolforge.org/

Post-deployment
There is expected to be minimal maintenance on this site post-deployment and it's value will be primarily historical, similar to https://15.wikipedia.org/

Event Timeline

Restricted Application added a subscriber: Aklapper. · View Herald Transcript

Hello @ATitkov and @Jdrewniak -

We're going to expedite this review for the first week or so of January 2026, but we will need some key items and responses from your team before we can start the review:

  1. What front-end JavaScript will be used for the microsite? We will definitely want to review that prior to any deployment.
  2. Will any other code be used for the microsite? Right now, we're assuming that everything else will be static content (html, css, images, video, etc.)
  3. What will the hosting architecture look like? What hardware will wikipedia25.org specifically point to? Wikimedia production? Something else? Is there a plan to host any resources on the toolforge.org test site for the production site? That likely isn't advisable given various security and performance issues around toolforge.org.
  4. What privacy policy and ToU will this site use? Has WMF Legal reviewed these?

Thanks.

I can answer 3. - Wikimedia production - Kubernetes cluster "wikikube" in the existing "miscweb" service. Where other micro sites live nowadays like https://15.wikipedia.org/ or https://research.wikimedia.org/ among others.

The expectation from SRE side is that all resources are copied over there so nothing cross-loads from toolforge.org - We also expect the deployment repository to stay in GitLab but move out of the repos/toolforge structure.

Hi @ATitkov and @Jdrewniak ,

The privacy team also has a few additional questions.

  1. Are you collecting and/or sharing personal data (with volunteers, grantees, or other external third party or the general public)? Please specify what personal data is being collected and/or shared.
  2. Who has access to this data? (Example: WMF employees - event organizers, tool admins)

Thank you!

sbassett moved this task from Upcoming Quarter Planning Queue to In Progress on the secscrum board.
sbassett added a project: Security-Team.
sbassett moved this task from Incoming to In Progress on the Security-Team board.
sbassett added a project: SecTeam-Processed.

Sorry for the delayed rely...


@sbassett

What front-end JavaScript will be used for the microsite? We will definitely want to review that prior to any deployment.

The front-end is utilizing vite, vue, typescript, accompanied by vue-i18n and vue-router.

For design purposes it is utilizing tailwind, @wikimedia/codex, a lot of fonts from @fontsource, and motion-v for animations.

For sharing functionality html-to-image is used in order to "take a screenshot" of the part of the page that the user is viewing at the point of triggering the share functionality.

It has multiple utilities created to control the animations in regards to the scrolling.

It also contains a couple of media files - ogg for audio interviews and webm for video backgrounds.

Will any other code be used for the microsite? Right now, we're assuming that everything else will be static content (html, css, images, video, etc.)

No other code will be used. It's only static frontend, without any backend or external services.

What privacy policy and ToU will this site use? Has WMF Legal reviewed these?

@Jdrewniak @cmadeo Can you answer this question?


@aranyap

Are you collecting and/or sharing personal data (with volunteers, grantees, or other external third party or the general public)? Please specify what personal data is being collected and/or shared.

We are not sharing any data IIUC. @cmadeo please correct me here if I am wrong.

But we will collect analytics in the regards to the usage of the page. The collected data will be about how many times, which buttons were clicked, etc. And IIUC this should not include personal data of the visitors.

If needed I can provide detailed info about how the analytics events will look.

Who has access to this data? (Example: WMF employees - event organizers, tool admins)

@Jdrewniak @cmadeo Can you answer this question?

Thanks for the follow-up @ATitkov. @Catrope has been assigned this review and plans to complete it by this week or very early next week. From a quick application security review perspective, it sounds like we'd mainly want to be concerned with:

  1. The various production dependencies within package.json. I ran snyk and osv-scanner against these dependecies - they found a medium severity issue for the dev dependency esbuild@<=0.24.2. This is a low-risk issue in this particular scenario since we shouldn't be running the vite dev server in any external capacity. And it's probably not easily addressed unless those get version-bumped (vitest 0.0.1 - 0.0.12 || 0.0.29 - 0.0.122 || 0.3.3 - 2.2.0-beta.2 => vite-node <=2.2.0-beta.2 => vite 0.11.0 - 6.1.6) by getting to vitest@4.0.16 which introduces breaking changes, apparently.
  2. Various Vue components and TypeScript files under src (e.g. components, composables, i18n, navigation, sections and views)
  3. Ensuring that we're using the correct privacy policy (per Legal) if we're importing a bunch of external resource files (fonts, media, etc.)
LSobanski set Security to Software security bug.Jan 8 2026, 11:18 AM
LSobanski added a project: Security.
LSobanski changed the visibility from "Public (No Login Required)" to "Custom Policy".
LSobanski changed the subtype of this task from "Task" to "Security Issue".

@Catrope just to to let you know the planned official rollout of this website is Jan 15.

Catrope closed this task as Resolved.EditedJan 9 2026, 5:59 PM
Catrope changed the subtype of this task from "Security Issue" to "Task".
Catrope changed the visibility from "Custom Policy" to "Public (No Login Required)".
Catrope moved this task from In Progress to Our Part Is Done on the secscrum board.
  1. The various production dependencies within package.json. I ran snyk and osv-scanner against these dependecies - they found a medium severity issue for the dev dependency esbuild@<=0.24.2. This is a low-risk issue in this particular scenario since we shouldn't be running the vite dev server in any external capacity. And it's probably not easily addressed unless those get version-bumped (vitest 0.0.1 - 0.0.12 || 0.0.29 - 0.0.122 || 0.3.3 - 2.2.0-beta.2 => vite-node <=2.2.0-beta.2 => vite 0.11.0 - 6.1.6) by getting to vitest@4.0.16 which introduces breaking changes, apparently.

I looked at this, and I'm not concerned. esbuild is only used during the build stage, not at runtime. And the specific issue with esbuild only affects esbuild's dev server, which this repo doesn't use, not even in development or during the build stage.

  1. Various Vue components and TypeScript files under src (e.g. components, composables, i18n, navigation, sections and views)

I reviewed all of these, mainly for:

  • Uses of v-html. There are a lot of these, but most of them are just i18n messages, which come from a static JSON file. For some of them, it was hard to track down where the data came from (mainly the ones in Modal.vue, which takes data from a global state object that a lot of other files modify), but I analyzed them all and I'm convinced that they're all safe.
  • Other things semgrep flagged. Most of these were clearly false positives, there were only a few that warranted a closer look (like setting img.src), but these look fine too.
  • Use of external libraries. A number of libraries are inlined into the JS that is sent to the client, but they all look like reputable projects. For the non-Vue/Wikimedia ones, I also confirmed that they either don't handle user-controllable data or handle it safely.
    • vue
    • vue-i18n
    • vue-router
    • @wikimedia/codex
    • @vueuse/core
    • @unhead/vue
    • html-to-image
    • motion-v
  1. Ensuring that we're using the correct privacy policy (per Legal) if we're importing a bunch of external resource files (fonts, media, etc.)

All of these resources are self-hosted on the same domain, including the fonts from the @fontsource/* packages, so there are no privacy policy implications here. I ran the demo on Toolforge and confirmed that it doesn't make any requests to other domains. I also grepped the build result for http to find any URLs it might refer to, and I didn't find anything unexpected:

  • There are a lot of links to various domains we control, like *.wikipedia.org, wikimediafoundation.org and diff.wikimedia.org
  • There are a few links to domains that we don't control but are well-known news sites
  • In the "share" feature, clicking "Facebook" or "Bluesky" opens a new tab on facebook.com or bluesky.com. This new tab doesn't have access to the microsite's tab through window.opener, which is good. It does receive a Referer header with the domain name the user came from (wikipedia25.org), but not the full URL. This isn't really any different from clicking a link, so I think this is probably fine.

All in all, this is low risk.

The privacy team has reviewed this request and is concluding this to be a low risk as long as analytics collection is limited to aggregated metrics (e.g., page views and interaction events) and does not include personal identifiers.