{"id":"GHSA-xjvp-4fhw-gc47","revision":null,"records":[{"revision":"2346826c955d4a92b3b718156bb31330","observedAt":"2026-10-23T15:48:27.903+00:00","statement":{"source":"cve-program","id":"CVE-2026-41579","aliases":[],"title":"runc: Malicious image with /dev symlink can trigger limited host filesystem integrity violations","description":"runc is a CLI tool for spawning and running containers according to the OCI specification. In versions prior to 1.3.6, 1.4.0-rc.1, 1.4.0-rc.12, 1.5.0-rc.1, and 1.5.0-rc.1, when setting up the container rootfs, setupPtmx and setupDevSymlinks call os.Remove and os.Symlink with a filepath.Join string which allow an image with /dev as a symlink to trick runc into deleting files called ptmx on the host or creating a hardcoded set of symlinks with specific names and targets in an arbitrary pre-existing host directory. This issue is not exploitable under Docker, because Docker creates a top-level read-only layer that masks any malicious /dev\u00A0symlink present in the container image — unlike some other Linux container tooling, whose higher-level runtimes built on runc remain exposed to exploitation via a malicious image. This issue has been fixed in versions 1.3.6, 1.4.3 and 1.5.0.","state":0,"publishedAt":"2026-07-01T00:02:08.639+00:00","modifiedAt":"2026-07-01T13:35:41.354+00:00","affected":[{"ecosystem":"Vendor product","name":"runc","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"opencontainers\",\n                    \"product\": \"runc\",\n                    \"versions\": [\n                        {\n                            \"version\": \"< 1.3.6\",\n                            \"status\": \"affected\"\n                        },\n                        {\n                            \"version\": \">= 1.4.0-rc.1, < 1.4.3\",\n                            \"status\": \"affected\"\n                        },\n                        {\n                            \"version\": \">= 1.5.0-rc.1, < 1.5.0-rc.3\",\n                            \"status\": \"affected\"\n                        }\n                    ]\n                }"}],"metrics":[{"system":"CVSS 3.1","vector":"CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N","score":3.3,"severity":"LOW"}],"references":["https://github.com/opencontainers/runc/security/advisories/GHSA-xjvp-4fhw-gc47","https://github.com/opencontainers/runc/commit/864db8042dbb"],"sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-41579","license":"CVE Program Terms of Use","key":"cve-program:CVE-2026-41579","identifiers":["CVE-2026-41579"]},"retained":false,"historicalAffected":[]},{"revision":"e07e925be3db4e4b8cc289b44e29da65","observedAt":"2026-10-27T10:10:19.004+00:00","statement":{"source":"nvd","id":"CVE-2026-41579","aliases":[],"title":"runc is a CLI tool for spawning and running containers according to the OCI specification. In versions prior to 1.3.6, 1.4.0-rc.1, 1.4.0-rc.12, 1.5.0-rc.1, and 1.5.0-rc.1, when setting up the container rootfs, setupPtmx and setupDevSymlinks…","description":"runc is a CLI tool for spawning and running containers according to the OCI specification. In versions prior to 1.3.6, 1.4.0-rc.1, 1.4.0-rc.12, 1.5.0-rc.1, and 1.5.0-rc.1, when setting up the container rootfs, setupPtmx and setupDevSymlinks call os.Remove and os.Symlink with a filepath.Join string which allow an image with /dev as a symlink to trick runc into deleting files called ptmx on the host or creating a hardcoded set of symlinks with specific names and targets in an arbitrary pre-existing host directory. This issue is not exploitable under Docker, because Docker creates a top-level read-only layer that masks any malicious /dev\u00A0symlink present in the container image — unlike some other Linux container tooling, whose higher-level runtimes built on runc remain exposed to exploitation via a malicious image. This issue has been fixed in versions 1.3.6, 1.4.3 and 1.5.0.","state":0,"publishedAt":"2026-07-01T02:17:00.193+00:00","modifiedAt":"2026-10-25T17:10:00.197+00:00","affected":[],"metrics":[{"system":"CVSS 3.1 · security-advisories@github.com · Secondary","vector":"CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N","score":3.3,"severity":"LOW"}],"references":["https://github.com/opencontainers/runc/commit/864db8042dbb","https://github.com/opencontainers/runc/security/advisories/GHSA-xjvp-4fhw-gc47"],"sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2026-41579","license":"NIST NVD usage terms; underlying source attribution retained","enrichment":{"sourceStatus":"Analyzed","weaknesses":["CWE-61"],"productCriteria":["cpe:2.3:a:linuxfoundation:runc:*:*:*:*:*:*:*:*","cpe:2.3:a:linuxfoundation:runc:1.5.0:rc1:*:*:*:*:*:*","cpe:2.3:a:linuxfoundation:runc:1.5.0:rc2:*:*:*:*:*:*"],"sourceDates":{"published":"2026-07-01T02:17:00.193","lastModified":"2026-10-25T17:10:00.197"},"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-41579","identifiers":["CVE-2026-41579"]},"retained":false,"historicalAffected":[]},{"revision":"ca85c7185c6f41b9837aa1833f45a1ff","observedAt":"2026-10-24T13:19:41.952+00:00","statement":{"source":"osv","id":"GHSA-xjvp-4fhw-gc47","aliases":["CVE-2026-41579","GO-2026-5761"],"title":"runc: Malicious image with /dev symlink can trigger limited host filesystem integrity violations ","description":"### Impact\nWhen setting up the container rootfs, `setupPtmx` and `setupDevSymlinks` call `os.Remove` and `os.Symlink` with a `filepath.Join` string which allow an image with `/dev` as a symlink to trick runc into deleting files called `ptmx` on the host or creating a hardcoded set of symlinks with specific names and targets in an arbitrary pre-existing host directory.\n\nPlease note that this issue is not exploitable under Docker because [it creates a top-level `ro` layer that masks any malicious `/dev` symlink present in the container image](https://github.com/moby/moby/blob/docker-v29.4.1/daemon/initlayer/setup_unix.go) (this is also done without mounting the lower layers so there is no opportunity for the malicious `/dev` symlink to trick it into resolving to some other path). Unfortunately, Podman and containerd<sup>&dagger;</sup> do not do this and so users using those higher-level runtimes with runc can be exploited via a malicious image.\n\nThis issue mirrors a [somewhat similar issue in crun](https://github.com/containers/crun/security/advisories/GHSA-7vwr-4279-7gq5), which was also published recently.\n\n###### &dagger; Actually, at the time the issue was analysed, [containerd had dead code that implemented this feature](https://github.com/containerd/containerd/blob/v2.2.3/pkg/rootfs/init_linux.go) but the implementation contained several security issues that would arguably have made it more exploitable than in runc. Luckily, the code appears to have never been used (at least since 2017) and [the code has since been removed](https://github.com/containerd/containerd/issues/13238).\n\n#### Mitigating Factors ####\n\nThere are a few mitigating factors about this issue which reduce the impact for most users quite significantly, and is the reason why we decided to release the fix publicly without an embargo.\n\nWhile the deletion of `ptmx` seems like a significant issue, in practice it is quite limited. Notably, `devpts` does not permit you to unlink `/dev/pts/ptmx` regardless of privileges and so it is not a usable target for this attack. Additionally, while `/dev/ptmx` *can* be unlinked<sup>&ddagger;</sup>, trying to use an image with a symlink from `/dev` to `/dev` will cause runc will return an error before it reaches the buggy code (it correctly detects a symlink loop while setting up the mount target and the code correctly scopes the lookup inside the container). Thus, the only files called `ptmx` that are *guaranteed* to exist on the system cannot actually be removed by this bug and so only some user file that happens to have that specific name could be deleted, which seems fairly unlikely to happen on real systems.\n\nAs for the issue of symlinks, again the impact is likely quite limited. While the creation of *arbitrary* symlinks could be used to create drop-in files for system services (and thus lead to a container breakout), the hardcoded set of symlink names and targets that this bug allows you to create on the host make it quite unlikely that you would be able to do much more than pollute the host system with dummy symlinks. Here is the complete list of symlinks that can be created with this attack:\n\n * `core` &rarr; `/proc/kcore`\n * `fd` &rarr; `/proc/self/fd/`\n * `ptmx` &rarr; `pts/ptmx`\n * `stdin` &rarr; `/proc/self/fd/0`\n * `stdout` &rarr; `/proc/self/fd/1`\n * `stderr` &rarr; `/proc/self/fd/2`\n\nNote that none of these symlinks are likely to point to user-controlled data -- the `/proc/self/fd/$n` symlinks are all properties of the process accessing them (so privileged processes will only see the state they were spawned with) and the `pts/ptmx` symlink is almost certainly in the same privilege scope as the directory the symlink itself is in. It seems the only somewhat plausible impact would be that a service could return an error when trying to parse one of these symlinks and thus treat it as an invalid configuration file. How arbitrary processes deal with this situation is a bit hard to analyse, but most daemons require configuration files to have certain suffixes (such as `.conf`) so it's not really clear how large the impact is in practice and it seems there are a few barriers to clear to use this to cause a DoS or other problems.\n\n###### &ddagger; This would actually be quite problematic if it could occur because `glibc` seemingly only attempts to use `/dev/ptmx` when creating new terminals and thus most terminal managers (including `tmux`) and shell tools (including `sudo` -- but not `su`) would fail to start and thus bring the system to a halt. `setupPtmx` does add a symlink to `/dev/pts/ptmx` afterwards but on some systems the mode of the host `/dev/pts/ptmx` is set to `0o000` which would still cause the same DoS issue.\n\n### Patches\nThis issue has been patched in runc 1.3.6, runc 1.4.3, and runc 1.5.0-rc.3.\n\n### Workarounds\nUsing user namespaces restricts this attack fairly significantly such that the attacker can only create/delete inodes in directories that the remapped root user/group has write access to. Unless the root user is remapped to an actual user on the host (such as with rootless containers that don't use `/etc/sub[ug]id`), this in practice means that an attacker would only be able to create or delete inodes in world-writable directories.\n\nLSMs can restrict the scope of where in the host filesystem runc can be tricked into operating on, though how much this helps is questionable. The default `container_runtime_t` SELinux label rules (or custom AppArmor rules for the host `runc` context) may restrict the scope where these filesystem operations can operate on, but we have not done an in-depth analysis on the impact of those kinds of LSM protections.\n\n### Resources\n* commit opencontainers/runc@864db8042dbb (\"rootfs: make /dev initialisation code fd-based\")\n* https://github.com/containers/crun/security/advisories/GHSA-7vwr-4279-7gq5\n\n### Credits\nrunc thanks \"Davias\" for initially finding and reporting this issue. The same underlying issue (with varying levels of completeness) was later reported by Arthur Chan (@arthurscchan from Ada Logics), Junyi Liu (@mosskappa), and Derek Manzella (@Dmanzella).","state":0,"publishedAt":"2026-06-22T20:01:35+00:00","modifiedAt":"2026-09-10T03:51:09.7781202+00:00","affected":[{"ecosystem":"Go","name":"github.com/opencontainers/runc","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"1.3.6"}]}],"versions":[],"rawVersionEvidence":null},{"ecosystem":"Go","name":"github.com/opencontainers/runc","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"1.4.0"},{"kind":"fixed","version":"1.4.3"}]}],"versions":[],"rawVersionEvidence":null},{"ecosystem":"Go","name":"github.com/opencontainers/runc","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"1.5.0-rc.1"},{"kind":"fixed","version":"1.5.0-rc.3"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N","score":null,"severity":null},{"system":"CVSS_V4","vector":"CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"MODERATE"}],"references":["https://github.com/opencontainers/runc/security/advisories/GHSA-xjvp-4fhw-gc47","https://github.com/opencontainers/runc"],"sourceUrl":"https://github.com/advisories/GHSA-xjvp-4fhw-gc47","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-xjvp-4fhw-gc47","identifiers":["GHSA-xjvp-4fhw-gc47","CVE-2026-41579","GO-2026-5761"]},"retained":false,"historicalAffected":[]},{"revision":"ae619878898d4eafae48c43fba40257a","observedAt":"2026-10-24T13:19:41.952+00:00","statement":{"source":"osv","id":"GO-2026-5761","aliases":["CVE-2026-41579","GHSA-xjvp-4fhw-gc47"],"title":"Malicious image with /dev symlink can trigger limited host filesystem integrity violations in github.com/opencontainers/runc","description":"Malicious image with /dev symlink can trigger limited host filesystem integrity violations in github.com/opencontainers/runc","state":0,"publishedAt":"2026-07-07T16:52:19+00:00","modifiedAt":"2026-07-08T15:29:23.4854323+00:00","affected":[{"ecosystem":"Go","name":"github.com/opencontainers/runc","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"1.3.6"},{"kind":"introduced","version":"1.4.0"},{"kind":"fixed","version":"1.4.3"},{"kind":"introduced","version":"1.5.0-rc.1"},{"kind":"fixed","version":"1.5.0-rc.3"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[],"references":["https://github.com/opencontainers/runc/security/advisories/GHSA-xjvp-4fhw-gc47"],"sourceUrl":"https://osv.dev/vulnerability/GO-2026-5761","license":"OSV · upstream source license applies","key":"osv:GO-2026-5761","identifiers":["GO-2026-5761","CVE-2026-41579","GHSA-xjvp-4fhw-gc47"]},"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-10-27T15:15:10.0599163+00:00","complete":true,"records":1758,"lastAttemptAt":"2026-10-27T15:15:10.0599163+00:00","lastSuccessAt":"2026-10-27T15:15:10.2728795+00:00","error":null,"lastVerifiedAt":"2026-10-27T15:15:10.2728805+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-187d2b72c94ceb8c4417f1032ec3109a3a3a7b730abadb561d8cdd2a96e04d27-8bb6fff76518d08eacd06e13d128f24b210ef27991cb0ab2236490d4dd3b5fe6","complete":true,"records":415032,"lastAttemptAt":"2026-10-27T15:09:38.1394183+00:00","lastSuccessAt":"2026-10-27T15:09:38.0414822+00:00","error":null,"lastVerifiedAt":"2026-10-27T15:09:38.1394183+00:00","snapshotPublishedAt":"2026-10-27T14:31:01+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":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-43321610382942b8ad8c85917eab1546","complete":false,"records":4735,"lastAttemptAt":"2026-10-27T15:15:49.7535245+00:00","lastSuccessAt":"2026-10-24T23:18:49.862+00:00","error":"InvalidDataException","lastVerifiedAt":"2026-10-24T23:18:49.862+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":0,"expectedIdentifiers":13486},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-10-27T15:15:10.0599163+00:00","complete":true,"records":1093,"lastAttemptAt":"2026-10-27T15:15:10.0599163+00:00","lastSuccessAt":"2026-10-27T15:15:10.2765312+00:00","error":null,"lastVerifiedAt":"2026-10-27T15:15:10.2765323+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":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-88a38441ad1248599975b90993827b01","complete":false,"records":13423,"lastAttemptAt":"2026-10-27T15:15:45.1432116+00:00","lastSuccessAt":"2026-10-27T15:15:45.139+00:00","error":null,"lastVerifiedAt":"2026-10-27T15:15:45.139+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13480,"expectedIdentifiers":13486},{"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-9aac152375d0a5e113d83b548d5b8eef3e502e5699b45f50871eab64fdebfbb1","complete":true,"records":9782,"lastAttemptAt":"2026-10-27T15:15:09.8979368+00:00","lastSuccessAt":"2026-10-27T15:15:09.6352152+00:00","error":null,"lastVerifiedAt":"2026-10-27T15:15:09.8979368+00:00","snapshotPublishedAt":"2026-10-27T15:03:35+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-bad5d31e7f6a5e3d338e11d8789069b63620a403f927730769688b42f768e4f6","complete":true,"records":1965,"lastAttemptAt":"2026-10-27T15:09:38.2835342+00:00","lastSuccessAt":"2026-10-26T16:35:43.1460623+00:00","error":null,"lastVerifiedAt":"2026-10-27T15:09:38.2835342+00:00","snapshotPublishedAt":"2026-10-26T16:18:29+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":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-112103ad2640f03b274c0e731c3f4398f99b844297f2e68d520aeec5561d6df2","complete":true,"records":2997,"lastAttemptAt":"2026-10-27T15:15:10.0075658+00:00","lastSuccessAt":"2026-10-27T11:11:56.4872351+00:00","error":null,"lastVerifiedAt":"2026-10-27T15:15:10.0075658+00:00","snapshotPublishedAt":"2026-10-27T10:33:05+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":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-7e26fba71e5cf7d18798513b59ea2bb3b5abe64df0a968b5e2c3f16d11533f05","complete":true,"records":230819,"lastAttemptAt":"2026-10-27T15:14:41.8729153+00:00","lastSuccessAt":"2026-10-27T15:14:39.610946+00:00","error":null,"lastVerifiedAt":"2026-10-27T15:14:41.8729153+00:00","snapshotPublishedAt":"2026-10-27T15:03:39+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null}]}