{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-89559","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2026-09-11T19:38:34.724Z","datePublished":"2026-09-11T19:44:31.337Z","dateUpdated":"2026-09-14T12:01:00.097Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-09-14T12:01:00.097Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nlibnvdimm/labels: Prevent integer overflow in __nd_label_validate()\n\nThe on-media namespace index field nslot is a u32 read from the DIMM\nlabel storage area.  __nd_label_validate() bounds it against the config\narea size, but sizeof_namespace_label() returns unsigned, so the product\nnslot * label_size is evaluated in 32-bit and wraps modulo 2^32 before\nthe comparison.  A crafted nslot passes the bound and is then used as the\nloop trip count in nd_label_data_init(), whose memset() walks off the end\nof the config_size buffer: an out-of-bounds write.\n\nThe field is not trusted -- it comes from the medium, or from userspace\nvia ND_CMD_SET_CONFIG_DATA.  Evaluate the product in 64-bit so the bound\ncheck is exact; conforming labels are unaffected.\n\nThe check was safe when introduced by commit 4a826c83db4e (\"libnvdimm:\nnamespace indices: read and validate\"): it multiplied by sizeof(struct\nnd_namespace_label), a size_t, so on a 64-bit build the product did not\nwrap.  Commit 564e871aa66f (\"libnvdimm, label: add v1.2 nvdimm label\ndefinitions\") narrowed it to 32 bits when the label size became a runtime\nvalue read via sizeof_namespace_label()."}],"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 overflow is consumed in nvdimm_probe()->nd_label_data_init() from a namespace index a local process plants via ioctl(ND_CMD_SET_CONFIG_DATA) on /dev/nmem*, or that already resides in the DIMM label area. There is no network or adjacent-network path into this parser.\nAC:L - A crafted nslot (e.g. 2^25 with 128-byte labels) makes the 32-bit nslot*sizeof_namespace_label() product wrap so the bound check passes, and the attacker also controls the signature, checksum, and free bitmap, making the later memset() walk deterministic. No race or uninfluenceable layout is required.\nPR:L - nd_open(), __nd_ioctl(), and nd_cmd_clear_to_send() perform no capable() check; SET_CONFIG_DATA is gated only by O_RDWR on /dev/nmem* (typically 0660 disk via udev). Any local account, disk-group user, or container granted that node can plant the malicious index that probe later consumes.\nUI:N - The attacker plants the crafted index from their own process and the OOB write runs in nd_label_data_init() on the ordinary dimm probe/bind path they drive with ndctl write-labels/enable; no separate victim action such as mounting a filesystem is required.\nS:U - The kvzalloc out-of-bounds write corrupts kernel heap inside the same kernel security authority and does not cross a VM, IOMMU, or sandbox boundary.\nC:H - The memset() loop is an unbounded heap out-of-bounds write whose distance is set by the attacker-chosen nslot (128/256-byte stores marching far past the config buffer). Corruption of adjacent heap objects can be turned into an arbitrary-read primitive, not a leak bounded to a few bytes.\nI:H - Each free-slot iteration does memset(ndd->data+offset, 0, label_size) with offset advancing past config_size, which is a kernel heap out-of-bounds write that can corrupt adjacent objects and hijack control flow.\nA:H - The same walk writes tens of megabytes past the kvzalloc buffer and will oops or panic on unmapped pages or corrupted kernel state; any such kernel crash is High availability impact."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/nvdimm/label.c"],"versions":[{"version":"564e871aa66f548a947b23808d3140f326381f0c","lessThan":"b4975f2ff6c82adc24ae547f029f82530ba43cfe","status":"affected","versionType":"git"},{"version":"564e871aa66f548a947b23808d3140f326381f0c","lessThan":"6030597ec683d1e5b46445f888bb5c7776b5a0c4","status":"affected","versionType":"git"},{"version":"564e871aa66f548a947b23808d3140f326381f0c","lessThan":"1c391696d2791f82ae462e11da9a0d96f90b240c","status":"affected","versionType":"git"},{"version":"564e871aa66f548a947b23808d3140f326381f0c","lessThan":"93967bfb17dab66642c57e609c99e1a91fe11278","status":"affected","versionType":"git"},{"version":"564e871aa66f548a947b23808d3140f326381f0c","lessThan":"e057efcc9c71d90099d9ee00bed0748d0e9fd586","status":"affected","versionType":"git"},{"version":"564e871aa66f548a947b23808d3140f326381f0c","lessThan":"09e649117c54b7e1c004f22eaa19efbadd9ac856","status":"affected","versionType":"git"},{"version":"564e871aa66f548a947b23808d3140f326381f0c","lessThan":"69a734359639fca16a0dd73ab17a34943e76c68b","status":"affected","versionType":"git"},{"version":"564e871aa66f548a947b23808d3140f326381f0c","lessThan":"037770686126155eafc44501312989e2837b9659","status":"affected","versionType":"git"}]},{"product":"Linux","vendor":"Linux","defaultStatus":"affected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/nvdimm/label.c"],"versions":[{"version":"4.13","status":"affected"},{"version":"0","lessThan":"4.13","status":"unaffected","versionType":"semver"},{"version":"5.10.270","lessThanOrEqual":"5.10.*","status":"unaffected","versionType":"semver"},{"version":"5.15.221","lessThanOrEqual":"5.15.*","status":"unaffected","versionType":"semver"},{"version":"6.1.188","lessThanOrEqual":"6.1.*","status":"unaffected","versionType":"semver"},{"version":"6.6.157","lessThanOrEqual":"6.6.*","status":"unaffected","versionType":"semver"},{"version":"6.12.109","lessThanOrEqual":"6.12.*","status":"unaffected","versionType":"semver"},{"version":"6.18.50","lessThanOrEqual":"6.18.*","status":"unaffected","versionType":"semver"},{"version":"7.2.4","lessThanOrEqual":"7.2.*","status":"unaffected","versionType":"semver"},{"version":"7.3-rc1","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":"4.13","versionEndExcluding":"5.10.270"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"5.15.221"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"6.1.188"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"6.6.157"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"6.12.109"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"6.18.50"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"7.2.4"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"7.3-rc1"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/b4975f2ff6c82adc24ae547f029f82530ba43cfe"},{"url":"https://git.kernel.org/stable/c/6030597ec683d1e5b46445f888bb5c7776b5a0c4"},{"url":"https://git.kernel.org/stable/c/1c391696d2791f82ae462e11da9a0d96f90b240c"},{"url":"https://git.kernel.org/stable/c/93967bfb17dab66642c57e609c99e1a91fe11278"},{"url":"https://git.kernel.org/stable/c/e057efcc9c71d90099d9ee00bed0748d0e9fd586"},{"url":"https://git.kernel.org/stable/c/09e649117c54b7e1c004f22eaa19efbadd9ac856"},{"url":"https://git.kernel.org/stable/c/69a734359639fca16a0dd73ab17a34943e76c68b"},{"url":"https://git.kernel.org/stable/c/037770686126155eafc44501312989e2837b9659"}],"title":"libnvdimm/labels: Prevent integer overflow in __nd_label_validate()","x_generator":{"engine":"bippy-1.2.0"}}}}