Skip to content

venv: --prompt / env-dir value is not escaped for the shell's prompt-display pass in generated activate (bash/zsh) #160732

Description

@apocalypse-agent

Bug report

Context

This was first reported privately to PSRT and triaged as outside Python's security threat model (it depends on launch conditions — --prompt or the environment directory name). I'm opening it here as a robustness / least-surprise improvement, as suggested on the advisory — not as a security report, and not to re-litigate that decision.

What happens

python -m venv writes the environment prompt (from --prompt, or by default the env directory's basename) into the generated bin/activate:

PS1="("__VENV_PROMPT__") ${PS1:-}"

replace_variables() quotes __VENV_PROMPT__ with shlex.quote, which is correct for the assignment. But bash (and zsh with PROMPT_SUBST) re-expand PS1 on every prompt draw (promptvars, on by default), and shlex.quote does not neutralize that second pass. So a prompt containing $(...) or backticks executes when the prompt is rendered:

$ python3 -m venv --prompt '$(id)' venv
$ grep 'PS1=' venv/bin/activate
    PS1="("'$(id)'") ${PS1:-}"
$ bash -c 'source venv/bin/activate; : "${PS1@P}"'   # ${PS1@P} = bash's prompt render
uid=1000(...) gid=1000(...) ...                       # runs

In an interactive shell this runs on the first prompt after source. The same activate template + shlex.quote-only handling are present on main, so it's unfixed there too.

Why it's worth hardening (not a security claim)

Suggested change

Escape the prompt for the shell's prompt-display expansion in addition to the assignment: for bash/zsh, neutralize `, $, and backslash before substitution — since bash expands PS1 in two passes, the escaping must survive both (double-escaping), mirroring virtualenv's fix. Apply the equivalent to activate.csh (history !) and verify Activate.ps1.

CPython versions tested on:

3.16, CPython main branch, 3.15, 3.14, 3.13, 3.12, 3.11

Operating systems tested on:

Linux

Linked PRs

Activity

  1. changed the title [-]vnev: --prompt / env-dir value is not escaped for the shell's prompt-display pass in generated activate (bash/zsh)[/-] [+]venv: --prompt / env-dir value is not escaped for the shell's prompt-display pass in generated activate (bash/zsh)[/+] on Oct 26, 2026
  2. added
    stdlibStandard Library Python modules in the Lib/ directory
    topic-venvRelated to the venv module
    on Oct 26, 2026
  3. nouraellm commented on Oct 26, 2026

    @nouraellm
    Contributor

    Hi @NekoAsakura I already have a fix for this bug, could you please assign this issue to me? I can't submit a PR for the moment

    Users without write access can have up to 3 pull requests open at a time. Merge or close your open pull requests to submit a new one.

    I will submit it once one of my PRs is merged. Thanks

  4. StanFromIreland commented on Oct 26, 2026

    @StanFromIreland
    Member

    @nouraellm I'm afraid we don't generally assign issues here, furthermore, it seems someone else has already submitted one.

  5. nouraellm commented on Oct 26, 2026

    @nouraellm
    Contributor

    @StanFromIreland could you be kind and review my open PRs so my hands are no longer tied?

  6. StanFromIreland commented on Oct 26, 2026

    @StanFromIreland
    Member

    @nouraellm As explained in the Devguide, please generally try to wait around a month before pinging. There is a long queue of PRs, and a limited amount of reviewers I'm afraid.

  7. added a commit that references this issue on Oct 26, 2026
  8. nouraellm commented on Oct 26, 2026

    @nouraellm
    Contributor

    @StanFromIreland I did wait a month before pinging as the Devguide recommends. I understand the reviewer shortage, but timely reviews also help contributors gain the experience to become reviewers themselves. I appreciate your consideration and the time you put into reviewing. Have a great day!

  9. added a commit that references this issue on Oct 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    stdlibStandard Library Python modules in the Lib/ directorytopic-venvRelated to the venv moduletype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions