PyPI / psutil / 7.2.2

psutil 7.2.2

Source
https://github.com/giampaolo/psutil
Tag scanned
v7.2.2
Compared with
v7.2.1 (1 signals introduced since)
Files
188 scanned, 24 skipped (binary, oversized, or unrecognised)
Signals
0 critical · 0 warn · 26 info
Scan time
7.0 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:26

Signals

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

  1. info dynamic-execution scripts/internal/install-sysdeps.sh:50:9 new in this release

    command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

            $SUDO yum install -y python3-devel gcc
            $SUDO yum install -y net-tools coreutils-single util-linux sudo procps-ng  # for tests
        elif [ $HAS_PACMAN ]; then
            $SUDO pacman -S --noconfirm python gcc
  2. info whitespace-anomaly docs/_static/sidebar.js:24:1

    file mixes tab and space indentation (1 tab-indented and 123 space-indented lines) (raw pass, confidence 0.40)

    $(function() {
      // global elements used by the functions.
      // the 'sidebarbutton' element is defined as global after its
      // creation, in the add_sidebar_button function
  3. info warn → info by review long-line docs/index.rst:1227:1

    line length 2954 characters (raw pass, confidence 0.65)

        {'LC_NUMERIC': 'it_IT.UTF-8', 'QT_QPA_PLATFORMTHEME': 'appmenu-qt5', 'IM_CONFIG_PHASE': '1', 'XDG_GREETER_DATA_DIR': '/var/lib/lightdm-data/giampaolo', 'XDG_CURRENT_DESKTOP': 'Unity', 'UPSTART_EVENTS': 'started starting', 'GNOME_KEYRING_PID': '', 'XDG_VTNR': '7', 'QT_IM_MODULE': 'ibus', 'LOGNAME': 'giampaolo', 'USE
    likely benign LLM, confidence 0.97 A very long line in psutil documentation showing a captured environment dictionary example.
    Reasoning

    Raw long-line finding in RST docs containing an environment variable dump example. No obfuscation or malicious intent; long lines in documentation are common.

  4. info long-line docs/index.rst:1260:1

    line length 513 characters (raw pass, confidence 0.50)

        ``'cmdline'``, ``'net_connections'``, ``'cpu_affinity'``, ``'cpu_num'``, ``'cpu_percent'``, ``'cpu_times'``, ``'create_time'``, ``'cwd'``, ``'environ'``, ``'exe'``, ``'gids'``, ``'io_counters'``, ``'ionice'``, ``'memory_full_info'``, ``'memory_info'``, ``'memory_maps'``, ``'memory_percent'``, ``'name'``, ``'nice'``
  5. info warn → info by review frame-introspection psutil/_common.py:851:13

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

            fname, lineno, _, _lines, _index = inspect.getframeinfo(
                inspect.currentframe().f_back
            )
            if isinstance(msg, Exception):
    likely benign LLM, confidence 0.92 Uses call-stack introspection to report the caller's filename and line number in psutil's common utilities.
    Reasoning

    inspect.currentframe().f_back is used to find the caller's file and line for error reporting in a library warning/exception helper. This is a standard, legitimate debugging/logging idiom.

  6. info warn → info by review dynamic-execution scripts/cpu_distribution.py:55:9

    `os.system` called with a literal shell command (ast pass, confidence 0.70)

        if psutil.POSIX:
            os.system('clear')
        else:
            os.system('cls')
    likely benign LLM, confidence 0.95 Clears the terminal using a platform-specific literal shell command in a helper script.
    Reasoning

    os.system with hardcoded 'clear' or 'cls' chosen by platform in a developer script. Literal commands with no external input; benign.

  7. info warn → info by review dynamic-execution scripts/cpu_distribution.py:57:9

    `os.system` called with a literal shell command (ast pass, confidence 0.70)

        else:
            os.system('cls')
    likely benign LLM, confidence 0.95 Runs the Windows 'cls' command to clear the terminal in a developer script.
    Reasoning

    Same pattern as the sibling finding: a literal 'cls' command in the Windows branch of a terminal-clearing helper. No untrusted input is involved.

  8. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

        if [ $HAS_APT ]; then
            $SUDO apt-get install -y python3-dev gcc
            $SUDO apt-get install -y net-tools coreutils util-linux sudo  # for tests
        elif [ $HAS_YUM ]; then
  9. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

            $SUDO apt-get install -y python3-dev gcc
            $SUDO apt-get install -y net-tools coreutils util-linux sudo  # for tests
        elif [ $HAS_YUM ]; then
            $SUDO yum install -y python3-devel gcc
  10. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

        elif [ $HAS_YUM ]; then
            $SUDO yum install -y python3-devel gcc
            $SUDO yum install -y net-tools coreutils-single util-linux sudo procps-ng  # for tests
        elif [ $HAS_PACMAN ]; then
  11. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

        elif [ $HAS_PACMAN ]; then
            $SUDO pacman -S --noconfirm python gcc
            $SUDO pacman -S --noconfirm net-tools coreutils util-linux sudo  # for tests
        elif [ $HAS_APK ]; then
  12. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

            $SUDO pacman -S --noconfirm python gcc
            $SUDO pacman -S --noconfirm net-tools coreutils util-linux sudo  # for tests
        elif [ $HAS_APK ]; then
            $SUDO apk add --no-interactive python3-dev gcc musl-dev linux-headers
  13. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

        elif [ $HAS_APK ]; then
            $SUDO apk add --no-interactive python3-dev gcc musl-dev linux-headers
            $SUDO apk add --no-interactive coreutils util-linux procps  # for tests
        elif [ $FREEBSD ]; then
  14. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

            $SUDO apk add --no-interactive python3-dev gcc musl-dev linux-headers
            $SUDO apk add --no-interactive coreutils util-linux procps  # for tests
        elif [ $FREEBSD ]; then
            $SUDO pkg install -y python3 gcc
  15. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

        elif [ $FREEBSD ]; then
            $SUDO pkg install -y python3 gcc
        elif [ $NETBSD ]; then
            $SUDO /usr/sbin/pkg_add -v pkgin
  16. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

        elif [ $NETBSD ]; then
            $SUDO /usr/sbin/pkg_add -v pkgin
            $SUDO pkgin update
            $SUDO pkgin -y install python311-* gcc12-*
  17. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

            $SUDO /usr/sbin/pkg_add -v pkgin
            $SUDO pkgin update
            $SUDO pkgin -y install python311-* gcc12-*
        elif [ $OPENBSD ]; then
  18. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

            $SUDO pkgin update
            $SUDO pkgin -y install python311-* gcc12-*
        elif [ $OPENBSD ]; then
            $SUDO pkg_add gcc python3
  19. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

        elif [ $OPENBSD ]; then
            $SUDO pkg_add gcc python3
        elif [ $SUNOS ]; then
            $SUDO pkg install developer/gcc
  20. command name is a variable (`$SUDO`) that this file sets only to plain text (ast pass, confidence 0.40)

        elif [ $SUNOS ]; then
            $SUDO pkg install developer/gcc
        else
            echo "Unsupported platform '$UNAME_S'. Ignoring."
  21. info warn → info by review dynamic-execution scripts/internal/install_pip.py:42:16

    `os.system` called with a literal shell command (ast pass, confidence 0.70)

    
            code = os.system(
                f"{sys.executable} {f.name} --user --upgrade"
                " --break-system-packages"
    likely benign LLM, confidence 0.90 Runs a pip upgrade via os.system using the current Python interpreter and a temporary script file.
    Reasoning

    os.system runs sys.executable with a temp file name to install pip with --user and --upgrade. The command is built from interpreter and temp file paths, not remote input. It is a legitimate bootstrap step, though shell string building is worth a minor note.

  22. info warn → info by review dynamic-execution tests/test_connections.py:363:21

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

            tcp4_proc = self.pyrun(tcp4_template)
            tcp4_addr = eval(wait_for_file(testfile, delete=True))
            udp4_proc = self.pyrun(udp4_template)
            udp4_addr = eval(wait_for_file(testfile, delete=True))
    likely benign LLM, confidence 0.85 Evaluates the address tuple written by a child test process to a temporary file.
    Reasoning

    eval on output read from a test-generated temp file containing a Python address tuple. Test-only code; the eval is unsafe in general but the input is produced locally by the test's own subprocess.

  23. info warn → info by review dynamic-execution tests/test_connections.py:365:21

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

            udp4_proc = self.pyrun(udp4_template)
            udp4_addr = eval(wait_for_file(testfile, delete=True))
            if supports_ipv6():
                tcp6_proc = self.pyrun(tcp6_template)
    likely benign LLM, confidence 0.85 Evaluates the UDP IPv4 address tuple written by a child test process.
    Reasoning

    Same test-only eval of locally generated address data read from a temp file. Not a malicious pattern.

  24. info warn → info by review dynamic-execution tests/test_connections.py:368:25

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

                tcp6_proc = self.pyrun(tcp6_template)
                tcp6_addr = eval(wait_for_file(testfile, delete=True))
                udp6_proc = self.pyrun(udp6_template)
                udp6_addr = eval(wait_for_file(testfile, delete=True))
    likely benign LLM, confidence 0.85 Evaluates the TCP IPv6 address tuple written by a child test process.
    Reasoning

    Same test-only eval pattern for IPv6 TCP address data produced by the test harness.

  25. info warn → info by review dynamic-execution tests/test_connections.py:370:25

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

                udp6_proc = self.pyrun(udp6_template)
                udp6_addr = eval(wait_for_file(testfile, delete=True))
            else:
                tcp6_proc = None
    likely benign LLM, confidence 0.85 Evaluates the UDP IPv6 address tuple written by a child test process.
    Reasoning

    Same test-only eval pattern for IPv6 UDP address data produced by the test harness.

  26. info critical → info by review dynamic-import tests/test_misc.py:210:21

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

                    try:
                        __import__(name)
                    except ImportError:
                        if name not in psutil.__all__:
    likely benign LLM, confidence 0.80 Dynamically imports a module name inside a test to check for optional dependencies.
    Reasoning

    Critical severity is overstated: __import__(name) inside a try/except ImportError in a test checking optional module availability and psutil.__all__. The dynamic name comes from a test-controlled list, so this is a normal idiom rather than a dropper.

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/giampaolo/psutil psutil && cd psutil
git checkout v7.2.2
disclude scan --severity info --diff v7.2.1 .