CVE-2026-47763
📛 CVE Title
pdm: Project-Local State and Config Writes Follow Symlinks
Description
pdm is a Python package and dependency manager supporting the latest PEP standards. In versions prior to 2.27.0, pdm writes several project-local state or configuration files without symlink protection. If a malicious repository places those files as symlinks, local PDM operations can overwrite the symlink targets. This creates an arbitrary file clobber primitive relative to the privileges of the invoking user. Config.__init__() resolves the project-local pdm.toml path and _save_config() writes to the resolved target. If PROJECT_ROOT/pdm.toml is a symlink to another file, pdm config -l ... updates the target file instead of refusing the write. The same general problem exists for other project-local persistence paths that are written directly with no lstat / O_NOFOLLOW protection. For the pdm.toml PoC specifically, the target file must already contain parseable TOML. Otherwise the load step fails before the write path is reached. That parser constraint does not apply to the .pdm-python or .python-version sinks. This issue has been fixed in version 2.27.0.
Overview
- State
- PUBLISHED
- Assigner (CNA)
- GitHub_M
- CVSS severity
- MEDIUM
- CVSS score
- 6.8 / 10
- CVSS vector
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N- Effective score
- 6.8 / 10 MEDIUM source: CNA overview
- CWE(s)
-
CWE-61 - Reserved
- 2026-05-19
- Published
- 2026-08-04 17:29 UTC
- Last updated
- 2026-08-04 17:29 UTC
- Source
- https://raw.githubusercontent.com/CVEProject/cvelistV5/main/cves/2026/47xxx/CVE-2026-47763.json
Affected products (1)
| Vendor | Product | Versions | Platforms |
|---|---|---|---|
| pdm-project | pdm |
< 2.27.0 (affected)
|
— |
Vendor references (2)
References embedded in the original CVE record by the assigning CNA.
- https://github.com/pdm-project/pdm/security/advisories/GHSA-ghq2-5c67-fprm x_refsource_CONFIRM
- https://github.com/pdm-project/pdm/releases/tag/2.27.0 x_refsource_MISC
Web references (0)
DuckDuckGo results ranked by threat-intel / vendor advisory domains. Generated by the 🔎 Find references (web) button above — same flow as the Remediations search.
No web references attached yet.
AI Forensic Analysis
Only Available for Registered Users. Sign in to view.
Raw JSON
The full cvelistV5 record. Download as CVE-2026-47763.json.
{
"containers": {
"cna": {
"affected": [
{
"product": "pdm",
"vendor": "pdm-project",
"versions": [
{
"status": "affected",
"version": "< 2.27.0"
}
]
}
],
"descriptions": [
{
"lang": "en",
"value": "pdm is a Python package and dependency manager supporting the latest PEP standards. In versions prior to 2.27.0, pdm writes several project-local state or configuration files without symlink protection. If a malicious repository places those files as symlinks, local PDM operations can overwrite the symlink targets. This creates an arbitrary file clobber primitive relative to the privileges of the invoking user. Config.__init__() resolves the project-local pdm.toml path and _save_config() writes to the resolved target. If PROJECT_ROOT/pdm.toml is a symlink to another file, pdm config -l ... updates the target file instead of refusing the write.\nThe same general problem exists for other project-local persistence paths that are written directly with no lstat / O_NOFOLLOW protection. For the pdm.toml PoC specifically, the target file must already contain parseable TOML. Otherwise the load step fails before the write path is reached. That parser constraint does not apply to the .pdm-python or .python-version sinks. This issue has been fixed in version 2.27.0."
}
],
"metrics": [
{
"cvssV4_0": {
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "LOCAL",
"baseScore": 6.8,
"baseSeverity": "MEDIUM",
"privilegesRequired": "NONE",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "ACTIVE",
"vectorString": "CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "LOW",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH"
}
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-61",
"description": "CWE-61: UNIX Symbolic Link (Symlink) Following",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-08-04T17:29:41.188Z",
"orgId": "a0819718-46f1-4df5-94e2-005712e83aaa",
"shortName": "GitHub_M"
},
"references": [
{
"name": "https://github.com/pdm-project/pdm/security/advisories/GHSA-ghq2-5c67-fprm",
"tags": [
"x_refsource_CONFIRM"
],
"url": "https://github.com/pdm-project/pdm/security/advisories/GHSA-ghq2-5c67-fprm"
},
{
"name": "https://github.com/pdm-project/pdm/releases/tag/2.27.0",
"tags": [
"x_refsource_MISC"
],
"url": "https://github.com/pdm-project/pdm/releases/tag/2.27.0"
}
],
"source": {
"advisory": "GHSA-ghq2-5c67-fprm",
"discovery": "UNKNOWN"
},
"title": "pdm: Project-Local State and Config Writes Follow Symlinks"
}
},
"cveMetadata": {
"assignerOrgId": "a0819718-46f1-4df5-94e2-005712e83aaa",
"assignerShortName": "GitHub_M",
"cveId": "CVE-2026-47763",
"datePublished": "2026-08-04T17:29:41.188Z",
"dateReserved": "2026-05-19T22:36:16.881Z",
"dateUpdated": "2026-08-04T17:29:41.188Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}