{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2025-38396", "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "state": "PUBLISHED", "assignerShortName": "Linux", "dateReserved": "2025-04-16T04:51:24.011Z", "datePublished": "2025-07-25T12:53:40.761Z", "dateUpdated": "2026-08-05T12:01:34.204Z" }, "containers": { "cna": { "providerMetadata": { "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "shortName": "Linux", "dateUpdated": "2026-08-05T12:01:34.204Z" }, "descriptions": [ { "lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nfs: export anon_inode_make_secure_inode() and fix secretmem LSM bypass\n\nExport anon_inode_make_secure_inode() to allow KVM guest_memfd to create\nanonymous inodes with proper security context. This replaces the current\npattern of calling alloc_anon_inode() followed by\ninode_init_security_anon() for creating security context manually.\n\nThis change also fixes a security regression in secretmem where the\nS_PRIVATE flag was not cleared after alloc_anon_inode(), causing\nLSM/SELinux checks to be bypassed for secretmem file descriptors.\n\nAs guest_memfd currently resides in the KVM module, we need to export this\nsymbol for use outside the core kernel. In the future, guest_memfd might be\nmoved to core-mm, at which point the symbols no longer would have to be\nexported. When/if that happens is still unclear." } ], "metrics": [ { "cvssV3_1": { "version": "3.1", "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H", "baseScore": 7.8, "baseSeverity": "HIGH" }, "scenarios": [ { "lang": "en", "value": "AV:L - The vulnerable object is created and operated on through local syscalls — `memfd_secret(2)`, `mmap()`, and `ftruncate()` on the resulting file descriptor. No network or adjacent-network path exists.\nAC:L - Every secretmem inode is unconditionally created with S_PRIVATE set — there is no race, no memory-layout dependency, and no timing element; the attacker simply calls memfd_secret() or receives such an fd. CONFIG_SECRETMEM defaults to y and secretmem_enable defaults to 1 since 6.6, so the affected path is present in stock distro kernels.\nPR:L - memfd_secret(2) performs no capability or permission check whatsoever, so any unprivileged local user — including one confined inside a container or user namespace — can create and operate on secretmem fds. Local account access is still required, so this is not PR:N.\nUI:N - The attacker triggers the entire sequence from their own process; no victim action, mount, or file open is needed.\nS:U - The missing enforcement affects kernel-managed objects under the kernel's own security authority; no VM, IOMMU, or hypervisor boundary is crossed. Per standard kernel scoring, MAC-policy enforcement failures remain Unchanged.\nC:H - With S_PRIVATE set, SELinux inode_has_perm() and Smack's checks return 0, so FILE__READ/FILE__MAP on a secretmem object are never evaluated — a confined domain that receives such an fd can mmap and read its contents despite policy denying it. secretmem is by design the store for the system's most sensitive data (crypto keys), and the accesses generate no AVC audit records.\nI:H - The same bypass permits PROT_WRITE shared mappings, and security_inode_setattr() is skipped entirely, so ftruncate/chown/chmod on a policy-protected secretmem object go unmediated. An attacker can overwrite or re-own another security domain's key material that the MAC policy was configured to protect.\nA:H - Because setattr and write-mapping are both unmediated, an attacker can truncate and overwrite the secretmem object a victim service depends on, destroying its key material and causing that service to fail; the unreclaimable, unmovable nature of secretmem pages compounds the effect." } ] } ], "affected": [ { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "fs/anon_inodes.c", "include/linux/fs.h", "mm/secretmem.c" ], "versions": [ { "version": "2bfe15c5261212130f1a71f32a300bcf426443d4", "lessThan": "66d29d757c968d2bee9124816da5d718eb352959", "status": "affected", "versionType": "git" }, { "version": "2bfe15c5261212130f1a71f32a300bcf426443d4", "lessThan": "e3eed01347721cd7a8819568161c91d538fbf229", "status": "affected", "versionType": "git" }, { "version": "2bfe15c5261212130f1a71f32a300bcf426443d4", "lessThan": "f94c422157f3e43dd31990567b3e5d54b3e5b32b", "status": "affected", "versionType": "git" }, { "version": "2bfe15c5261212130f1a71f32a300bcf426443d4", "lessThan": "6ca45ea48530332a4ba09595767bd26d3232743b", "status": "affected", "versionType": "git" }, { "version": "2bfe15c5261212130f1a71f32a300bcf426443d4", "lessThan": "cbe4134ea4bc493239786220bd69cb8a13493190", "status": "affected", "versionType": "git" } ] }, { "product": "Linux", "vendor": "Linux", "defaultStatus": "affected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "fs/anon_inodes.c", "include/linux/fs.h", "mm/secretmem.c" ], "versions": [ { "version": "6.0", "status": "affected" }, { "version": "0", "lessThan": "6.0", "status": "unaffected", "versionType": "semver" }, { "version": "6.1.146", "lessThanOrEqual": "6.1.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.6.97", "lessThanOrEqual": "6.6.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.12.37", "lessThanOrEqual": "6.12.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.15.6", "lessThanOrEqual": "6.15.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.16", "lessThanOrEqual": "*", "status": "unaffected", "versionType": "original_commit_for_fix" } ] } ], "cpeApplicability": [ { "nodes": [ { "operator": "OR", "negate": false, "cpeMatch": [ { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.0", "versionEndExcluding": "6.1.146" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.0", "versionEndExcluding": "6.6.97" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.0", "versionEndExcluding": "6.12.37" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.0", "versionEndExcluding": "6.15.6" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.0", "versionEndExcluding": "6.16" } ] } ] } ], "references": [ { "url": "https://git.kernel.org/stable/c/66d29d757c968d2bee9124816da5d718eb352959" }, { "url": "https://git.kernel.org/stable/c/e3eed01347721cd7a8819568161c91d538fbf229" }, { "url": "https://git.kernel.org/stable/c/f94c422157f3e43dd31990567b3e5d54b3e5b32b" }, { "url": "https://git.kernel.org/stable/c/6ca45ea48530332a4ba09595767bd26d3232743b" }, { "url": "https://git.kernel.org/stable/c/cbe4134ea4bc493239786220bd69cb8a13493190" } ], "title": "fs: export anon_inode_make_secure_inode() and fix secretmem LSM bypass", "x_generator": { "engine": "bippy-1.2.0" } }, "adp": [ { "title": "CVE Program Container", "references": [ { "url": "https://lists.debian.org/debian-lts-announce/2025/10/msg00008.html" } ], "providerMetadata": { "orgId": "af854a3a-2127-422b-91ae-364da2661108", "shortName": "CVE", "dateUpdated": "2025-11-03T17:37:29.745Z" } } ] } }