Skip to content

./x.js?foo=/../y.js is resolved as ./y.js instead of ./x.js #19406

@hi-ogawa

Description

@hi-ogawa

Describe the bug

For the following code, Vite resolves import differently from NodeJs.

import repro from "./x.js?foo=/../y.js"

This appears to be because Vite's fs resolution normalizes id via path.resolve without stripping off ?, such as:

const fsPath = path.resolve(basedir, id)

> path.resolve('/x.js?foo=/../y.js')
'/y.js'
> path.resolve('/x.js/../y.js')
'/y.js'
> path.resolve('/x.js?foo=bar')
'/x.js?foo=bar'

Additional note: Going up parent directories with this trick only cheats resolution and the file content is still protected by the same server.fs mechanism, so this is not likely a security issue.

Reproduction

https://stackblitz.com/github/hi-ogawa/reproductions/tree/main/vite-vitest-GHSA-jgmc-vvcc-xjmp?file=src%2Fmain.js

Steps to reproduce

  • Open stackblitz and browser shows [y.js]
  • Run node src/main.js and it shows [x.js]
 node src/main.js
{ repro: '[x.js]' }

System Info

System:
    OS: Linux 5.0 undefined
    CPU: (8) x64 Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
    Memory: 0 Bytes / 0 Bytes
    Shell: 1.0 - /bin/jsh
  Binaries:
    Node: 18.20.3 - /usr/local/bin/node
    Yarn: 1.22.19 - /usr/local/bin/yarn
    npm: 10.2.3 - /usr/local/bin/npm
    pnpm: 8.15.6 - /usr/local/bin/pnpm
  npmPackages:
    vite: ^6.1.0 => 6.1.0

Used Package Manager

npm

Logs

No response

Validations

Metadata

Metadata

Assignees

No one assigned

    Labels

    p2-edge-caseBug, but has workaround or limited in scope (priority)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions