{"id":"CVE-2023-45805","aliases":["GHSA-j44v-mmf2-xvm9","PYSEC-2026-1763"],"title":"PDM Trojan Lockfile","summary":"PDM Trojan Lockfile","severity":"high","cvss":7.8,"cvssVector":"CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H","vendor":"pdm","product":"pdm","ecosystem":"pip","affected":["pdm <= 2.9.3"],"published":"2023-10-20","updated":"2026-07-07","source":"OSV","sourceUrl":"https://osv.dev/vulnerability/GHSA-j44v-mmf2-xvm9","references":[{"url":"https://github.com/pdm-project/pdm/security/advisories/GHSA-j44v-mmf2-xvm9"},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2023-45805"},{"url":"https://github.com/pdm-project/pdm/commit/6853e2642dfa281d4a9958fbc6c95b7e32d84831"},{"url":"https://github.com/frostming/unearth/blob/eca170d9370ac5032f2e497ee9b1b63823d3fe0f/src/unearth/evaluator.py#L215-L229"},{"url":"https://github.com/pdm-project/pdm"},{"url":"https://github.com/pdm-project/pdm/blob/45d1dfa47d4900c14a31b9bb761e4c46eb5c9442/src/pdm/models/candidates.py#L98-L99"},{"url":"https://peps.python.org/pep-0440/#post-release-spelling"}],"tags":["osv","pip"],"epss":0.00512,"epssPercentile":0.42621,"ingestedAt":"2026-07-08T18:25:50.564Z","slug":"CVE-2023-45805","body":"## Overview\n\n### Summary\nIt's possible to craft a malicious `pdm.lock` file that could allow e.g. an insider or a malicious open source project to appear to depend on a trusted PyPI project, but actually install another project.\n\n### Details\nProject `foo` can be targeted by creating the project `foo-2` and uploading the file `foo-2-2.tar.gz` to pypi.org. PyPI will see this as project `foo-2` version `2`, while PDM will see this as project `foo` version `2-2`. The version must only be [parseable as a version](https://github.com/frostming/unearth/blob/eca170d9370ac5032f2e497ee9b1b63823d3fe0f/src/unearth/evaluator.py#L215-L229) (and the filename must be a prefix of the project name), but it's [not verified to match the version being installed](https://github.com/pdm-project/pdm/blob/45d1dfa47d4900c14a31b9bb761e4c46eb5c9442/src/pdm/models/candidates.py#L98-L99). (Version `2-2` is also not a valid [normalized version per PEP 440](https://peps.python.org/pep-0440/#post-release-spelling).)\n\nMatching the project name exactly (not just prefix) would fix the issue. The version should also be verified to avoid version downgrade attacks.\n\n### PoC\nExample `pdm.lock` snippet to appear to depend on `foo` but actually install `foo-2`\n```\n\"foo 2.2.0\" = [\n  url = \"https://files.pythonhosted.org/.../foo-2-2.tar.gz\n]\n```\n\n### Impact\nWhen installing dependencies with PDM, what's actually installed could differ from what's listed in `pyproject.toml` (including arbitrary code execution on install). It could also be used for downgrade attacks by only changing the version.\n\n## Affected packages\n\n- `pdm <= 2.9.3`\n\n## Remediation\n\nRefer to the advisory for the patched release.","depth":"twilight","depthScore":43,"depthScoreParts":{"impact":42.9,"likelihood":0.1,"exploitation":0,"ransomware":0},"changes":[]}