GCVE Workshop - 22 September 2026 (14:00-18:00), Luxembourg Before The Vulnopticon Conference - Registration

CVE-2026-89481 (GCVE-0-2026-89481)

Vulnerability from cvelistv5 – Published: 2026-09-11 19:43 – Updated: 2026-09-14 12:00
VLAI
Title
nvme-tcp: fix host memory disclosure on R2T for a read command
Summary
In the Linux kernel, the following vulnerability has been resolved: nvme-tcp: fix host memory disclosure on R2T for a read command nvme_tcp_handle_r2t() does not check the direction of the request the R2T refers to. A malicious controller can send an R2T for a READ and the host will answer it: nvme_tcp_setup_h2c_data_pdu() builds the H2CData header and nvme_tcp_try_send_data() sends the request's data buffer. That buffer is the READ destination, so its contents go to the controller. The command then completes normally and nothing is logged. Against a test controller that answers every READ with an R2T, a 4096 byte buffered read returned all 4096 bytes, split over two R2Ts. The pages contained stale kernel data, including an array of struct page pointers. Reject an R2T for a request that is not a write.
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: 3f2304f8c6d6ed97849057bd16fee99e434ca796 , < 49a4dcf57608ebf6432dbcb203ed25e7ed581445 (git)
Affected: 3f2304f8c6d6ed97849057bd16fee99e434ca796 , < bc4013c7cce58d46f792c8c87bc8c8318a70190e (git)
Affected: 3f2304f8c6d6ed97849057bd16fee99e434ca796 , < a4c3c7310156493797c920b10d8648c07aa05403 (git)
Affected: 3f2304f8c6d6ed97849057bd16fee99e434ca796 , < 3b3d27670c0c890ba7cf1bc3614cab61bde6d25c (git)
Affected: 3f2304f8c6d6ed97849057bd16fee99e434ca796 , < 3a0b05145053a5fad1a2ddb4e4d87b07385e63e5 (git)
Affected: 3f2304f8c6d6ed97849057bd16fee99e434ca796 , < 6efbc52237facda35d2d874fe1765bb4839275d8 (git)
guessed Create a notification for this product.
Linux Linux Affected: 5.0
Unaffected: 0 , < 5.0 (semver)
Unaffected: 6.1.188 , ≤ 6.1.* (semver)
Unaffected: 6.6.157 , ≤ 6.6.* (semver)
Unaffected: 6.12.109 , ≤ 6.12.* (semver)
Unaffected: 6.18.50 , ≤ 6.18.* (semver)
Unaffected: 7.2.4 , ≤ 7.2.* (semver)
Unaffected: 7.3-rc1 , ≤ * (original_commit_for_fix)
guessed Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "drivers/nvme/host/tcp.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "49a4dcf57608ebf6432dbcb203ed25e7ed581445",
              "status": "affected",
              "version": "3f2304f8c6d6ed97849057bd16fee99e434ca796",
              "versionType": "git"
            },
            {
              "lessThan": "bc4013c7cce58d46f792c8c87bc8c8318a70190e",
              "status": "affected",
              "version": "3f2304f8c6d6ed97849057bd16fee99e434ca796",
              "versionType": "git"
            },
            {
              "lessThan": "a4c3c7310156493797c920b10d8648c07aa05403",
              "status": "affected",
              "version": "3f2304f8c6d6ed97849057bd16fee99e434ca796",
              "versionType": "git"
            },
            {
              "lessThan": "3b3d27670c0c890ba7cf1bc3614cab61bde6d25c",
              "status": "affected",
              "version": "3f2304f8c6d6ed97849057bd16fee99e434ca796",
              "versionType": "git"
            },
            {
              "lessThan": "3a0b05145053a5fad1a2ddb4e4d87b07385e63e5",
              "status": "affected",
              "version": "3f2304f8c6d6ed97849057bd16fee99e434ca796",
              "versionType": "git"
            },
            {
              "lessThan": "6efbc52237facda35d2d874fe1765bb4839275d8",
              "status": "affected",
              "version": "3f2304f8c6d6ed97849057bd16fee99e434ca796",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "drivers/nvme/host/tcp.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "5.0"
            },
            {
              "lessThan": "5.0",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.1.*",
              "status": "unaffected",
              "version": "6.1.188",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.6.*",
              "status": "unaffected",
              "version": "6.6.157",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.109",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.18.*",
              "status": "unaffected",
              "version": "6.18.50",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "7.2.*",
              "status": "unaffected",
              "version": "7.2.4",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "7.3-rc1",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.1.188",
                  "versionStartIncluding": "5.0",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.6.157",
                  "versionStartIncluding": "5.0",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.12.109",
                  "versionStartIncluding": "5.0",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.50",
                  "versionStartIncluding": "5.0",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.4",
                  "versionStartIncluding": "5.0",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3-rc1",
                  "versionStartIncluding": "5.0",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nnvme-tcp: fix host memory disclosure on R2T for a read command\n\nnvme_tcp_handle_r2t() does not check the direction of the request the\nR2T refers to. A malicious controller can send an R2T for a READ and\nthe host will answer it: nvme_tcp_setup_h2c_data_pdu() builds the\nH2CData header and nvme_tcp_try_send_data() sends the request\u0027s data\nbuffer. That buffer is the READ destination, so its contents go to the\ncontroller.\n\nThe command then completes normally and nothing is logged.\n\nAgainst a test controller that answers every READ with an R2T, a 4096\nbyte buffered read returned all 4096 bytes, split over two R2Ts. The\npages contained stale kernel data, including an array of struct page\npointers.\n\nReject an R2T for a request that is not a write."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 7.5,
            "baseSeverity": "HIGH",
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
            "version": "3.1"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "AV:N - The bug is in the NVMe-over-TCP host PDU receive path (nvme_tcp_recv_skb \u2192 nvme_tcp_handle_r2t). A remote NVMe-oF target or on-path attacker sends an R2T PDU over TCP (port 4420) and the host splices the READ destination buffer back over that socket.\nAC:L - A malicious controller that replies to an in-flight READ with a well-formed R2T always triggers the leak; the reporter reproduced a full 4096-byte disclosure with a test target. No race, special memory layout, or rare config beyond CONFIG_NVME_TCP is required.\nPR:N - NVMe/TCP requires no authentication by default (TLS and DH-HMAC-CHAP are optional and off in stock configs), so the remote peer needs no privileges or credentials on the victim host; it simply answers I/O the host is already sending.\nUI:N - No victim action is required at exploit time; once the host is connected (including via nvmf-autoconnect at boot), ordinary filesystem or block I/O issues READ commands and the malicious target triggers the leak by replying with R2T PDUs.\nS:U - The disclosure is of the host kernel\u0027s own I/O buffers and page-cache pages to the connected target. No VM, IOMMU, or sandbox boundary is crossed.\nC:H - nvme_tcp_try_send_data() splices the READ destination pages to the attacker. Those pages hold stale kernel memory (reproduced: 4096 bytes including struct page pointers). Every subsequent READ can leak another MDTS-sized buffer of recycled kernel pages.\nI:N - The host only transmits existing buffer contents; the bug does not write attacker-controlled data into kernel memory, corrupt kernel structures, or provide a write or control-flow hijack primitive.\nA:N - The malformed R2T path completes the command successfully with nothing logged; the reporter observed a silent disclosure with no oops, panic, hang, or other availability impact."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-14T12:00:18.149Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/49a4dcf57608ebf6432dbcb203ed25e7ed581445"
        },
        {
          "url": "https://git.kernel.org/stable/c/bc4013c7cce58d46f792c8c87bc8c8318a70190e"
        },
        {
          "url": "https://git.kernel.org/stable/c/a4c3c7310156493797c920b10d8648c07aa05403"
        },
        {
          "url": "https://git.kernel.org/stable/c/3b3d27670c0c890ba7cf1bc3614cab61bde6d25c"
        },
        {
          "url": "https://git.kernel.org/stable/c/3a0b05145053a5fad1a2ddb4e4d87b07385e63e5"
        },
        {
          "url": "https://git.kernel.org/stable/c/6efbc52237facda35d2d874fe1765bb4839275d8"
        }
      ],
      "title": "nvme-tcp: fix host memory disclosure on R2T for a read command",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-89481",
    "datePublished": "2026-09-11T19:43:36.589Z",
    "dateReserved": "2026-09-11T19:38:34.711Z",
    "dateUpdated": "2026-09-14T12:00:18.149Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-89481",
      "date": "2026-09-15",
      "epss": "0.00413",
      "percentile": "0.34824"
    },
    "microsoft_vex": {
      "current_release_date": "2026-09-14T15:01:50.000Z",
      "cve": "CVE-2026-89481",
      "id": "msrc_CVE-2026-89481",
      "initial_release_date": "2026-09-13T01:13:57.000Z",
      "product_status:known_affected": "1",
      "source": "Microsoft CSAF VEX",
      "status": "final",
      "title": "nvme-tcp: fix host memory disclosure on R2T for a read command",
      "url": "https://msrc.microsoft.com/csaf/vex/2026/msrc_cve-2026-89481.json",
      "version": "2"
    },
    "nvd": "{\"cve\":{\"id\":\"CVE-2026-89481\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-09-11T20:19:29.600\",\"lastModified\":\"2026-09-14T13:19:04.780\",\"vulnStatus\":\"Received\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\nnvme-tcp: fix host memory disclosure on R2T for a read command\\n\\nnvme_tcp_handle_r2t() does not check the direction of the request the\\nR2T refers to. A malicious controller can send an R2T for a READ and\\nthe host will answer it: nvme_tcp_setup_h2c_data_pdu() builds the\\nH2CData header and nvme_tcp_try_send_data() sends the request\u0027s data\\nbuffer. That buffer is the READ destination, so its contents go to the\\ncontroller.\\n\\nThe command then completes normally and nothing is logged.\\n\\nAgainst a test controller that answers every READ with an R2T, a 4096\\nbyte buffered read returned all 4096 bytes, split over two R2Ts. The\\npages contained stale kernel data, including an array of struct page\\npointers.\\n\\nReject an R2T for a request that is not a write.\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"drivers/nvme/host/tcp.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"3f2304f8c6d6ed97849057bd16fee99e434ca796\",\"lessThan\":\"49a4dcf57608ebf6432dbcb203ed25e7ed581445\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"3f2304f8c6d6ed97849057bd16fee99e434ca796\",\"lessThan\":\"bc4013c7cce58d46f792c8c87bc8c8318a70190e\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"3f2304f8c6d6ed97849057bd16fee99e434ca796\",\"lessThan\":\"a4c3c7310156493797c920b10d8648c07aa05403\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"3f2304f8c6d6ed97849057bd16fee99e434ca796\",\"lessThan\":\"3b3d27670c0c890ba7cf1bc3614cab61bde6d25c\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"3f2304f8c6d6ed97849057bd16fee99e434ca796\",\"lessThan\":\"3a0b05145053a5fad1a2ddb4e4d87b07385e63e5\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"3f2304f8c6d6ed97849057bd16fee99e434ca796\",\"lessThan\":\"6efbc52237facda35d2d874fe1765bb4839275d8\",\"versionType\":\"git\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"drivers/nvme/host/tcp.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"5.0\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"5.0\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.1.188\",\"lessThanOrEqual\":\"6.1.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.6.157\",\"lessThanOrEqual\":\"6.6.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.12.109\",\"lessThanOrEqual\":\"6.12.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.18.50\",\"lessThanOrEqual\":\"6.18.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"7.2.4\",\"lessThanOrEqual\":\"7.2.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"7.3-rc1\",\"lessThanOrEqual\":\"*\",\"versionType\":\"original_commit_for_fix\",\"status\":\"unaffected\"}]}]}],\"metrics\":{\"cvssMetricV31\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"type\":\"Secondary\",\"cvssData\":{\"version\":\"3.1\",\"vectorString\":\"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N\",\"baseScore\":7.5,\"baseSeverity\":\"HIGH\",\"attackVector\":\"NETWORK\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"NONE\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"HIGH\",\"integrityImpact\":\"NONE\",\"availabilityImpact\":\"NONE\"},\"exploitabilityScore\":3.9,\"impactScore\":3.6}]},\"references\":[{\"url\":\"https://git.kernel.org/stable/c/3a0b05145053a5fad1a2ddb4e4d87b07385e63e5\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/3b3d27670c0c890ba7cf1bc3614cab61bde6d25c\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/49a4dcf57608ebf6432dbcb203ed25e7ed581445\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/6efbc52237facda35d2d874fe1765bb4839275d8\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/a4c3c7310156493797c920b10d8648c07aa05403\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/bc4013c7cce58d46f792c8c87bc8c8318a70190e\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}",
    "redhat_vex": {
      "aggregate_severity": "Moderate",
      "current_release_date": "2026-09-13T06:56:07+00:00",
      "cve": "CVE-2026-89481",
      "id": "CVE-2026-89481",
      "initial_release_date": "2026-09-11T19:43:36.589000+00:00",
      "product_status:known_affected": "2",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: Linux kernel (nvme-tcp): Host memory disclosure",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-89481.json",
      "version": "3"
    },
    "suse_vex": {
      "aggregate_severity": "important",
      "current_release_date": "2026-09-16T00:03:07Z",
      "cve": "CVE-2026-89481",
      "id": "CVE-2026-89481",
      "initial_release_date": "2026-09-12T16:27:45Z",
      "product_status:known_affected": "347",
      "product_status:known_not_affected": "6",
      "source": "SUSE CSAF VEX",
      "status": "interim",
      "title": "SUSE CVE CVE-2026-89481",
      "url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2026-89481.json",
      "version": "3"
    }
  }
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

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…

Detection rules are retrieved from Rulezet.

Loading…

Loading…

Related by attack behaviour

Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.


Loading…