virtualenv activate は、zsh で環境名を使用してコマンドを実行します。この際、PROMPT_SUBST が有効になります。

### 影響

zsh のユーザーは、bash の `activate` スクリプトを使用して環境を有効化します。このスクリプトは、環境名を `PS1` に設定します。
バージョン 21.13.0 以降、このスクリプトは `PS1` 内のバックスラッシュ、ドル記号、およびバッククォートをエスケープしますが、これは `BASH_VERSION` が設定されている場合にのみ適用されます。そのため、zsh は生の値を扱います。
`PROMPT_SUBST` オプションが有効になっている場合、zsh はプロンプトが表示されるたびに、`PS1` に対してパラメータ展開、コマンド置換、および算術展開を実行します。
したがって、環境名に `$(...)`、バッククォート、または `${...}` が含まれている場合、それらはユーザーのシェルでコマンドとして実行されます(プロンプトごとに 1 回)。

環境名は、環境ディレクトリ、または `--prompt` オプションまたは `VIRTUALENV_PROMPT` 環境変数から取得されます。
たとえば、次のように環境を作成した場合:

```console
$ virtualenv 'x$(touch PWNED)y'
```

zsh セッションで `PROMPT_SUBST` が有効になっている状態で `source 'x$(touch PWNED)y/bin/activate'` を実行すると、`PWNED` ファイルが作成され、プロンプトには `(xy)` と表示されます。
この値を `--prompt` オプションとして、単純な名前の環境に渡すと、同じ効果が得られます。
`PROMPT_SUBST` が無効になっている場合、zsh は環境名をテキストとして表示し、何も実行しません。bash も同様です。

通常、zsh は `PROMPT_SUBST` を無効にして起動します。oh-my-zsh を使用している場合は、有効になっている可能性があります。
oh-my-zsh は、起動時に [`lib/theme-and-appearance.zsh`](https://github.com/ohmyzsh/ohmyzsh/blob/4d4cfc287e9d887b81242c0e431b5f49f9cec5c1/lib/theme-and-appearance.zsh#L5) をロードし、そのファイルが `PROMPT_SUBST` を設定します。
攻撃者は、環境パスまたはプロンプトに影響を与える必要があります。これには、ブランチ、プロジェクト、またはジョブ名を渡す CI ジョブまたはラッパーツール、またはクローンされたリポジトリまたは展開されたアーカイブ内のディレクトリが含まれます。
`--prompt .` は、現在のディレクトリの名前を使用します。

zsh は、`PS1` 内の `%` をプロンプトのエスケープ文字として解釈します。したがって、環境名に `%n` が含まれている場合、その文字はユーザー名に置き換えられますが、コマンドは実行されません。

この問題は、バージョン 21.14.3 を含む、それ以前のすべてのリリースに存在します。
ペイロードは、バージョン 20.26.6 および 21.14.3 で実行され、報告者はバージョン 21.9.1 で確認しました。

### 修正

バージョン21.14.4で修正されました。zsh環境では、`activate`コマンドが、bash環境と同様に名前のエスケープ処理を行い、`%`記号を二重化します。そのため、上記の例を実行しても何も起こらず、プロンプトには指定された名前が表示されます。zshでは、`PROMPT_SUBST`オプションがオフの状態でもエスケープ処理が行われます。これは、ユーザーが`activate`コマンド実行後にオプションを設定できるためです。バックスラッシュ、ドル記号、またはバッククォートを含む名前の場合、追加されたバックスラッシュが表示されます。
修正に関する情報: https://github.com/pypa/virtualenv/commit/5b915367da82bd024b2a0d28d2f98007034b4aa2

### 対策

`activate`コマンドを実行する前に、`VIRTUAL_ENV_DISABLE_PROMPT=1`を設定すると、`PS1`変数が変更されずに済みます。または、プロンプトで置換機能が不要な場合は、`unsetopt prompt_subst`コマンドを実行してください。`activate`コマンドを実行する前に、自分で作成していない環境の名前を確認してください。

### 協力者

この問題は、Kaya Emre Arikan氏(@kemrec)によって報告されました。

影響を受けるパッケージ:
- pip (Python) virtualenv: 影響を受けるバージョンは21.14.3以前、修正されたバージョンは21.14.4。