CVE-2026-89971
In the Linux kernel, the following vulnerability has been resolved:
nvme: skip the zoned limits update if the zone info query failed
nvme_query_zone_info() returns either a negative errno or a positive NVMe status code, but nvme_update_ns_info_block() only tests for the negative case:
If the device fails the Identify Namespace (I/O Command Set specific) command, or the Identify Controller command issued by nvme_set_max_append(), the positive status falls through and setup continues with the zero-initialized zone info. nvme_update_zone_info() then marks the queue zoned with chunk_sectors and ns->head->zsze set to zero.
Leer descripción completaMostrar menos
blk_validate_zoned_limits() does not check chunk_sectors, so the limits commit succeeds. blk_revalidate_disk_zones() does reject the zero zone size, but by then the limits are live and nothing rolls them back, so I/O keeps being submitted to a zoned queue with a zero zone size and disk_zone_no() shifts by ilog2(0):
Any device, firmware or NVMe-oF target that fails this one command reaches this.
Skip the zoned limits update in that case, and log which of the two things happened: during a revalidation the queue keeps the zone geometry it was last validated with, and on a first scan the namespace is registered without zoned limits, so that it is still available as a handle for admin commands. Neither of the paths in nvme_query_zone_info() that return a positive status logs anything, so the failure would otherwise be silent.
zi.zone_size is an exact indicator: every path that returns a positive status returns before it is assigned, and after that the only failure left is -ENODEV, which the caller already handles.
Found by FuzzNvme.
Detalles técnicos trazas, registros y código del informe original
ret = nvme_query_zone_info(ns, lbaf, &zi); if (ret < 0) goto out; nvme0n1: Invalid non power of two zone size (0) UBSAN: shift-out-of-bounds in include/linux/blkdev.h:747:16 shift exponent -1 is negative disk_zone_no include/linux/blkdev.h:747 [inline] bio_straddles_zones include/linux/blkdev.h:1058 [inline] blk_zone_wplug_handle_write block/blk-zoned.c:1423 [inline] blk_zone_plug_bio.cold+0x25/0x1c8 block/blk-zoned.c:1605 blk_mq_submit_bio+0x18fb/0x2870 block/blk-mq.c:3196 submit_bh_wbc+0x575/0x740 fs/buffer.c:2824 __block_write_full_folio+0x728/0xdd0 fs/buffer.c:1933
CVSS
- Versión: 3.1
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
- Puntuación base: 7.5
Probabilidad de explotación (EPSS)
- Probabilidad de explotación en los próximos 30 días: 0.61%
- Percentil entre todas las CVEs puntuadas: 47
- Fecha de la puntuación: 3/10/2026
EPSS (Exploit Prediction Scoring System, de FIRST) estima la probabilidad de que una vulnerabilidad sea explotada en 30 días. Complementa a CVSS (impacto) y a CISA KEV (explotación confirmada).
🎯 Técnicas ATT&CK
Cómo se explota esta vulnerabilidad y qué consigue el atacante, en el lenguaje de MITRE ATT&CK.
- Explotación
T1190Exploit Public-Facing Applicationinitial access85 % - Impacto principal
T1499.004Application or System Exploitationimpact90 % - Impacto secundario
T1565.001Stored Data Manipulationimpact60 %
Vulnerabilidad kernel remota (AV:N) en controlador NVMe que causa DoS por shift-out-of-bounds cuando falla query de zona. Atacante remoto induce fallo en dispositivo NVMe-oF, causando panic/crash del kernel.
Inferido por nuestro agente de análisis a partir de la descripción oficial, el vector CVSS y la CWE, y comprobado por un supervisor. Puede contener errores.
🛡️ Mitigaciones ATT&CK que cubren estas técnicas
Tecnologías afectadas (1)
⚠ Inferidas por IA a partir de la descripción — NVD aún no ha analizado esta CVE; no son CPE verificados.
Referencias
JSON original (NVD)
Mostrar
{
"id": "CVE-2026-89971",
"cveTags": [],
"metrics": {
"cvssMetricV31": [
{
"type": "Secondary",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"cvssData": {
"scope": "UNCHANGED",
"version": "3.1",
"baseScore": 7.5,
"attackVector": "NETWORK",
"baseSeverity": "HIGH",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
"integrityImpact": "NONE",
"userInteraction": "NONE",
"attackComplexity": "LOW",
"availabilityImpact": "HIGH",
"privilegesRequired": "NONE",
"confidentialityImpact": "NONE"
},
"impactScore": 3.6,
"exploitabilityScore": 3.9
}
]
},
"affected": [
{
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"affectedData": [
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "c85c9ab926a592e2f59f7d9a6ca7d6562843d8fa",
"lessThan": "a75258e651d91ec25424cd94d824d192c11ccc24",
"versionType": "git"
},
{
"status": "affected",
"version": "c85c9ab926a592e2f59f7d9a6ca7d6562843d8fa",
"lessThan": "7fad53ae2052a2b4fc7ca567d6555bdb1176ba35",
"versionType": "git"
},
{
"status": "affected",
"version": "c85c9ab926a592e2f59f7d9a6ca7d6562843d8fa",
"lessThan": "bb6dafa79040357cf5043836e1db108c2af8b1e1",
"versionType": "git"
},
{
"status": "affected",
"version": "c85c9ab926a592e2f59f7d9a6ca7d6562843d8fa",
"lessThan": "3838e80fcfb32e62baffb63c6dc0a60153665a4d",
"versionType": "git"
}
],
"programFiles": [
"drivers/nvme/host/core.c"
],
"defaultStatus": "unaffected"
},
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "6.9"
},
{
"status": "unaffected",
"version": "0",
"lessThan": "6.9",
"versionType": "semver"
},
{
"status": "unaffected",
"version": "6.12.112",
"versionType": "semver",
"lessThanOrEqual": "6.12.*"
},
{
"status": "unaffected",
"version": "6.18.52",
"versionType": "semver",
"lessThanOrEqual": "6.18.*"
},
{
"status": "unaffected",
"version": "7.2.5",
"versionType": "semver",
"lessThanOrEqual": "7.2.*"
},
{
"status": "unaffected",
"version": "7.3-rc2",
"versionType": "original_commit_for_fix",
"lessThanOrEqual": "*"
}
],
"programFiles": [
"drivers/nvme/host/core.c"
],
"defaultStatus": "affected"
}
]
}
],
"published": "2026-09-16T11:17:07.807",
"references": [
{
"url": "https://git.kernel.org/stable/c/3838e80fcfb32e62baffb63c6dc0a60153665a4d",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/7fad53ae2052a2b4fc7ca567d6555bdb1176ba35",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/a75258e651d91ec25424cd94d824d192c11ccc24",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/bb6dafa79040357cf5043836e1db108c2af8b1e1",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}
],
"vulnStatus": "Received",
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nnvme: skip the zoned limits update if the zone info query failed\n\nnvme_query_zone_info() returns either a negative errno or a positive\nNVMe status code, but nvme_update_ns_info_block() only tests for the\nnegative case:\n\n\tret = nvme_query_zone_info(ns, lbaf, &zi);\n\tif (ret < 0)\n\t\tgoto out;\n\nIf the device fails the Identify Namespace (I/O Command Set specific)\ncommand, or the Identify Controller command issued by\nnvme_set_max_append(), the positive status falls through and setup\ncontinues with the zero-initialized zone info. nvme_update_zone_info()\nthen marks the queue zoned with chunk_sectors and ns->head->zsze set to\nzero.\n\nblk_validate_zoned_limits() does not check chunk_sectors, so the limits\ncommit succeeds. blk_revalidate_disk_zones() does reject the zero zone\nsize, but by then the limits are live and nothing rolls them back, so\nI/O keeps being submitted to a zoned queue with a zero zone size and\ndisk_zone_no() shifts by ilog2(0):\n\n nvme0n1: Invalid non power of two zone size (0)\n UBSAN: shift-out-of-bounds in include/linux/blkdev.h:747:16\n shift exponent -1 is negative\n disk_zone_no include/linux/blkdev.h:747 [inline]\n bio_straddles_zones include/linux/blkdev.h:1058 [inline]\n blk_zone_wplug_handle_write block/blk-zoned.c:1423 [inline]\n blk_zone_plug_bio.cold+0x25/0x1c8 block/blk-zoned.c:1605\n blk_mq_submit_bio+0x18fb/0x2870 block/blk-mq.c:3196\n submit_bh_wbc+0x575/0x740 fs/buffer.c:2824\n __block_write_full_folio+0x728/0xdd0 fs/buffer.c:1933\n\nAny device, firmware or NVMe-oF target that fails this one command\nreaches this.\n\nSkip the zoned limits update in that case, and log which of the two\nthings happened: during a revalidation the queue keeps the zone\ngeometry it was last validated with, and on a first scan the namespace\nis registered without zoned limits, so that it is still available as a\nhandle for admin commands. Neither of the paths in\nnvme_query_zone_info() that return a positive status logs anything, so\nthe failure would otherwise be silent.\n\nzi.zone_size is an exact indicator: every path that returns a positive\nstatus returns before it is assigned, and after that the only failure\nleft is -ENODEV, which the caller already handles.\n\nFound by FuzzNvme."
}
],
"lastModified": "2026-10-03T11:17:45.013",
"sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}