PyPI / pip / 26.2.2

pip 26.2.2

Source
https://github.com/pypa/pip
Artifact scanned
pip-26.2.2-py3-none-any.whl (wheel · 1.7 MB · SHA-256 fd7f4dfa8190…)
Compared with
pip-26.2.1-py3-none-any.whl (0 signals introduced since)
Files
420 scanned, 58 skipped (binary, oversized, or unrecognised)
Signals
0 critical · 0 warn · 144 info
Scan time
28.1 s
LLM review
Reviewed by claude-haiku-5-5 (Anthropic): 34 of 34 warn and critical signals; 34 demoted to info.
Disclude version
4.3.0
Scanned (UTC)
2026-10-23 02:16

Signals

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

  1. info warn → info by review unicode-zero-width pip-26.2.2.dist-info/licenses/AUTHORS.txt:798:2

    U+200B ZERO WIDTH SPACE in source (raw pass, confidence 0.75)

    Sylvain
    S⟨U+200B⟩age Abdullah
    Takayuki SHIMIZUKAWA
    Taneli Hukkinen
    likely benign LLM, confidence 0.85 Stray U+200B zero-width space inside a contributor name in the AUTHORS text file.
    Reasoning

    A zero-width space appears inside a contributor name in the AUTHORS file (Sage Abdullah). In a plain-text credits list this is most likely a stray character from copy-paste or an editor, though it is a minor oddity. It has no code effect. Low risk, but the character is unexpected in a licence/authors file.

  2. info warn → info by review dynamic-execution pip/_internal/commands/configuration.py:248:13

    `subprocess.check_call` called with `shell=True` and a literal command (ast pass, confidence 0.70)

            try:
                subprocess.check_call(f'{editor} "{fname}"', shell=True)
            except FileNotFoundError as e:
                if not e.filename:
    likely benign LLM, confidence 0.85 Launches the user's editor on the pip config file through a shell command.
    Reasoning

    The shell=True call runs the user's configured editor with the file name in an f-string. The editor comes from the user's own environment or config, not from attacker-controlled input, and this is the standard pattern for launching an editor from pip config edit.

  3. info critical → info by review dynamic-import pip/_internal/commands/install.py:114:13

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

            try:
                __import__(module)
            except ImportError:
                # Record the module as missing so the hook can raise ImportError
    likely benign LLM, confidence 0.85 Dynamic __import__ inside a hook that records missing modules during install.
    Reasoning

    This is the import-blocking hook used by pip's install flow. It imports a module name, records it as missing on ImportError, and re-raises. This is a legitimate way to simulate missing modules and does not hide execution.

  4. info unicode-zero-width pip/_internal/utils/unpacking.py:281:77

    U+200B ZERO WIDTH SPACE in source (in string/comment) (raw pass, confidence 0.45)

        """Fallback for Python without tarfile.data_filter"""
        # NOTE: This function can be removed once pip requires CPython ≥ 3.12.⟨U+200B⟩
        # PEP 706 added tarfile.data_filter, made tarfile extraction operations more secure.
        # This feature is fully supported from CPython 3.12 onward.
  5. info critical → info by review dynamic-import pip/_vendor/__init__.py:33:9

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

        try:
            __import__(modulename, globals(), locals(), level=0)
        except ImportError:
            # We can just silently allow import failures to pass here. If we
    likely benign LLM, confidence 0.85 Dynamic import of vendored modules to alias them under the pip._vendor namespace.
    Reasoning

    This is the vendoring alias mechanism, which imports a vendored module by name and silently ignores ImportError. It is a well-known compatibility pattern in pip's vendor package.

  6. info critical → info by review dynamic-import pip/_vendor/distlib/resources.py:337:13

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

            if package not in sys.modules:
                __import__(package)
            module = sys.modules[package]
            path = getattr(module, '__path__', None)
    likely benign LLM, confidence 0.85 Imports a package by name to locate its resource path.
    Reasoning

    The function imports a package by name only when it is not already in sys.modules, then reads its __path__ to locate resources. This is standard resource-finder code in distlib.

  7. info critical → info by review dynamic-import pip/_vendor/distlib/util.py:680:15

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

        else:
            mod = __import__(module_name)
        if dotted_path is None:
            result = mod
    likely benign LLM, confidence 0.85 Dynamic import of a module from a dotted path for entry-point resolution.
    Reasoning

    This is the resolve-by-dotted-name helper that imports a module and then walks attributes. Its input is a configured entry-point or module string, and it is a normal utility for that purpose.

  8. info unicode-mixed-script pip/_vendor/idna/uts46data.py:8850:6

    identifier `ʼn` mixes scripts: Other + Latin (in string/comment) (raw pass, confidence 0.40)

        None,
        "ʼn",
        "ŋ",
        None,
  9. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9143:6

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

        None,
        "α",
        "β",
        "γ",
  10. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9149:6

    identifier `η` contains homoglyph candidates: η (03B7)→n (in string/comment) (raw pass, confidence 0.35)

        "ζ",
        "η",
        "θ",
        "ι",
  11. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9152:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "ι",
        "κ",
        "λ",
        "μ",
  12. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9155:6

    identifier `ν` contains homoglyph candidates: ν (03BD)→v (in string/comment) (raw pass, confidence 0.35)

        "μ",
        "ν",
        "ξ",
        "ο",
  13. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9157:6

    identifier `ο` contains homoglyph candidates: ο (03BF)→o (in string/comment) (raw pass, confidence 0.35)

        "ξ",
        "ο",
        "π",
        "ρ",
  14. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9159:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "π",
        "ρ",
        None,
        "σ",
  15. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9206:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        None,
        "κ",
        "ρ",
        "σ",
  16. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9207:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "κ",
        "ρ",
        "σ",
        None,
  17. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9227:6

    identifier `і` contains homoglyph candidates: і (0456)→i (in string/comment) (raw pass, confidence 0.35)

        "ѕ",
        "і",
        "ї",
        "ј",
  18. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9237:6

    identifier `а` contains homoglyph candidates: а (0430)→a (in string/comment) (raw pass, confidence 0.35)

        "џ",
        "а",
        "б",
        "в",
  19. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9242:6

    identifier `е` contains homoglyph candidates: е (0435)→e (in string/comment) (raw pass, confidence 0.35)

        "д",
        "е",
        "ж",
        "з",
  20. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9251:6

    identifier `о` contains homoglyph candidates: о (043E)→o (in string/comment) (raw pass, confidence 0.35)

        "н",
        "о",
        "п",
        "р",
  21. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9253:6

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

        "п",
        "р",
        "с",
        "т",
  22. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9254:6

    identifier `с` contains homoglyph candidates: с (0441)→c (in string/comment) (raw pass, confidence 0.35)

        "р",
        "с",
        "т",
        "у",
  23. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9256:6

    identifier `у` contains homoglyph candidates: у (0443)→y (in string/comment) (raw pass, confidence 0.35)

        "т",
        "у",
        "ф",
        "х",
  24. info unicode-homoglyph pip/_vendor/idna/uts46data.py:9258:6

    identifier `х` contains homoglyph candidates: х (0445)→x (in string/comment) (raw pass, confidence 0.35)

        "ф",
        "х",
        "ц",
        "ч",
  25. info unicode-homoglyph pip/_vendor/idna/uts46data.py:10059:6

    identifier `о` contains homoglyph candidates: о (043E)→o (in string/comment) (raw pass, confidence 0.35)

        "д",
        "о",
        "с",
        "т",
  26. info unicode-homoglyph pip/_vendor/idna/uts46data.py:10060:6

    identifier `с` contains homoglyph candidates: с (0441)→c (in string/comment) (raw pass, confidence 0.35)

        "о",
        "с",
        "т",
        "ъ",
  27. info unicode-homoglyph pip/_vendor/idna/uts46data.py:10180:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "γ",
        "ρ",
        "φ",
        "χ",
  28. info unicode-mixed-script pip/_vendor/idna/uts46data.py:10374:6

    identifier `aʾ` mixes scripts: Latin + Other (in string/comment) (raw pass, confidence 0.40)

        None,
        "aʾ",
        "ṡ",
        None,
  29. info unicode-mixed-script pip/_vendor/idna/uts46data.py:12023:6

    identifier `kω` mixes scripts: Latin + Greek (in string/comment) (raw pass, confidence 0.40)

        "mw",
        "kω",
        "mω",
        None,
  30. info unicode-mixed-script pip/_vendor/idna/uts46data.py:12024:6

    identifier `mω` mixes scripts: Latin + Greek (in string/comment) (raw pass, confidence 0.40)

        "kω",
        "mω",
        None,
        "bq",
  31. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15446:6

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

        None,
        "α",
        "β",
        "γ",
  32. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15452:6

    identifier `η` contains homoglyph candidates: η (03B7)→n (in string/comment) (raw pass, confidence 0.35)

        "ζ",
        "η",
        "θ",
        "ι",
  33. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15455:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "ι",
        "κ",
        "λ",
        "μ",
  34. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15458:6

    identifier `ν` contains homoglyph candidates: ν (03BD)→v (in string/comment) (raw pass, confidence 0.35)

        "μ",
        "ν",
        "ξ",
        "ο",
  35. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15460:6

    identifier `ο` contains homoglyph candidates: ο (03BF)→o (in string/comment) (raw pass, confidence 0.35)

        "ξ",
        "ο",
        "π",
        "ρ",
  36. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15462:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "π",
        "ρ",
        "θ",
        "σ",
  37. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15472:6

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

        "∇",
        "α",
        "β",
        "γ",
  38. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15478:6

    identifier `η` contains homoglyph candidates: η (03B7)→n (in string/comment) (raw pass, confidence 0.35)

        "ζ",
        "η",
        "θ",
        "ι",
  39. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15481:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "ι",
        "κ",
        "λ",
        "μ",
  40. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15484:6

    identifier `ν` contains homoglyph candidates: ν (03BD)→v (in string/comment) (raw pass, confidence 0.35)

        "μ",
        "ν",
        "ξ",
        "ο",
  41. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15486:6

    identifier `ο` contains homoglyph candidates: ο (03BF)→o (in string/comment) (raw pass, confidence 0.35)

        "ξ",
        "ο",
        "π",
        "ρ",
  42. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15488:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "π",
        "ρ",
        "σ",
        "τ",
  43. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15499:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "θ",
        "κ",
        "φ",
        "ρ",
  44. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15501:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "φ",
        "ρ",
        "π",
        "α",
  45. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15503:6

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

        "π",
        "α",
        "β",
        "γ",
  46. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15509:6

    identifier `η` contains homoglyph candidates: η (03B7)→n (in string/comment) (raw pass, confidence 0.35)

        "ζ",
        "η",
        "θ",
        "ι",
  47. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15512:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "ι",
        "κ",
        "λ",
        "μ",
  48. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15515:6

    identifier `ν` contains homoglyph candidates: ν (03BD)→v (in string/comment) (raw pass, confidence 0.35)

        "μ",
        "ν",
        "ξ",
        "ο",
  49. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15517:6

    identifier `ο` contains homoglyph candidates: ο (03BF)→o (in string/comment) (raw pass, confidence 0.35)

        "ξ",
        "ο",
        "π",
        "ρ",
  50. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15519:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "π",
        "ρ",
        "θ",
        "σ",
  51. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15529:6

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

        "∇",
        "α",
        "β",
        "γ",
  52. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15535:6

    identifier `η` contains homoglyph candidates: η (03B7)→n (in string/comment) (raw pass, confidence 0.35)

        "ζ",
        "η",
        "θ",
        "ι",
  53. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15538:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "ι",
        "κ",
        "λ",
        "μ",
  54. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15541:6

    identifier `ν` contains homoglyph candidates: ν (03BD)→v (in string/comment) (raw pass, confidence 0.35)

        "μ",
        "ν",
        "ξ",
        "ο",
  55. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15543:6

    identifier `ο` contains homoglyph candidates: ο (03BF)→o (in string/comment) (raw pass, confidence 0.35)

        "ξ",
        "ο",
        "π",
        "ρ",
  56. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15545:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "π",
        "ρ",
        "σ",
        "τ",
  57. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15556:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "θ",
        "κ",
        "φ",
        "ρ",
  58. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15558:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "φ",
        "ρ",
        "π",
        "α",
  59. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15560:6

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

        "π",
        "α",
        "β",
        "γ",
  60. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15566:6

    identifier `η` contains homoglyph candidates: η (03B7)→n (in string/comment) (raw pass, confidence 0.35)

        "ζ",
        "η",
        "θ",
        "ι",
  61. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15569:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "ι",
        "κ",
        "λ",
        "μ",
  62. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15572:6

    identifier `ν` contains homoglyph candidates: ν (03BD)→v (in string/comment) (raw pass, confidence 0.35)

        "μ",
        "ν",
        "ξ",
        "ο",
  63. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15574:6

    identifier `ο` contains homoglyph candidates: ο (03BF)→o (in string/comment) (raw pass, confidence 0.35)

        "ξ",
        "ο",
        "π",
        "ρ",
  64. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15576:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "π",
        "ρ",
        "θ",
        "σ",
  65. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15586:6

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

        "∇",
        "α",
        "β",
        "γ",
  66. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15592:6

    identifier `η` contains homoglyph candidates: η (03B7)→n (in string/comment) (raw pass, confidence 0.35)

        "ζ",
        "η",
        "θ",
        "ι",
  67. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15595:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "ι",
        "κ",
        "λ",
        "μ",
  68. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15598:6

    identifier `ν` contains homoglyph candidates: ν (03BD)→v (in string/comment) (raw pass, confidence 0.35)

        "μ",
        "ν",
        "ξ",
        "ο",
  69. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15600:6

    identifier `ο` contains homoglyph candidates: ο (03BF)→o (in string/comment) (raw pass, confidence 0.35)

        "ξ",
        "ο",
        "π",
        "ρ",
  70. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15602:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "π",
        "ρ",
        "σ",
        "τ",
  71. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15613:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "θ",
        "κ",
        "φ",
        "ρ",
  72. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15615:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "φ",
        "ρ",
        "π",
        "α",
  73. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15617:6

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

        "π",
        "α",
        "β",
        "γ",
  74. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15623:6

    identifier `η` contains homoglyph candidates: η (03B7)→n (in string/comment) (raw pass, confidence 0.35)

        "ζ",
        "η",
        "θ",
        "ι",
  75. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15626:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "ι",
        "κ",
        "λ",
        "μ",
  76. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15629:6

    identifier `ν` contains homoglyph candidates: ν (03BD)→v (in string/comment) (raw pass, confidence 0.35)

        "μ",
        "ν",
        "ξ",
        "ο",
  77. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15631:6

    identifier `ο` contains homoglyph candidates: ο (03BF)→o (in string/comment) (raw pass, confidence 0.35)

        "ξ",
        "ο",
        "π",
        "ρ",
  78. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15633:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "π",
        "ρ",
        "θ",
        "σ",
  79. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15643:6

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

        "∇",
        "α",
        "β",
        "γ",
  80. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15649:6

    identifier `η` contains homoglyph candidates: η (03B7)→n (in string/comment) (raw pass, confidence 0.35)

        "ζ",
        "η",
        "θ",
        "ι",
  81. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15652:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "ι",
        "κ",
        "λ",
        "μ",
  82. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15655:6

    identifier `ν` contains homoglyph candidates: ν (03BD)→v (in string/comment) (raw pass, confidence 0.35)

        "μ",
        "ν",
        "ξ",
        "ο",
  83. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15657:6

    identifier `ο` contains homoglyph candidates: ο (03BF)→o (in string/comment) (raw pass, confidence 0.35)

        "ξ",
        "ο",
        "π",
        "ρ",
  84. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15659:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "π",
        "ρ",
        "σ",
        "τ",
  85. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15670:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "θ",
        "κ",
        "φ",
        "ρ",
  86. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15672:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "φ",
        "ρ",
        "π",
        "α",
  87. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15674:6

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

        "π",
        "α",
        "β",
        "γ",
  88. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15680:6

    identifier `η` contains homoglyph candidates: η (03B7)→n (in string/comment) (raw pass, confidence 0.35)

        "ζ",
        "η",
        "θ",
        "ι",
  89. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15683:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "ι",
        "κ",
        "λ",
        "μ",
  90. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15686:6

    identifier `ν` contains homoglyph candidates: ν (03BD)→v (in string/comment) (raw pass, confidence 0.35)

        "μ",
        "ν",
        "ξ",
        "ο",
  91. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15688:6

    identifier `ο` contains homoglyph candidates: ο (03BF)→o (in string/comment) (raw pass, confidence 0.35)

        "ξ",
        "ο",
        "π",
        "ρ",
  92. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15690:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "π",
        "ρ",
        "θ",
        "σ",
  93. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15700:6

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

        "∇",
        "α",
        "β",
        "γ",
  94. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15706:6

    identifier `η` contains homoglyph candidates: η (03B7)→n (in string/comment) (raw pass, confidence 0.35)

        "ζ",
        "η",
        "θ",
        "ι",
  95. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15709:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "ι",
        "κ",
        "λ",
        "μ",
  96. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15712:6

    identifier `ν` contains homoglyph candidates: ν (03BD)→v (in string/comment) (raw pass, confidence 0.35)

        "μ",
        "ν",
        "ξ",
        "ο",
  97. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15714:6

    identifier `ο` contains homoglyph candidates: ο (03BF)→o (in string/comment) (raw pass, confidence 0.35)

        "ξ",
        "ο",
        "π",
        "ρ",
  98. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15716:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "π",
        "ρ",
        "σ",
        "τ",
  99. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15727:6

    identifier `κ` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

        "θ",
        "κ",
        "φ",
        "ρ",
  100. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15729:6

    identifier `ρ` contains homoglyph candidates: ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

        "φ",
        "ρ",
        "π",
        "ϝ",
  101. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15803:6

    identifier `а` contains homoglyph candidates: а (0430)→a (in string/comment) (raw pass, confidence 0.35)

        None,
        "а",
        "б",
        "в",
  102. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15808:6

    identifier `е` contains homoglyph candidates: е (0435)→e (in string/comment) (raw pass, confidence 0.35)

        "д",
        "е",
        "ж",
        "з",
  103. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15815:6

    identifier `о` contains homoglyph candidates: о (043E)→o (in string/comment) (raw pass, confidence 0.35)

        "м",
        "о",
        "п",
        "р",
  104. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15817:6

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

        "п",
        "р",
        "с",
        "т",
  105. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15818:6

    identifier `с` contains homoglyph candidates: с (0441)→c (in string/comment) (raw pass, confidence 0.35)

        "р",
        "с",
        "т",
        "у",
  106. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15820:6

    identifier `у` contains homoglyph candidates: у (0443)→y (in string/comment) (raw pass, confidence 0.35)

        "т",
        "у",
        "ф",
        "х",
  107. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15822:6

    identifier `х` contains homoglyph candidates: х (0445)→x (in string/comment) (raw pass, confidence 0.35)

        "ф",
        "х",
        "ц",
        "ч",
  108. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15831:6

    identifier `і` contains homoglyph candidates: і (0456)→i (in string/comment) (raw pass, confidence 0.35)

        "ә",
        "і",
        "ј",
        "ө",
  109. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15836:6

    identifier `а` contains homoglyph candidates: а (0430)→a (in string/comment) (raw pass, confidence 0.35)

        "ӏ",
        "а",
        "б",
        "в",
  110. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15841:6

    identifier `е` contains homoglyph candidates: е (0435)→e (in string/comment) (raw pass, confidence 0.35)

        "д",
        "е",
        "ж",
        "з",
  111. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15847:6

    identifier `о` contains homoglyph candidates: о (043E)→o (in string/comment) (raw pass, confidence 0.35)

        "л",
        "о",
        "п",
        "с",
  112. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15849:6

    identifier `с` contains homoglyph candidates: с (0441)→c (in string/comment) (raw pass, confidence 0.35)

        "п",
        "с",
        "у",
        "ф",
  113. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15850:6

    identifier `у` contains homoglyph candidates: у (0443)→y (in string/comment) (raw pass, confidence 0.35)

        "с",
        "у",
        "ф",
        "х",
  114. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15852:6

    identifier `х` contains homoglyph candidates: х (0445)→x (in string/comment) (raw pass, confidence 0.35)

        "ф",
        "х",
        "ц",
        "ч",
  115. info unicode-homoglyph pip/_vendor/idna/uts46data.py:15859:6

    identifier `і` contains homoglyph candidates: і (0456)→i (in string/comment) (raw pass, confidence 0.35)

        "ґ",
        "і",
        "ѕ",
        "џ",
  116. info warn → info by review dynamic-execution pip/_vendor/packaging/licenses/__init__.py:144:9

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

        try:
            compile(python_expression, "", "eval")
        except SyntaxError:
            message = f"Invalid license expression: {raw_license_expression!r}"
    likely benign LLM, confidence 0.90 Compiles a license expression in eval mode solely to validate its syntax.
    Reasoning

    compile is called with mode 'eval' only to check that a license expression is syntactically valid. It produces a code object and never executes it, and the SyntaxError is caught to report an invalid expression.

  117. info critical → info by review dynamic-import pip/_vendor/pkg_resources/__init__.py:427:9

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

        except KeyError:
            __import__(moduleOrReq)
            module = sys.modules[moduleOrReq]
        loader = getattr(module, '__loader__', None)
    likely benign LLM, confidence 0.85 Dynamic import of a named module to obtain its loader.
    Reasoning

    This is the module-loading helper for entry points or requirements. It imports a named module only after a sys.modules lookup misses, which is standard pkg_resources behavior.

  118. info critical → info by review frame-introspection pip/_vendor/pkg_resources/__init__.py:743:14

    `sys._getframe` — call-stack frame introspection — file also calls `sys.exit`/`exec`/`eval` (anti-analysis shape) (ast pass, confidence 0.85)

            """Locate distribution for `requires` and run `script_name` script"""
            ns = sys._getframe(1).f_globals
            name = ns['__name__']
            ns.clear()
    likely benign LLM, confidence 0.80 Reads the caller's globals via sys._getframe to run a distribution script.
    Reasoning

    This is setuptools' run_script, which runs a distribution's script in the caller's namespace. Frame introspection to get f_globals is how it sets up that namespace. The sys.exit and exec co-occurrence matches the legitimate script runner rather than an anti-analysis shape.

  119. info warn → info by review dynamic-execution pip/_vendor/pkg_resources/__init__.py:1713:20

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

                source = _read_utf8_with_fallback(script_filename)
                code = compile(source, script_filename, 'exec')
                exec(code, namespace, namespace)
            else:
    likely benign LLM, confidence 0.85 Compiles a distribution script file before executing it in a namespace.
    Reasoning

    This is part of the script runner, which compiles and runs a distribution's own script file in a namespace. That is its documented purpose, and the source comes from the installed distribution's metadata.

  120. info warn → info by review dynamic-execution pip/_vendor/pkg_resources/__init__.py:1714:13

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

                code = compile(source, script_filename, 'exec')
                exec(code, namespace, namespace)
            else:
                from linecache import cache
    likely benign LLM, confidence 0.85 Executes a distribution script's compiled code in a namespace.
    Reasoning

    This exec runs the script compiled just above, as part of the same legitimate run_script or entry-point mechanism that executes a distribution's declared script.

  121. info warn → info by review dynamic-execution pip/_vendor/pkg_resources/__init__.py:1724:27

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

                )
                script_code = compile(script_text, script_filename, 'exec')
                exec(script_code, namespace, namespace)
    likely benign LLM, confidence 0.85 Compiles script text from a distribution's loader for execution.
    Reasoning

    This is the linecache-based fallback in the same script runner, compiling a distribution's script text. It does not fetch anything from elsewhere.

  122. info warn → info by review dynamic-execution pip/_vendor/pkg_resources/__init__.py:1725:13

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

                script_code = compile(script_text, script_filename, 'exec')
                exec(script_code, namespace, namespace)
    
        def _has(self, path) -> bool:
    likely benign LLM, confidence 0.85 Executes a distribution's script text in a namespace.
    Reasoning

    This exec runs the script text compiled in the same fallback branch of the legitimate script runner, consistent with setuptools' documented behavior.

  123. info critical → info by review dynamic-import pip/_vendor/pkg_resources/__init__.py:2530:17

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

                if parent not in _namespace_packages:
                    __import__(parent)
                try:
                    path = sys.modules[parent].__path__
    likely benign LLM, confidence 0.85 Imports a parent namespace package to read its __path__.
    Reasoning

    This is the namespace-package fixup, which imports the parent package before reading its __path__. It is the standard mechanism for declared namespace packages.

  124. info critical → info by review dynamic-import pip/_vendor/pkg_resources/__init__.py:2751:18

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

            """
            module = __import__(self.module_name, fromlist=['__name__'], level=0)
            try:
                return functools.reduce(getattr, self.attrs, module)
    likely benign LLM, confidence 0.85 Imports an entry point's module by its configured name.
    Reasoning

    This is EntryPoint.resolve, which imports the entry point's module by its configured name and then walks its attributes. This is the normal entry-point loading path.

  125. info critical → info by review frame-introspection pip/_vendor/pkg_resources/__init__.py:3411:15

    `sys._getframe` — call-stack frame introspection — file also calls `sys.exit`/`exec`/`eval` (anti-analysis shape) (ast pass, confidence 0.85)

            # the pkg_resources module, to use for the warning
            while sys._getframe(level).f_globals is g:
                level += 1
        except ValueError:
    likely benign LLM, confidence 0.90 Stack walk in pkg_resources to find the caller for a deprecation warning.
    Reasoning

    sys._getframe is used to walk outward until the caller's globals differ from the module's, so the warning gets the correct stacklevel. This is a standard, well-known idiom in packaging code. The nearby sys.exit/exec/eval mention is only a file-level co-occurrence and does not make this frame walk anti-analysis.

  126. info critical → info by review dynamic-import pip/_vendor/pygments/formatters/__init__.py:38:11

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

        """Load a formatter (and all others in the module too)."""
        mod = __import__(module_name, None, None, ['__all__'])
        for formatter_name in mod.__all__:
            cls = getattr(mod, formatter_name)
    likely benign LLM, confidence 0.93 Dynamic import of a built-in Pygments formatter module by name.
    Reasoning

    __import__ loads a formatter module by name from the package's own built-in formatter list. The name comes from the library's internal mapping, not untrusted input, which is the normal plugin-loading pattern in Pygments.

  127. info warn → info by review dynamic-execution pip/_vendor/pygments/formatters/__init__.py:103:13

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

            with open(filename, 'rb') as f:
                exec(f.read(), custom_namespace)
            # Retrieve the class `formattername` from that namespace
            if formattername not in custom_namespace:
    likely benign LLM, confidence 0.85 exec of a user-specified custom formatter source file.
    Reasoning

    exec runs a user-supplied custom formatter file in a namespace, which is a documented Pygments feature for loading custom formatters from a file path the caller provides. It is not a hidden payload, and the caller already controls the file.

  128. info critical → info by review dynamic-import pip/_vendor/pygments/lexers/__init__.py:45:11

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

        """Load a lexer (and all others in the module too)."""
        mod = __import__(module_name, None, None, ['__all__'])
        for lexer_name in mod.__all__:
            cls = getattr(mod, lexer_name)
    likely benign LLM, confidence 0.93 Dynamic import of a built-in Pygments lexer module by name.
    Reasoning

    Same built-in lexer-module loading pattern: __import__ on an internal module name, followed by iterating __all__ to fetch lexer classes.

  129. info warn → info by review dynamic-execution pip/_vendor/pygments/lexers/__init__.py:154:13

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

            with open(filename, 'rb') as f:
                exec(f.read(), custom_namespace)
            # Retrieve the class `lexername` from that namespace
            if lexername not in custom_namespace:
    likely benign LLM, confidence 0.85 exec of a user-specified custom lexer source file.
    Reasoning

    exec of a user-supplied custom lexer file in a namespace, a documented Pygments mechanism for loading custom lexers from a file the caller specifies.

  130. info critical → info by review dynamic-import pip/_vendor/pygments/sphinxext.py:161:19

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

                module = data[0]
                mod = __import__(module, None, None, [classname])
                self.filenames.add(mod.__file__)
                cls = getattr(mod, classname)
    likely benign LLM, confidence 0.92 Sphinx extension dynamically imports a lexer module from its registry.
    Reasoning

    Sphinx extension imports a module named in the documentation's lexer registry to read its __file__ and class. This is ordinary doc-tool plugin loading.

  131. info critical → info by review dynamic-import pip/_vendor/pygments/sphinxext.py:221:19

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

                module = data[0]
                mod = __import__(module, None, None, [classname])
                self.filenames.add(mod.__file__)
                cls = getattr(mod, classname)
    likely benign LLM, confidence 0.92 Sphinx extension dynamically imports a lexer module from its registry.
    Reasoning

    Same Sphinx lexer-registry import pattern as the other occurrence in this file.

  132. info critical → info by review dynamic-import pip/_vendor/pygments/styles/__init__.py:45:15

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

        try:
            mod = __import__(mod, None, None, [cls])
        except ImportError:
            raise ClassNotFound(f"Could not find style module {mod!r}" +
    likely benign LLM, confidence 0.93 Dynamic import of a Pygments style module by name.
    Reasoning

    Loads a Pygments style module by name, with ImportError converted to ClassNotFound. This is standard style lookup logic.

  133. compression ratio 0.629 is >2σ above file mean 0.384 (raw pass, confidence 0.50)

    
    Sc = '$\xa2-\xa5\u058f\u060b\u07fe-\u07ff\u09f2-\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20bf\ua838\ufdfc\ufe69\uff04\uffe0-\uffe1\uffe5-\uffe6\U0001ecb0'
  134. info warn → info by review dynamic-attribute pip/_vendor/pygments/unistring.py:83:20

    reach-by-name through `globals` (ast pass, confidence 0.60)

    def combine(*args):
        return ''.join(globals()[cat] for cat in args)
    likely benign LLM, confidence 0.90 Joins Unicode category strings looked up by name from module globals.
    Reasoning

    globals() is used to look up Unicode character-class strings by category name in the module's own constants. The lookup is internal and the inputs are not attacker-controlled.

  135. info warn → info by review dynamic-attribute pip/_vendor/pygments/unistring.py:90:20

    reach-by-name through `globals` (ast pass, confidence 0.60)

            newcats.remove(arg)
        return ''.join(globals()[cat] for cat in newcats)
    likely benign LLM, confidence 0.90 Builds Unicode character class strings from module globals by name.
    Reasoning

    Same internal globals() lookup of Unicode category constants, used to build regex character classes.

  136. info warn → info by review dynamic-execution pip/_vendor/pygments/unistring.py:115:10

    `open(__file__)` — file reads its own source, common pattern for extracting payloads hidden in comments (ast pass, confidence 0.85)

    
        with open(__file__, encoding='utf-8') as fp:
            content = fp.read()
    likely benign LLM, confidence 0.80 Reads the module's own source file to process Unicode table content.
    Reasoning

    The module reads its own source to parse the Unicode data tables. This is a generator or maintenance-style routine for character tables, not a payload extractor. Reading __file__ is unusual for runtime code, but nothing here decodes or executes content.

  137. info warn → info by review dynamic-execution pip/_vendor/pygments/unistring.py:139:10

    `open(__file__)` — file reads its own source, common pattern for extracting payloads hidden in comments (ast pass, confidence 0.85)

    
        with open(__file__, 'w', encoding='utf-8') as fp:
            fp.write(header)
    likely benign LLM, confidence 0.80 Writes a generated header into the module's own source file.
    Reasoning

    The module rewrites its own source with a generated header. That is self-modifying-looking, but it is consistent with a table-regeneration script that writes Unicode data back into the source, and the snippet shows only a plain text write of a header, with no payload or execution.

  138. info warn → info by review dynamic-attribute pip/_vendor/pyproject_hooks/_in_process/_in_process.py:367:12

    reach-by-name through `globals` (ast pass, confidence 0.60)

    
        hook = globals()[hook_name]
    
        hook_input = read_json(pjoin(control_dir, "input.json"))
    likely benign LLM, confidence 0.90 Dispatches a PEP 517 build hook by name from module globals.
    Reasoning

    The build-hook name is looked up in globals and called as the PEP 517 hook dispatcher. The names come from a fixed set of hook functions defined in this module, which is the expected design.

  139. info warn → info by review dynamic-attribute pip/_vendor/requests/packages.py:10:5

    reach-by-name through `locals` (ast pass, confidence 0.60)

        vendored_package = "pip._vendor." + package
        locals()[package] = __import__(vendored_package)
        # This traversal is apparently necessary such that the identities are
        # preserved (requests.packages.urllib3.* is urllib3.*)
    likely benign LLM, confidence 0.90 Aliases vendored pip._vendor packages into the requests namespace.
    Reasoning

    requests aliases vendored packages such as urllib3 and chardet into its own namespace via locals() and __import__, a documented compatibility shim. The package name comes from a fixed list.

  140. info critical → info by review dynamic-import pip/_vendor/requests/packages.py:10:25

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

        vendored_package = "pip._vendor." + package
        locals()[package] = __import__(vendored_package)
        # This traversal is apparently necessary such that the identities are
        # preserved (requests.packages.urllib3.* is urllib3.*)
    likely benign LLM, confidence 0.93 Vendored-package alias shim in requests.packages that dynamically imports pip._vendor submodules.
    Reasoning

    This is the well-known requests.packages shim that aliases vendored modules (urllib3, chardet, idna) under the historical top-level names. The dynamic __import__ takes a name built from a fixed list of package names, not attacker input, and the locals() assignment is the documented mechanism to preserve module identity. Benign.

  141. info warn → info by review frame-introspection pip/_vendor/rich/console.py:1929:26

    `inspect.stack` — call-stack frame introspection (ast pass, confidence 0.70)

                # Fallback to the slower stack
                frame_info = inspect.stack()[offset]
                return frame_info.filename, frame_info.lineno, frame_info.frame.f_locals
    dismissed LLM, confidence 0.95 Fallback caller-frame lookup in rich's Console for locating the calling file and line.
    Reasoning

    rich uses inspect.stack() as a slower fallback to locate the caller's filename and line for logging/printing. Frame introspection like this is common in logging and output libraries and does nothing malicious here.

  142. info critical → info by review builtins-write pip/_vendor/rich/pretty.py:204:13

    `builtins._ = ...` — patches a built-in for every importer of this module (ast pass, confidence 0.95)

                assert console is not None
                builtins._ = None  # type: ignore[attr-defined]
                console.print(
                    (
    likely benign LLM, confidence 0.90 Temporary assignment to builtins._ mirroring the REPL last-value convention during pretty printing.
    Reasoning

    rich's pretty printer temporarily sets builtins._ to None and then to the value, mirroring the interactive REPL's last-result convention so that `_` works in the pretty-print context. It is a known, deliberate pattern in rich's pretty module, restored/managed within the function, not a persistent backdoor.

  143. info critical → info by review builtins-write pip/_vendor/rich/pretty.py:221:13

    `builtins._ = ...` — patches a built-in for every importer of this module (ast pass, confidence 0.95)

                )
                builtins._ = value  # type: ignore[attr-defined]
    
        try:
    likely benign LLM, confidence 0.90 Sets builtins._ to the pretty-printed value, matching REPL last-result behavior.
    Reasoning

    Same pattern as the companion finding: rich sets builtins._ to the printed value so the REPL-style underscore refers to the last displayed object. Deliberate library behavior with a clear purpose, not malicious persistence.

  144. info warn → info by review decoder-decompress-payload pip/_vendor/urllib3/response.py:65:21

    file imports decoder module(s) zlib and calls `.decompress()` — embedded payload decompressed at runtime (ast pass, confidence 0.75)

            self._unfed_data = b""
            self._obj = zlib.decompressobj()
    
        def decompress(self, data: bytes, max_length: int = -1) -> bytes:
    likely benign LLM, confidence 0.80 Streaming zlib decompressor used by urllib3 to decode HTTP response content encodings.
    Reasoning

    zlib.decompressobj is the standard streaming decompressor used by urllib3 to decode gzip/deflate HTTP response bodies. The decompressed data is network content being decoded per HTTP content-encoding, not an embedded payload executed at runtime. Benign library code.

Reproduce This Scan

Run disclude locally to verify. These commands scan the published file; the "new in this release" marks come from comparing it with the previous release's file, which they don't repeat. 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.3.0
curl -fsSL -o pip-26.2.2-py3-none-any.whl https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl
printf '%s  %s\n' fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70 pip-26.2.2-py3-none-any.whl | shasum -a 256 -c -
unzip -q pip-26.2.2-py3-none-any.whl -d pkg
disclude scan --untrusted --severity info pkg