CVE-2023-45805
Trojan Lockfilein pdm
pdm is a Python package and dependency manager supporting the latest PEP standards. It'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. A project 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 and the filename must be a prefix of the project name, but it's not verified to match the version being installed. Version 2-2 is also not a valid normalized version per PEP 440. Matching the project name exactly (not just prefix) would fix the issue. When 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. This issue has been addressed in commit 6853e2642df which is included in release version 2.9.4. Users are advised to upgrade. There are no known workarounds for this vulnerability.
Attack profile
How easy it is to exploit
- Attack vector
- Local
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Required
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
7.8
Trojan Lockfilein pdm
pdm is a Python package and dependency manager supporting the latest PEP standards. It'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. A project 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 and the filename must be a prefix of the project name, but it's not verified to match the version being installed. Version 2-2 is also not a valid normalized version per PEP 440. Matching the project name exactly (not just prefix) would fix the issue. When 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. This issue has been addressed in commit 6853e2642df which is included in release version 2.9.4. Users are advised to upgrade. There are no known workarounds for this vulnerability.
- Record
CVE-2023-45805- CVSS 3.1
- 7.8 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H - Weakness
- CWE-20
- Updated
- 2026-11-02
EUVDEUVD-2023-2755
7.8
pdm is a Python package and dependency manager supporting the latest PEP standards. It'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. A project 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 and the filename must be a prefix of the project name, but it's not verified to match the version being installed. Version 2-2 is also not a valid normalized version per PEP 440. Matching the project name exactly (not just prefix) would fix the issue. When 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. This issue has been addressed in commit 6853e2642df which is included in release version 2.9.4. Users are advised to upgrade. There are no known workarounds for this vulnerability.
- Record
EUVD-2023-2755- CVSS 3.1
- 7.8 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H - Updated
- 2026-11-03
GitHub AdvisoriesGHSA-j44v-mmf2-xvm9
7.8
PDM Trojan Lockfile
Summary
It'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.
Details
Project 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 (and the filename must be a prefix of the project name), but it's not verified to match the version being installed. (Version 2-2 is also not a valid normalized version per PEP 440.)
Matching the project name exactly (not just prefix) would fix the issue. The version should also be verified to avoid version downgrade attacks.
PoC
Example pdm.lock snippet to appear to depend on foo but actually install foo-2
"foo 2.2.0" = [
url = "https://files.pythonhosted.org/.../foo-2-2.tar.gz
]
Impact
When 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.
- Record
GHSA-j44v-mmf2-xvm9- CVSS 3.1
- 7.8 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H - Weakness
- CWE-20
- Updated
- 2026-11-02
NVD
7.8
pdm is a Python package and dependency manager supporting the latest PEP standards. It'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. A project 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 and the filename must be a prefix of the project name, but it's not verified to match the version being installed. Version 2-2 is also not a valid normalized version per PEP 440. Matching the project name exactly (not just prefix) would fix the issue. When 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. This issue has been addressed in commit 6853e2642df which is included in release version 2.9.4. Users are advised to upgrade. There are no known workarounds for this vulnerability.
- Record
CVE-2023-45805- CVSS 3.1
- 7.8 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H - Weakness
- CWE-20
- Updated
- 2026-11-02
OSV
7.8
Trojan Lockfilein pdm
pdm is a Python package and dependency manager supporting the latest PEP standards. It'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. A project 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 and the filename must be a prefix of the project name, but it's not verified to match the version being installed. Version 2-2 is also not a valid normalized version per PEP 440. Matching the project name exactly (not just prefix) would fix the issue. When 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. This issue has been addressed in commit 6853e2642df which is included in release version 2.9.4. Users are advised to upgrade. There are no known workarounds for this vulnerability.
- Record
CVE-2023-45805- CVSS 3.1
- 7.8 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H - Weakness
- CWE-20
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2023-45805
7.8
pdm is a Python package and dependency manager supporting the latest PEP standards. It'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. A project 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 and the filename must be a prefix of the project name, but it's not verified to match the version being installed. Version 2-2 is also not a valid normalized version per PEP 440. Matching the project name exactly (not just prefix) would fix the issue. When 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. This issue has been addressed in commit 6853e2642df which is included in release version 2.9.4. Users are advised to upgrade. There are no known workarounds for this vulnerability.
- Record
DEBIAN-CVE-2023-45805- CVSS 3.1
- 7.8 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
Show 5 moreShow less
OSVGHSA-j44v-mmf2-xvm9
7.8
PDM Trojan Lockfile
Summary
It'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.
Details
Project 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 (and the filename must be a prefix of the project name), but it's not verified to match the version being installed. (Version 2-2 is also not a valid normalized version per PEP 440.)
Matching the project name exactly (not just prefix) would fix the issue. The version should also be verified to avoid version downgrade attacks.
PoC
Example pdm.lock snippet to appear to depend on foo but actually install foo-2
"foo 2.2.0" = [
url = "https://files.pythonhosted.org/.../foo-2-2.tar.gz
]
Impact
When 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.
- Record
GHSA-j44v-mmf2-xvm9- CVSS 3.1
- 7.8 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H - Weakness
- CWE-20
- Updated
- 2026-11-02
OSVPYSEC-2026-1763
7.8
PDM Trojan Lockfile
Summary
It'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.
Details
Project 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 (and the filename must be a prefix of the project name), but it's not verified to match the version being installed. (Version 2-2 is also not a valid normalized version per PEP 440.)
Matching the project name exactly (not just prefix) would fix the issue. The version should also be verified to avoid version downgrade attacks.
PoC
Example pdm.lock snippet to appear to depend on foo but actually install foo-2
"foo 2.2.0" = [
url = "https://files.pythonhosted.org/.../foo-2-2.tar.gz
]
Impact
When 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.
- Record
PYSEC-2026-1763- CVSS 3.1
- 7.8 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
OSVUBUNTU-CVE-2023-45805
7.8
pdm is a Python package and dependency manager supporting the latest PEP standards. It'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. A project 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 and the filename must be a prefix of the project name, but it's not verified to match the version being installed. Version 2-2 is also not a valid normalized version per PEP 440. Matching the project name exactly (not just prefix) would fix the issue. When 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. This issue has been addressed in commit 6853e2642df which is included in release version 2.9.4. Users are advised to upgrade. There are no known workarounds for this vulnerability.
- Record
UBUNTU-CVE-2023-45805- CVSS 3.1
- 7.8 High
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
OSVopenSUSE-SU-2024:13352-1 No score
python310-unearth-0.12.0-1.1 on GA media
These are all security issues fixed in the python310-unearth-0.12.0-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2024:13352-1- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:11541-1 No score
python313-unearth-0.18.3-1.1 on GA media
These are all security issues fixed in the python313-unearth-0.18.3-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:11541-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
pdmPyPI |
through 2.9.3 | None known |
pdmDebian:12 |
All versions, plus listed versions 2.2.1+ds1-12.2.1+ds1-22.20.0.post1+ds1-12.20.0.post1+ds1-22.20.1+ds1-1 Show 13 moreShow less2.20.1+ds1-22.23.1-12.23.1-22.23.1-32.23.1-42.26.2-12.26.6-12.27.0-12.28.0-12.28.1-12.29.0-12.29.2-12.29.3-1 |
None known |
pdmDebian:13 |
before 2.20.0.post1+ds1-1 | 2.20.0.post1+ds1-1 |
pdmDebian:14 |
before 2.20.0.post1+ds1-1 | 2.20.0.post1+ds1-1 |
pdmPyPI |
through 2.9.3, plus listed versions 0.0.00.0.10.0.30.0.40.0.5 Show 45 moreShow less0.0.60.1.00.1.10.1.20.10.00.10.10.10.20.11.00.12.00.12.10.12.20.12.30.2.00.2.10.2.20.2.30.2.40.2.50.2.60.3.00.3.10.3.20.4.00.4.10.4.20.5.00.6.00.6.10.6.20.6.30.6.40.6.50.7.00.7.10.8.00.8.10.8.20.8.30.8.40.8.50.8.60.8.70.9.00.9.10.9.2 |
None known |
pdmPyPI |
before 2.10.0, plus listed versions 0.0.00.0.10.0.30.0.40.0.5 Show 45 moreShow less0.0.60.1.00.1.10.1.20.10.00.10.10.10.20.11.00.12.00.12.10.12.20.12.30.2.00.2.10.2.20.2.30.2.40.2.50.2.60.3.00.3.10.3.20.4.00.4.10.4.20.5.00.6.00.6.10.6.20.6.30.6.40.6.50.7.00.7.10.8.00.8.10.8.20.8.30.8.40.8.50.8.60.8.70.9.00.9.10.9.2 |
2.10.0 |
pdmUbuntu:25.10 |
All versions, plus listed versions 2.20.1+ds1-2 |
None known |
pdmUbuntu:26.10 |
All versions, plus listed versions 2.23.1-42.27.0-12.28.0-12.28.1-1 |
None known |
pdmUbuntu:26.04:LTS |
All versions, plus listed versions 2.20.1+ds1-22.23.1-4 |
None known |
python-unearthopenSUSE:Tumbleweed From an advisory covering 2 CVEs |
before 0.18.3-1.1 | 0.18.3-1.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| aliases, published | EUVD | |
| first indexed | CVE List, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2023-45805 is a high vulnerability (CVSS 7.8) in Frostming Pdm, published October 20, 2023. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.45%, the 39th percentile. Fixed in pdm 2.20.0.post1+ds1-1.
References
github.com/pdm-project/pdm/security/advisories/GHSA-j44v-mmf2-xvm9
github.com/pdm-project/pdm/commit/6853e2642dfa281d4a9958fbc6c95b7e32d84831
github.com/frostming/unearth/blob/eca170d9370ac5032f2e497ee9b1b63823d3fe0f/src/unearth/evaluator.py
github.com/pdm-project/pdm/blob/45d1dfa47d4900c14a31b9bb761e4c46eb5c9442/src/pdm/models/candidates.py
peps.python.org/pep-0440
nvd.nist.gov/vuln/detail/CVE-2023-45805
Show 9 moreShow less
github.com/advisories/GHSA-j44v-mmf2-xvm9
github.com/CVEProject/cvelistV5/tree/main/cves/2023/45xxx/CVE-2023-45805.json
security-tracker.debian.org/tracker/CVE-2023-45805
github.com/pdm-project/pdm
pypi.org/project/pdm
ubuntu.com/security/CVE-2023-45805
cve.org/CVERecord?id=CVE-2023-45805
suse.com/security/cve/CVE-2023-45805
suse.com/security/cve/CVE-2026-73030
Left out here: 251 versions. The JSON record has them.