CVE-2026-23375 (GCVE-0-2026-23375)
Vulnerability from cvelistv5 – Published: 2026-03-25 10:27 – Updated: 2026-04-13 06:06
VLAI?
Title
mm: thp: deny THP for files on anonymous inodes
Summary
In the Linux kernel, the following vulnerability has been resolved:
mm: thp: deny THP for files on anonymous inodes
file_thp_enabled() incorrectly allows THP for files on anonymous inodes
(e.g. guest_memfd and secretmem). These files are created via
alloc_file_pseudo(), which does not call get_write_access() and leaves
inode->i_writecount at 0. Combined with S_ISREG(inode->i_mode) being
true, they appear as read-only regular files when
CONFIG_READ_ONLY_THP_FOR_FS is enabled, making them eligible for THP
collapse.
Anonymous inodes can never pass the inode_is_open_for_write() check
since their i_writecount is never incremented through the normal VFS
open path. The right thing to do is to exclude them from THP eligibility
altogether, since CONFIG_READ_ONLY_THP_FOR_FS was designed for real
filesystem files (e.g. shared libraries), not for pseudo-filesystem
inodes.
For guest_memfd, this allows khugepaged and MADV_COLLAPSE to create
large folios in the page cache via the collapse path, but the
guest_memfd fault handler does not support large folios. This triggers
WARN_ON_ONCE(folio_test_large(folio)) in kvm_gmem_fault_user_mapping().
For secretmem, collapse_file() tries to copy page contents through the
direct map, but secretmem pages are removed from the direct map. This
can result in a kernel crash:
BUG: unable to handle page fault for address: ffff88810284d000
RIP: 0010:memcpy_orig+0x16/0x130
Call Trace:
collapse_file
hpage_collapse_scan_file
madvise_collapse
Secretmem is not affected by the crash on upstream as the memory failure
recovery handles the failed copy gracefully, but it still triggers
confusing false memory failure reports:
Memory failure: 0x106d96f: recovery action for clean unevictable
LRU page: Recovered
Check IS_ANON_FILE(inode) in file_thp_enabled() to deny THP for all
anonymous inode files.
Severity ?
No CVSS data available.
Assigner
References
Impacted products
| Vendor | Product | Version | ||
|---|---|---|---|---|
| Linux | Linux |
Affected:
7fbb5e188248c50f737720825da1864ce42536d1 , < 08de46a75f91a6661bc1ce0a93614f4bc313c581
(git)
Affected: 7fbb5e188248c50f737720825da1864ce42536d1 , < 0524ee56af2c9bfbad152a810f1ca95de8ca00d7 (git) Affected: 7fbb5e188248c50f737720825da1864ce42536d1 , < f6fa05f0dddd387417d0c28281ddb951582514d6 (git) Affected: 7fbb5e188248c50f737720825da1864ce42536d1 , < dd085fe9a8ebfc5d10314c60452db38d2b75e609 (git) |
||
{
"containers": {
"cna": {
"affected": [
{
"defaultStatus": "unaffected",
"product": "Linux",
"programFiles": [
"mm/huge_memory.c"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"lessThan": "08de46a75f91a6661bc1ce0a93614f4bc313c581",
"status": "affected",
"version": "7fbb5e188248c50f737720825da1864ce42536d1",
"versionType": "git"
},
{
"lessThan": "0524ee56af2c9bfbad152a810f1ca95de8ca00d7",
"status": "affected",
"version": "7fbb5e188248c50f737720825da1864ce42536d1",
"versionType": "git"
},
{
"lessThan": "f6fa05f0dddd387417d0c28281ddb951582514d6",
"status": "affected",
"version": "7fbb5e188248c50f737720825da1864ce42536d1",
"versionType": "git"
},
{
"lessThan": "dd085fe9a8ebfc5d10314c60452db38d2b75e609",
"status": "affected",
"version": "7fbb5e188248c50f737720825da1864ce42536d1",
"versionType": "git"
}
]
},
{
"defaultStatus": "affected",
"product": "Linux",
"programFiles": [
"mm/huge_memory.c"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"status": "affected",
"version": "6.8"
},
{
"lessThan": "6.8",
"status": "unaffected",
"version": "0",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.12.*",
"status": "unaffected",
"version": "6.12.78",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.18.*",
"status": "unaffected",
"version": "6.18.17",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.19.*",
"status": "unaffected",
"version": "6.19.7",
"versionType": "semver"
},
{
"lessThanOrEqual": "*",
"status": "unaffected",
"version": "7.0",
"versionType": "original_commit_for_fix"
}
]
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.12.78",
"versionStartIncluding": "6.8",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.18.17",
"versionStartIncluding": "6.8",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.19.7",
"versionStartIncluding": "6.8",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "7.0",
"versionStartIncluding": "6.8",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
]
}
],
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nmm: thp: deny THP for files on anonymous inodes\n\nfile_thp_enabled() incorrectly allows THP for files on anonymous inodes\n(e.g. guest_memfd and secretmem). These files are created via\nalloc_file_pseudo(), which does not call get_write_access() and leaves\ninode-\u003ei_writecount at 0. Combined with S_ISREG(inode-\u003ei_mode) being\ntrue, they appear as read-only regular files when\nCONFIG_READ_ONLY_THP_FOR_FS is enabled, making them eligible for THP\ncollapse.\n\nAnonymous inodes can never pass the inode_is_open_for_write() check\nsince their i_writecount is never incremented through the normal VFS\nopen path. The right thing to do is to exclude them from THP eligibility\naltogether, since CONFIG_READ_ONLY_THP_FOR_FS was designed for real\nfilesystem files (e.g. shared libraries), not for pseudo-filesystem\ninodes.\n\nFor guest_memfd, this allows khugepaged and MADV_COLLAPSE to create\nlarge folios in the page cache via the collapse path, but the\nguest_memfd fault handler does not support large folios. This triggers\nWARN_ON_ONCE(folio_test_large(folio)) in kvm_gmem_fault_user_mapping().\n\nFor secretmem, collapse_file() tries to copy page contents through the\ndirect map, but secretmem pages are removed from the direct map. This\ncan result in a kernel crash:\n\n BUG: unable to handle page fault for address: ffff88810284d000\n RIP: 0010:memcpy_orig+0x16/0x130\n Call Trace:\n collapse_file\n hpage_collapse_scan_file\n madvise_collapse\n\nSecretmem is not affected by the crash on upstream as the memory failure\nrecovery handles the failed copy gracefully, but it still triggers\nconfusing false memory failure reports:\n\n Memory failure: 0x106d96f: recovery action for clean unevictable\n LRU page: Recovered\n\nCheck IS_ANON_FILE(inode) in file_thp_enabled() to deny THP for all\nanonymous inode files."
}
],
"providerMetadata": {
"dateUpdated": "2026-04-13T06:06:09.991Z",
"orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"shortName": "Linux"
},
"references": [
{
"url": "https://git.kernel.org/stable/c/08de46a75f91a6661bc1ce0a93614f4bc313c581"
},
{
"url": "https://git.kernel.org/stable/c/0524ee56af2c9bfbad152a810f1ca95de8ca00d7"
},
{
"url": "https://git.kernel.org/stable/c/f6fa05f0dddd387417d0c28281ddb951582514d6"
},
{
"url": "https://git.kernel.org/stable/c/dd085fe9a8ebfc5d10314c60452db38d2b75e609"
}
],
"title": "mm: thp: deny THP for files on anonymous inodes",
"x_generator": {
"engine": "bippy-1.2.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"assignerShortName": "Linux",
"cveId": "CVE-2026-23375",
"datePublished": "2026-03-25T10:27:55.754Z",
"dateReserved": "2026-01-13T15:37:46.003Z",
"dateUpdated": "2026-04-13T06:06:09.991Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"vulnerability-lookup:meta": {
"epss": {
"cve": "CVE-2026-23375",
"date": "2026-04-24",
"epss": "0.00023",
"percentile": "0.06394"
},
"nvd": "{\"cve\":{\"id\":\"CVE-2026-23375\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-03-25T11:16:37.230\",\"lastModified\":\"2026-04-24T16:31:31.260\",\"vulnStatus\":\"Analyzed\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\nmm: thp: deny THP for files on anonymous inodes\\n\\nfile_thp_enabled() incorrectly allows THP for files on anonymous inodes\\n(e.g. guest_memfd and secretmem). These files are created via\\nalloc_file_pseudo(), which does not call get_write_access() and leaves\\ninode-\u003ei_writecount at 0. Combined with S_ISREG(inode-\u003ei_mode) being\\ntrue, they appear as read-only regular files when\\nCONFIG_READ_ONLY_THP_FOR_FS is enabled, making them eligible for THP\\ncollapse.\\n\\nAnonymous inodes can never pass the inode_is_open_for_write() check\\nsince their i_writecount is never incremented through the normal VFS\\nopen path. The right thing to do is to exclude them from THP eligibility\\naltogether, since CONFIG_READ_ONLY_THP_FOR_FS was designed for real\\nfilesystem files (e.g. shared libraries), not for pseudo-filesystem\\ninodes.\\n\\nFor guest_memfd, this allows khugepaged and MADV_COLLAPSE to create\\nlarge folios in the page cache via the collapse path, but the\\nguest_memfd fault handler does not support large folios. This triggers\\nWARN_ON_ONCE(folio_test_large(folio)) in kvm_gmem_fault_user_mapping().\\n\\nFor secretmem, collapse_file() tries to copy page contents through the\\ndirect map, but secretmem pages are removed from the direct map. This\\ncan result in a kernel crash:\\n\\n BUG: unable to handle page fault for address: ffff88810284d000\\n RIP: 0010:memcpy_orig+0x16/0x130\\n Call Trace:\\n collapse_file\\n hpage_collapse_scan_file\\n madvise_collapse\\n\\nSecretmem is not affected by the crash on upstream as the memory failure\\nrecovery handles the failed copy gracefully, but it still triggers\\nconfusing false memory failure reports:\\n\\n Memory failure: 0x106d96f: recovery action for clean unevictable\\n LRU page: Recovered\\n\\nCheck IS_ANON_FILE(inode) in file_thp_enabled() to deny THP for all\\nanonymous inode files.\"},{\"lang\":\"es\",\"value\":\"En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:\\n\\nmm: thp: denegar THP para archivos en inodos an\u00f3nimos\\n\\nfile_thp_enabled() permite incorrectamente THP para archivos en inodos an\u00f3nimos (por ejemplo, guest_memfd y secretmem). Estos archivos se crean a trav\u00e9s de alloc_file_pseudo(), que no llama a get_write_access() y deja inode-\u0026gt;i_writecount en 0. Combinado con que S_ISREG(inode-\u0026gt;i_mode) sea verdadero, aparecen como archivos regulares de solo lectura cuando CONFIG_READ_ONLY_THP_FOR_FS est\u00e1 habilitado, haci\u00e9ndolos elegibles para el colapso de THP.\\n\\nLos inodos an\u00f3nimos nunca pueden pasar la verificaci\u00f3n inode_is_open_for_write() ya que su i_writecount nunca se incrementa a trav\u00e9s de la ruta de apertura VFS normal. Lo correcto es excluirlos por completo de la elegibilidad para THP, ya que CONFIG_READ_ONLY_THP_FOR_FS fue dise\u00f1ado para archivos de sistemas de archivos reales (por ejemplo, bibliotecas compartidas), no para inodos de pseudo-sistemas de archivos.\\n\\nPara guest_memfd, esto permite a khugepaged y MADV_COLLAPSE crear folios grandes en la cach\u00e9 de p\u00e1ginas a trav\u00e9s de la ruta de colapso, pero el gestor de fallos de guest_memfd no soporta folios grandes. Esto activa WARN_ON_ONCE(folio_test_large(folio)) en kvm_gmem_fault_user_mapping().\\n\\nPara secretmem, collapse_file() intenta copiar el contenido de la p\u00e1gina a trav\u00e9s del mapa directo, pero las p\u00e1ginas de secretmem se eliminan del mapa directo. Esto puede resultar en un fallo del kernel:\\n\\n BUG: unable to handle page fault for address: ffff88810284d000\\n RIP: 0010:memcpy_orig+0x16/0x130\\n Call Trace:\\n collapse_file\\n hpage_collapse_scan_file\\n madvise_collapse\\n\\nSecretmem no se ve afectado por el fallo en upstream ya que la recuperaci\u00f3n de fallos de memoria maneja la copia fallida con elegancia, pero a\u00fan as\u00ed activa informes confusos de falsos fallos de memoria:\\n\\n Memory failure: 0x106d96f: recovery action for clean unevictable\\n LRU page: Recovered\\n\\nVerificar IS_ANON_FILE(inode) en file_thp_enabled() para denegar THP para todos los archivos de inodos an\u00f3nimos.\"}],\"metrics\":{\"cvssMetricV31\":[{\"source\":\"nvd@nist.gov\",\"type\":\"Primary\",\"cvssData\":{\"version\":\"3.1\",\"vectorString\":\"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H\",\"baseScore\":5.5,\"baseSeverity\":\"MEDIUM\",\"attackVector\":\"LOCAL\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"LOW\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"NONE\",\"integrityImpact\":\"NONE\",\"availabilityImpact\":\"HIGH\"},\"exploitabilityScore\":1.8,\"impactScore\":3.6}]},\"weaknesses\":[{\"source\":\"nvd@nist.gov\",\"type\":\"Primary\",\"description\":[{\"lang\":\"en\",\"value\":\"CWE-617\"}]}],\"configurations\":[{\"nodes\":[{\"operator\":\"OR\",\"negate\":false,\"cpeMatch\":[{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*\",\"versionStartIncluding\":\"6.8.1\",\"versionEndExcluding\":\"6.12.78\",\"matchCriteriaId\":\"72D11336-0D18-46CA-A42B-4E6F0E5748B7\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*\",\"versionStartIncluding\":\"6.13\",\"versionEndExcluding\":\"6.18.17\",\"matchCriteriaId\":\"A5E006E4-59C7-43C1-9231-62A72219F2BA\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*\",\"versionStartIncluding\":\"6.19\",\"versionEndExcluding\":\"6.19.7\",\"matchCriteriaId\":\"69245D10-0B71-485E-80C3-A64F077004D3\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:6.8:-:*:*:*:*:*:*\",\"matchCriteriaId\":\"41E47F32-BA80-4333-96FD-4D25082B0FDD\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:7.0:rc1:*:*:*:*:*:*\",\"matchCriteriaId\":\"F253B622-8837-4245-BCE5-A7BF8FC76A16\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:7.0:rc2:*:*:*:*:*:*\",\"matchCriteriaId\":\"4AE85AD8-4641-4E7C-A2F4-305E2CD9EE64\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:7.0:rc3:*:*:*:*:*:*\",\"matchCriteriaId\":\"F666C8D8-6538-46D4-B318-87610DE64C34\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:7.0:rc4:*:*:*:*:*:*\",\"matchCriteriaId\":\"02259FDA-961B-47BC-AE7F-93D7EC6E90C2\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:7.0:rc5:*:*:*:*:*:*\",\"matchCriteriaId\":\"58A9FEFF-C040-420D-8F0A-BFDAAA1DF258\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:7.0:rc6:*:*:*:*:*:*\",\"matchCriteriaId\":\"1D2315C0-D46F-4F85-9754-F9E5E11374A6\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:7.0:rc7:*:*:*:*:*:*\",\"matchCriteriaId\":\"512EE3A8-A590-4501-9A94-5D4B268D6138\"}]}]}],\"references\":[{\"url\":\"https://git.kernel.org/stable/c/0524ee56af2c9bfbad152a810f1ca95de8ca00d7\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"tags\":[\"Patch\"]},{\"url\":\"https://git.kernel.org/stable/c/08de46a75f91a6661bc1ce0a93614f4bc313c581\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"tags\":[\"Patch\"]},{\"url\":\"https://git.kernel.org/stable/c/dd085fe9a8ebfc5d10314c60452db38d2b75e609\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"tags\":[\"Patch\"]},{\"url\":\"https://git.kernel.org/stable/c/f6fa05f0dddd387417d0c28281ddb951582514d6\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"tags\":[\"Patch\"]}]}}"
}
}
Loading…
Loading…
Sightings
| Author | Source | Type | Date |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Loading…
Loading…