仮想環境のbashおよびfishの起動スクリプトは、パスに埋め込まれたコマンドを実行します。
### 影響
生成される`activate`(bash/zsh)および`activate.fish`スクリプトは、`shlex.quote`でクォートされた値を、さらに別のクォートを行う場所に挿入します。この余分なクォートにより、クォートされた実行が早期に終了し、値の一部がシェルコードとして解析されるため、シェルメタ文字を含むパスが、ユーザーが起動スクリプトを読み込む際にコマンドを実行する可能性があります。
`activate`は、仮想環境自身のパスを通じて影響を受けます。これは、環境が移動されたことを報告するブランチにおいて発生します。
```sh
echo "仮想環境ディレクトリ __VIRTUAL_ENV__ は存在しません!" >&2
```
`x'$(id)'y`という宛先の場合、`shlex.quote`は`'x'"'"'$(id)'"'"'y'`を出力します。内側の`"`は、外側の二重引用符を閉じ、`$(id)`はクォートされずに残ります。バッククォートや`;`などのペイロードも同様の結果をもたらします。このブランチは、記録されたパスが存在しない場合に実行されます。これは、仮想環境が別のマシンにコピーまたは配布される場合の通常の状態です。
`activate.fish`は、インタプリタのTcl/Tkライブラリパスを通じて影響を受けます。
```fish
set -gx TCL_LIBRARY '__TCL_LIBRARY__'
```
`shlex.quote`はすでに`'/tcl/(cmd)/lib'`を返します。したがって、レンダリングされる行は`''/tcl/(cmd)/lib''`になります。fishは、隣接するクォートされた実行を連結し、それらの間に残された`(cmd)`を展開します。同様の重複により、スペースを含むパスが2つのリスト要素に分割され、`TCL_LIBRARY`および`TK_LIBRARY`が破損します。
これは、`activate.bat`を対象としたGHSA-x78j-v8h9-3j2qと同じ種類の欠陥です。
### 修正
21.7.13で修正されました。これは、プレースホルダーを周囲のクォートの外側に移動することで実現され、各値が適用される`shlex.quote`によるクォートのみを保持するようにしました。修正: https://github.com/pypa/virtualenv/pull/3252
### 対策
`'`, `` ` ``, `$`, `;`, `(`または`)`を含むパスを持つ仮想環境の作成または配布を避け、自分で作成していない起動スクリプトを読み込む前に、生成されたスクリプトを検査してください。
影響を受けるパッケージ:
- pip (Python) virtualenv: 影響を受けるバージョンは 21.7.12 以前、修正されたバージョンは 21.7.13。