launch-editor: `fs.existsSync()` の存在チェックが、Windows環境において回避可能
### 概要
`launch-editor` は、エディタコマンドにパスを渡す前に、`fs.existsSync(fileName)` でファイルの存在を確認していました。Windowsでは、攻撃者が巧妙に作成したパス(末尾が `\\..:line:column` のパス)を使用することで、このチェックを回避できます。これにより、攻撃者が悪意のあるファイル名を指定する必要がなくなります。
[GHSA-698v-4r3x-3vcv](https://github.com/vitejs/launch-editor/security/advisories/GHSA-698v-4r3x-3vcv) で説明されている `%` エスケープの問題と組み合わせることで、この回避策は、攻撃者がファイル引数を制御している場合に、OSコマンドインジェクションにつながる可能性があります。
### 影響
影響を受けるのは、Windows上で動作するアプリケーションのみです。
### 詳細
以前の注意喚起では、`fs.existsSync()` が攻撃者によって制御されたファイル名が存在することを前提としていました。この注意喚起は、その前提を回避する方法について説明しています。
`\\..:1:1` で終わる巧妙に作成された値は、`launch-editor-middleware`、`launch-editor`、および Windows によって異なる解釈されます。
1. `launch-editor-middleware` は、最終的なパスのコンポーネントが `..:1:1` であるため、`path.resolve()` を呼び出しますが、これは親ディレクトリのコンポーネントとして扱われません。
2. `launch-editor` は、`:1:1` を行と列のサフィックスとして扱い、削除します。その結果、パスの末尾が `\\..` になります。
3. Windows では、`fs.existsSync()` は、攻撃者によって制御される先行コンポーネントが存在しなくても、結果として得られたパスを既存の親ディレクトリとして受け入れます。
4. 存在チェックが通過するため、巧妙に作成されたファイル名が Windows のシェルコマンドに到達します。
影響を受けるパッケージ:
- npm (JavaScript) launch-editor: 影響を受けるバージョンは 2.14.1 以下、修正は 2.14.2 で行われました。
- npm (JavaScript) vite: 影響を受けるバージョンは 8.3.0 以上 8.3.2 以下、修正は 8.3.3 で行われました。
- npm (JavaScript) vite: 影響を受けるバージョンは 8.2.0 以上 8.2.3 以下、修正は 8.2.4 で行われました。
- npm (JavaScript) vite: 影響を受けるバージョンは 8.0.0 以上 8.1.5 以下、修正は 8.1.6 で行われました。
- npm (JavaScript) vite: 影響を受けるバージョンは 7.0.0 以上 7.3.6 以下、修正は 7.3.7 で行われました。
- npm (JavaScript) vite: 影響を受けるバージョンは 6.4.3 以下、修正は 6.4.4 で行われました。
- npm (JavaScript) vite-plus: 影響を受けるバージョンは 1.0.0 以下、修正は 1.1.0 で行われました。