Description
PDM is a Python package and dependency manager. In versions up to and including 2.26.9, PDM automatically loads project-local plugins from a .pdm-plugins directory during initialization, allowing an attacker-controlled file in an untrusted repository checkout to execute arbitrary Python code before any command is parsed. This happens because load_plugins() runs during Core.init() and adds .pdm-plugins via site.addsitedir(), which processes .pth files and immediately executes any line beginning with import, so the code runs with the privileges of the user invoking pdm and even a benign command such as pdm --version triggers it (making the impact strongest in CI, automation, and privileged contexts). The issue is fixed in version 2.27.0.
Published: 2026-08-04
Score: 8.4 High
EPSS: n/a
KEV: No
Impact: n/a
Action: n/a
AI Analysis

Impact

PDM automatically loads project‑local plugins from a .pdm-plugins directory during initialization. Until version 2.26.9, the load_plugins() routine runs inside Core.init() and adds the directory via site.addsitedir(), which processes .pth files and immediately executes any line starting with an import statement. Consequently, an attacker‑controlled file in an untrusted repository can execute arbitrary Python code with the privileges of the user running pdm, even when invoking a benign command such as pdm --version. The weakness is a form of code injection (CWE‑94) combined with missing access control (CWE‑829), allowing this exploit to occur before any command is parsed.

Affected Systems

The vulnerability affects the PDM Python package and dependency manager distributed by pdm‑project. All releases up to and including 2.26.9 are impacted. The problem was addressed in release 2.27.0, which removes automatic loading of project‑local plugins prior to command parsing.

Risk and Exploitability

The CVSS score of 8.4 indicates a high‑severity impact, and the issue is not listed in the CISA KEV catalog. Based on the description, the likely attack vector is a user or CI environment that can supply a malicious project repository; the plugin code runs with the invoking user’s rights whenever any pdm command is executed. A successful exploitation leads to arbitrary code execution at the user level, potentially compromising CI pipelines, automation scripts, or any privileged context in which pdm is run.

Generated by OpenCVE AI on August 4, 2026 at 20:45 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Upgrade to pdm 2.27.0 or later, which removes the vulnerable plugin loading behavior.
  • If an upgrade is not immediately possible, delete or relocate any .pdm-plugins directories from the project source before running pdm to prevent execution of injected code.
  • Run pdm in an environment with the least required privileges and validate all dependencies from trusted sources to reduce the risk that a malicious plugin is introduced.

Generated by OpenCVE AI on August 4, 2026 at 20:45 UTC.

Tracking

Sign in to view the affected projects.

Advisories
Source ID Title
Github GHSA Github GHSA GHSA-qq6c-99pv-prvf PDM: Project-Controlled `.pdm-plugins` Content Executes Before CLI Parsing
History

Tue, 04 Aug 2026 19:00:00 +0000

Type Values Removed Values Added
Description PDM is a Python package and dependency manager. In versions up to and including 2.26.9, PDM automatically loads project-local plugins from a .pdm-plugins directory during initialization, allowing an attacker-controlled file in an untrusted repository checkout to execute arbitrary Python code before any command is parsed. This happens because load_plugins() runs during Core.init() and adds .pdm-plugins via site.addsitedir(), which processes .pth files and immediately executes any line beginning with import, so the code runs with the privileges of the user invoking pdm and even a benign command such as pdm --version triggers it (making the impact strongest in CI, automation, and privileged contexts). The issue is fixed in version 2.27.0.
Title pdm: Project-Controlled `.pdm-plugins` Content Executes Before CLI Parsing
Weaknesses CWE-829
CWE-94
References
Metrics cvssV4_0

{'score': 8.4, 'vector': 'CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N'}


Subscriptions

No data.

cve-icon MITRE

Status: PUBLISHED

Assigner: GitHub_M

Published:

Updated: 2026-08-04T18:42:23.036Z

Reserved: 2026-05-19T22:36:16.883Z

Link: CVE-2026-47781

cve-icon Vulnrichment

No data.

cve-icon NVD

No data.

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-08-04T21:00:11Z

Weaknesses
  • CWE-829

    Inclusion of Functionality from Untrusted Control Sphere

  • CWE-94

    Improper Control of Generation of Code ('Code Injection')