{"id":"EUVD-2026-116370","revision":null,"records":[{"revision":"657ba4fc3bba460f95166087cdb176e9","observedAt":"2026-11-07T05:26:54.32+00:00","statement":{"source":"cve-program","id":"CVE-2026-64672","aliases":[],"title":"Terragrunt catalog predictable temp symlink clobber","description":"Terragrunt is a flexible orchestration tool that allows Infrastructure as Code written in OpenTofu or Terraform to scale. Prior to 1.1.1, the terragrunt catalog command derives a predictable per-repository catalog clone root under the shared system temporary directory and follows a symlink already placed at that path. A local attacker who can write to the temporary directory and predict the cataloged repository can redirect cleanup and cloning outside the intended root, causing an existing repository-named directory to be deleted and replaced in the victim's security context. The attack requires the victim to run terragrunt catalog on a shared host while the symlink is present, and it is not remotely exploitable. This issue is fixed in version 1.1.1.","state":0,"publishedAt":"2026-11-03T20:44:04.616+00:00","modifiedAt":"2026-11-07T03:32:17.916+00:00","affected":[{"ecosystem":"Vendor product","name":"terragrunt","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"gruntwork-io\",\n                    \"product\": \"terragrunt\",\n                    \"versions\": [\n                        {\n                            \"version\": \"< 1.1.1\",\n                            \"status\": \"affected\"\n                        }\n                    ]\n                }"}],"metrics":[{"system":"CVSS 4.0","vector":"CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:P/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N","score":4.4,"severity":"MEDIUM"}],"references":["https://github.com/gruntwork-io/terragrunt/security/advisories/GHSA-wv6g-x823-wx9m","https://github.com/gruntwork-io/terragrunt/pull/6438","https://github.com/gruntwork-io/terragrunt/commit/668891c5a2ad2996f134bb8b00098754674ea94a","https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.1"],"sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-64672","license":"CVE Program Terms of Use","key":"cve-program:CVE-2026-64672","identifiers":["CVE-2026-64672"]},"retained":false,"historicalAffected":[]},{"revision":"f2e35bcac0184a5f894aafb51b95c452","observedAt":"2026-11-07T13:31:10.216+00:00","statement":{"source":"euvd","id":"EUVD-2026-116370","aliases":["CVE-2026-64672","GHSA-wv6g-x823-wx9m"],"title":"Terragrunt is a flexible orchestration tool that allows Infrastructure as Code written in OpenTofu or Terraform to scale. Prior to 1.1.1, the terragrunt catalog command derives a predictable per-repository catalog clone root under the share…","description":"Terragrunt is a flexible orchestration tool that allows Infrastructure as Code written in OpenTofu or Terraform to scale. Prior to 1.1.1, the terragrunt catalog command derives a predictable per-repository catalog clone root under the shared system temporary directory and follows a symlink already placed at that path. A local attacker who can write to the temporary directory and predict the cataloged repository can redirect cleanup and cloning outside the intended root, causing an existing repository-named directory to be deleted and replaced in the victim's security context. The attack requires the victim to run terragrunt catalog on a shared host while the symlink is present, and it is not remotely exploitable. This issue is fixed in version 1.1.1.","state":0,"publishedAt":null,"modifiedAt":null,"affected":[],"metrics":[{"system":"EUVD CVSS 4.0","vector":"CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:P/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N","score":4.4,"severity":null}],"references":["https://github.com/gruntwork-io/terragrunt/security/advisories/GHSA-wv6g-x823-wx9m","https://github.com/gruntwork-io/terragrunt/pull/6438","https://github.com/gruntwork-io/terragrunt/commit/668891c5a2ad2996f134bb8b00098754674ea94a","https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.1"],"sourceUrl":"https://euvd.enisa.europa.eu/vulnerability/EUVD-2026-116370","license":"ENISA EUVD · source terms and attribution apply","enrichment":{"sourceStatus":null,"weaknesses":[],"productCriteria":[],"sourceDates":{"datePublished":"Nov 3, 2026, 8:44:04 PM","dateUpdated":"Nov 7, 2026, 3:32:17 AM"},"relatedAdvisories":[],"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-116370","identifiers":["EUVD-2026-116370","CVE-2026-64672","GHSA-wv6g-x823-wx9m"]},"retained":false,"historicalAffected":[]},{"revision":"184f7d10d5eb4300a8454f26f62e7a68","observedAt":"2026-11-04T19:04:15.194+00:00","statement":{"source":"nvd","id":"CVE-2026-64672","aliases":[],"title":"Terragrunt is a flexible orchestration tool that allows Infrastructure as Code written in OpenTofu or Terraform to scale. Prior to 1.1.1, the terragrunt catalog command derives a predictable per-repository catalog clone root under the share…","description":"Terragrunt is a flexible orchestration tool that allows Infrastructure as Code written in OpenTofu or Terraform to scale. Prior to 1.1.1, the terragrunt catalog command derives a predictable per-repository catalog clone root under the shared system temporary directory and follows a symlink already placed at that path. A local attacker who can write to the temporary directory and predict the cataloged repository can redirect cleanup and cloning outside the intended root, causing an existing repository-named directory to be deleted and replaced in the victim's security context. The attack requires the victim to run terragrunt catalog on a shared host while the symlink is present, and it is not remotely exploitable. This issue is fixed in version 1.1.1.","state":0,"publishedAt":"2026-11-03T21:17:42.893+00:00","modifiedAt":"2026-11-03T21:17:42.893+00:00","affected":[],"metrics":[{"system":"CVSS 4.0 · security-advisories@github.com · Secondary","vector":"CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:P/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","score":4.4,"severity":"MEDIUM"}],"references":["https://github.com/gruntwork-io/terragrunt/commit/668891c5a2ad2996f134bb8b00098754674ea94a","https://github.com/gruntwork-io/terragrunt/pull/6438","https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.1","https://github.com/gruntwork-io/terragrunt/security/advisories/GHSA-wv6g-x823-wx9m"],"sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2026-64672","license":"NIST NVD usage terms; underlying source attribution retained","enrichment":{"sourceStatus":"Received","weaknesses":["CWE-59","CWE-377"],"productCriteria":[],"sourceDates":{"published":"2026-11-03T21:17:42.893","lastModified":"2026-11-03T21:17:42.893"},"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-64672","identifiers":["CVE-2026-64672"]},"retained":false,"historicalAffected":[]},{"revision":"1e65ea8853e041acafaad32931438c6e","observedAt":"2026-10-24T13:19:41.952+00:00","statement":{"source":"osv","id":"GHSA-wv6g-x823-wx9m","aliases":["CVE-2026-64672","GO-2026-6768"],"title":"Terragrunt catalog predictable temp symlink clobber","description":"### Summary\n\nTerragrunt's `terragrunt catalog` command clones each repository referenced in your catalog configuration into a temporary working directory. In affected versions, the clone path it derived was deterministic and sat under the shared system temporary directory, in the form `<tmp>/catalog-<base64 sha1 of the repo URL>`. Because that path was predictable and Terragrunt followed a symlink already present there instead of rejecting it, a local attacker could plant a symlink at that path and cause Terragrunt to delete a directory and re-clone into it outside the intended temporary root.\n\n### Impact\n\nThis affected users who ran `terragrunt catalog` on a host they shared with other local users or processes they did not fully trust, such as a multi-user server or a shared CI runner. The attack required a local attacker: a separate local user or process able to write to the shared system temporary directory. It was not remotely exploitable, and the victim had to run `terragrunt catalog` while the attacker's symlink was already in place.\n\nBecause the predictable path depended only on the repository URL being cataloged and the location of the system temporary directory, the attacker could compute it in advance and plant a symlink there before the victim ran the command. When the victim ran `terragrunt catalog`, Terragrunt followed the symlink out of the intended temporary root, deleted an existing `<repoName>` directory under the attacker-chosen parent, and repopulated that path with the cloned repository contents. All of this happened in the security context of the user running Terragrunt.\n\nThe attacker controlled the parent directory the symlink pointed to, but not the leaf name: the leaf was fixed to `<repoName>`, derived from the repository URL the victim cataloged. The primitive was deletion of an existing `<repoName>` directory outside the temporary root, followed by a re-clone into that same path. On a single-user machine with no hostile local processes, exposure was minimal.\n\n### Affected Versions\n\n- Terragrunt `< v1.1.1`\n\n### Patches\n\nThis vulnerability has been resolved in Terragrunt version `v1.1.1`.\n\nAll users are strongly advised to upgrade.\n\n### Workarounds\n\nIf you cannot upgrade immediately, ensure that you do not allow untrusted parties to control the values of `TMPDIR`, `TMP`, and `TEMP` in environments where you run `terragrunt catalog`.\n\n### Technical Details\n\nWhen you run `terragrunt catalog`, the catalog service iterates over the repositories in your configuration and prepares a local clone of each one. In affected versions, for a given repository URL it built a clone path by hashing the URL and joining the result under the shared system temporary directory:\n\n```\n<tmp>/catalog-<base64 sha1 of the repo URL>\n```\n\nThis path was fully determined by the repository URL and the location of the system temporary directory, so anyone else on the machine who knew which repository a victim would catalog could compute it in advance. The catalog service passed this path into its clone preparation step.\n\nAs a result, an attacker who placed a symlink at `<tmp>/catalog-<hash>` pointing at a directory of their choosing caused both the removal and the re-clone to operate through that symlink. Both landed at `<attacker-chosen-parent>/<repoName>`, outside the intended temporary root.\n\nTerragrunt `v1.1.1` no longer derives a predictable clone path, so an attacker can no longer position a symlink at a location known in advance.\n\n## Credit\n\nWe would like to thank ([@br0x2](https://github.com/br0x2)) for discovering and responsibly disclosing this vulnerability.","state":0,"publishedAt":"2026-10-15T18:21:35+00:00","modifiedAt":"2026-10-19T21:40:47.5107134+00:00","affected":[{"ecosystem":"Go","name":"github.com/gruntwork-io/terragrunt","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"1.1.1"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V4","vector":"CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:P/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"MODERATE"}],"references":["https://github.com/gruntwork-io/terragrunt/security/advisories/GHSA-wv6g-x823-wx9m","https://github.com/gruntwork-io/terragrunt/pull/6438","https://github.com/gruntwork-io/terragrunt/commit/668891c5a2ad2996f134bb8b00098754674ea94a","https://github.com/gruntwork-io/terragrunt"],"sourceUrl":"https://github.com/advisories/GHSA-wv6g-x823-wx9m","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-wv6g-x823-wx9m","identifiers":["GHSA-wv6g-x823-wx9m","CVE-2026-64672","GO-2026-6768"]},"retained":false,"historicalAffected":[]},{"revision":"7d9628ca7abd496f85c8b2df5fdad51d","observedAt":"2026-10-24T13:19:41.952+00:00","statement":{"source":"osv","id":"GO-2026-6768","aliases":["CVE-2026-64672","GHSA-wv6g-x823-wx9m"],"title":"Terragrunt catalog predictable temp symlink clobber in github.com/gruntwork-io/terragrunt","description":"Terragrunt catalog predictable temp symlink clobber in github.com/gruntwork-io/terragrunt","state":0,"publishedAt":"2026-10-19T21:08:35+00:00","modifiedAt":"2026-10-19T21:31:50.6260929+00:00","affected":[{"ecosystem":"Go","name":"github.com/gruntwork-io/terragrunt","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"1.1.1"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[],"references":["https://github.com/gruntwork-io/terragrunt/security/advisories/GHSA-wv6g-x823-wx9m","https://github.com/gruntwork-io/terragrunt/commit/668891c5a2ad2996f134bb8b00098754674ea94a","https://github.com/gruntwork-io/terragrunt/pull/6438"],"sourceUrl":"https://osv.dev/vulnerability/GO-2026-6768","license":"OSV · upstream source license applies","key":"osv:GO-2026-6768","identifiers":["GO-2026-6768","CVE-2026-64672","GHSA-wv6g-x823-wx9m"]},"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-08T14:04:21.6524616+00:00","complete":true,"records":1769,"lastAttemptAt":"2026-11-08T14:04:21.6524616+00:00","lastSuccessAt":"2026-11-08T14:04:21.8442875+00:00","error":null,"lastVerifiedAt":"2026-11-08T14:04:21.8442884+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-eaa64dac63caa79c8d4905619258c41c51b39e461b996124e1a21b5e85e7e738-4b0775bb0fc73c3ceeed66f8f17640894d61d654f97ee9386046b283ad9f9876","complete":true,"records":421100,"lastAttemptAt":"2026-11-08T14:04:21.1432513+00:00","lastSuccessAt":"2026-11-08T14:04:21.1228768+00:00","error":null,"lastVerifiedAt":"2026-11-08T14:04:21.1432513+00:00","snapshotPublishedAt":"2026-11-08T13:27:32+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-383c643166b94ac4b6a615647191978e","complete":true,"records":13654,"lastAttemptAt":"2026-11-08T14:04:47.6384375+00:00","lastSuccessAt":"2026-11-08T13:04:50.073+00:00","error":null,"lastVerifiedAt":"2026-11-08T13:04:50.073+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13706,"expectedIdentifiers":13706,"failedIdentifiers":0},{"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-08T14:04:21.6524616+00:00","complete":true,"records":1096,"lastAttemptAt":"2026-11-08T14:04:21.6524616+00:00","lastSuccessAt":"2026-11-08T14:04:21.8452187+00:00","error":null,"lastVerifiedAt":"2026-11-08T14:04:21.8452194+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-ceefbd28b79c4b75ac56c9c678246411","complete":false,"records":13666,"lastAttemptAt":"2026-11-08T14:04:46.9956646+00:00","lastSuccessAt":"2026-11-08T14:04:46.992+00:00","error":null,"lastVerifiedAt":"2026-11-08T14:04:46.992+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13185,"expectedIdentifiers":13706,"failedIdentifiers":0},{"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-980593e6977a6d1b4fb1eed5a1ffe88a468736f89f0a06f710924ad59132c023","complete":true,"records":9914,"lastAttemptAt":"2026-11-08T14:04:21.5047325+00:00","lastSuccessAt":"2026-11-08T11:07:07.068788+00:00","error":null,"lastVerifiedAt":"2026-11-08T14:04:21.5047325+00:00","snapshotPublishedAt":"2026-11-08T11:02:46+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-fde804134ecdda0ddd5ff5c26ee1fff5a6fa659311f7ef2e51c6ad54964db0e2","complete":true,"records":1971,"lastAttemptAt":"2026-11-08T14:04:21.2941446+00:00","lastSuccessAt":"2026-11-06T19:03:17.0399903+00:00","error":null,"lastVerifiedAt":"2026-11-08T14:04:21.2941446+00:00","snapshotPublishedAt":"2026-11-06T18:17:57+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-964c14035e6f0f6478b2870fad6a7ef9f6045876d4a12af2c2e514521e54b6af","complete":true,"records":3055,"lastAttemptAt":"2026-11-08T14:04:21.6167179+00:00","lastSuccessAt":"2026-11-08T11:07:12.1927025+00:00","error":null,"lastVerifiedAt":"2026-11-08T14:04:21.6167179+00:00","snapshotPublishedAt":"2026-11-08T11:02:46+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-f8647d7ba64b1ba0dfdc7130944766d5b36d5b77d18fff0c79e651a4cff3c2b9","complete":true,"records":231293,"lastAttemptAt":"2026-11-08T14:04:21.3943214+00:00","lastSuccessAt":"2026-11-08T11:06:56.2918717+00:00","error":null,"lastVerifiedAt":"2026-11-08T14:04:21.3943214+00:00","snapshotPublishedAt":"2026-11-08T11:02:50+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}