PyPI / virtualenv / 21.14.7

virtualenv 21.14.7

Source
https://github.com/pypa/virtualenv
Tag scanned
21.14.7
Compared with
21.14.6 (0 signals introduced since)
Files
208 scanned, 33 skipped (binary, oversized, or unrecognised)
Signals
0 critical · 0 warn · 14 info
Scan time
10.5 s
LLM review
Reviewed by claude-haiku-5-5 (Anthropic): 10 of 10 warn and critical signals; 10 demoted to info.
Disclude version
4.0.0
Scanned (UTC)
2026-10-14 18:29

Signals

Ordered by severity, then signals introduced in this release. Hidden characters are shown as ⟨U+…⟩.

  1. info critical → info by review dynamic-import docs/render_cli.py:40:34

    `__import__` called on a non-literal expression (ast pass, confidence 0.70)

            module_name, attr_name = self.options["module"], self.options["func"]
            parser_creator = getattr(__import__(module_name, fromlist=[attr_name]), attr_name)
            core_result = parse_parser(parser_creator())
    likely benign LLM, confidence 0.85 Docs tooling dynamically imports a parser factory named in its options.
    Reasoning

    The __import__ call resolves a module and attribute named in the project's own docs-rendering options, a standard sphinx-argparse-style pattern. It is not obfuscation, and the name comes from configuration rather than attacker-controlled input.

  2. info critical → info by review dynamic-import docs/render_cli.py:236:20

    `__import__` called on a non-literal expression (ast pass, confidence 0.70)

        of_class = of_type.split(".")
        data = getattr(__import__(".".join(of_class[:-1]), fromlist=[of_class[-1]]), of_class[-1])
        return [n.literal("", text=",".join(data))], []
    likely benign LLM, confidence 0.85 Docs renderer imports a class from a dotted path given in a directive.
    Reasoning

    The dotted class path is split from a documentation directive's type string and then imported. This is the same docs-tooling mechanism as the other finding in this file, with no sign of hidden or remote-sourced code.

  3. info warn → info by review dynamic-execution docs/tutorial/getting-started.rst:102:21

    [embedded bash] command name is a variable (`$which`) not set in this file — the caller or environment decides what runs (ast pass, confidence 0.70)

            (myproject) $ which python
            /home/user/myproject/bin/python
    likely benign LLM, confidence 0.90 Tutorial shell transcript showing 'which python' output.
    Reasoning

    This is an illustrative shell session in reStructuredText docs. The $which prompt-and-output block is ordinary tutorial content, and the variable-command flag is an artifact of the embedded-bash parser.

  4. info critical → info by review path-command-shadow docs/tutorial/getting-started.rst:109:23

    [embedded bash] redirect writes to `python` — filename matches a system command (PATH hijack setup) (ast pass, confidence 0.88)

            (myproject) PS> where.exe python
            C:\Users\user\myproject\Scripts\python.exe
    dismissed LLM, confidence 0.85 Windows tutorial transcript showing 'where.exe python' output.
    Reasoning

    The snippet is only the output of 'where.exe python' showing a venv path. There is no redirect in the snippet, so the 'writes to python' claim is a parser misreading of the transcript. This is documentation of a Windows virtualenv, not a PATH hijack.

  5. info warn → info by review obfuscated-command-name docs/tutorial/getting-started.rst:110:9

    [embedded bash] command name contains 5 backslash-escape sequences — hiding the true command (ast pass, confidence 0.85)

            (myproject) PS> where.exe python
            C:\Users\user\myproject\Scripts\python.exe
    likely benign LLM, confidence 0.90 Windows path separators in a documented where.exe command.
    Reasoning

    The 'backslash escapes' are ordinary Windows path separators in 'where.exe' and venv paths. Nothing is hidden, and this is normal Windows documentation.

  6. info warn → info by review obfuscated-command-name docs/tutorial/getting-started.rst:117:9

    [embedded bash] command name contains 5 backslash-escape sequences — hiding the true command (ast pass, confidence 0.85)

            (myproject) C:\> where.exe python
            C:\Users\user\myproject\Scripts\python.exe
    likely benign LLM, confidence 0.90 Windows path separators in a documented where.exe command in a C:\ prompt.
    Reasoning

    Same as the other where.exe block: backslashes are Windows path separators in a documented command, not obfuscation.

  7. info warn → info by review dynamic-execution docs/tutorial/getting-started.rst:127:17

    [embedded bash] command name is a variable (`$pip`) not set in this file — the caller or environment decides what runs (ast pass, confidence 0.70)

        (myproject) $ pip install requests
        Collecting requests
          Using cached requests-2.32.3-py3-none-any.whl (64 kB)
    likely benign LLM, confidence 0.90 Tutorial transcript showing a pip install of requests.
    Reasoning

    The block is a documented 'pip install requests' transcript with normal pip output. The variable-command flag is a parser artifact of a shell example, not a dynamic execution risk.

  8. info warn → info by review dynamic-execution docs/tutorial/getting-started.rst:137:17

    [embedded bash] command name is a variable (`$python`) not set in this file — the caller or environment decides what runs (ast pass, confidence 0.70)

        (myproject) $ python -c "import requests; print(requests.__file__)"
        /home/user/myproject/lib/python3.13/site-packages/requests/__init__.py
    likely benign LLM, confidence 0.90 Tutorial example printing the requests package location.
    Reasoning

    This is a standard tutorial example printing the location of the requests package. The $python prompt is illustrative and has no malicious content.

  9. info warn → info by review obfuscated-command-name docs/tutorial/getting-started.rst:176:9

    [embedded bash] command name contains 3 backslash-escape sequences — hiding the true command (ast pass, confidence 0.85)

            PS> .\myproject\Scripts\python.exe -c "import sys; print(sys.prefix)"
            C:\Users\user\myproject
    
            PS> .\myproject\Scripts\pip.exe install httpx
    likely benign LLM, confidence 0.90 Tutorial shows running the venv's Windows python.exe and pip.exe by relative path.
    Reasoning

    The '.\\myproject\\Scripts\\python.exe' invocation is a relative Windows path to the venv interpreter in a tutorial. The backslashes are ordinary path separators, not hidden command names.

  10. info warn → info by review obfuscated-command-name docs/tutorial/getting-started.rst:185:9

    [embedded bash] command name contains 3 backslash-escape sequences — hiding the true command (ast pass, confidence 0.85)

            C:\> .\myproject\Scripts\python.exe -c "import sys; print(sys.prefix)"
            C:\Users\user\myproject
    
            C:\> .\myproject\Scripts\pip.exe install httpx
    likely benign LLM, confidence 0.90 Tutorial shows running the venv's Windows python.exe and pip.exe from a C:\ prompt.
    Reasoning

    Same pattern as the earlier finding in this tutorial: a relative Windows venv path in a documented C:\ session. The backslashes are path separators, not obfuscation.

  11. info unicode-homoglyph tests/conftest.py:309:28

    identifier `__VIRTUAL_NAME__èрт` contains homoglyph candidates: р (0440)→p (in string/comment) (raw pass, confidence 0.35)

        # __VIRTUAL_NAME__ is a template placeholder, and must stay data when the path embeds it
        base = "'\";&&e-$ !%`|>__VIRTUAL_NAME__èрт🚒♞中片-j"
        if IS_WIN:
            # NTFS path components cannot contain any of these, regardless of where they sit in the string
  12. info unicode-mixed-script tests/conftest.py:309:28

    identifier `__VIRTUAL_NAME__èрт` mixes scripts: Latin + Cyrillic (in string/comment) (raw pass, confidence 0.40)

        # __VIRTUAL_NAME__ is a template placeholder, and must stay data when the path embeds it
        base = "'\";&&e-$ !%`|>__VIRTUAL_NAME__èрт🚒♞中片-j"
        if IS_WIN:
            # NTFS path components cannot contain any of these, regardless of where they sit in the string
  13. identifier `èрт` contains homoglyph candidates: р (0440)→p (in string/comment) (raw pass, confidence 0.35)

        """Exclude ampersands, which batch activation does not support in paths."""
        base = "'\";e-$ èрт🚒♞中片-j"
        if IS_WIN:
            base = base.replace('"', "").replace(";", "")
  14. info unicode-mixed-script tests/unit/activation/test_batch.py:26:21

    identifier `èрт` mixes scripts: Latin + Cyrillic (in string/comment) (raw pass, confidence 0.40)

        """Exclude ampersands, which batch activation does not support in paths."""
        base = "'\";e-$ èрт🚒♞中片-j"
        if IS_WIN:
            base = base.replace('"', "").replace(";", "")

Reproduce This Scan

Run disclude locally to verify. Add --format sarif for SARIF output. Add --llm (with an API key in the environment) to include the LLM review.

cargo install disclude --version 4.0.0
git clone https://github.com/pypa/virtualenv virtualenv && cd virtualenv
git checkout 21.14.7
disclude scan --severity info --diff 21.14.6 .