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

CVE-2026-89622 (GCVE-0-2026-89622)

Vulnerability from cvelistv5 – Published: 2026-09-11 19:45 – Updated: 2026-09-13 06:32
VLAI
Title
HID: mcp2221: clear rxbuf after I2C/SMBus transfer completes
Summary
In the Linux kernel, the following vulnerability has been resolved: HID: mcp2221: clear rxbuf after I2C/SMBus transfer completes mcp_i2c_smbus_read() stores the caller-supplied buffer pointer in mcp->rxbuf for the duration of a transfer but never clears it when the transfer finishes or times out. Once the caller frees or reuses the buffer, mcp->rxbuf becomes a dangling pointer. A delayed or spurious MCP2221_I2C_GET_DATA report can then drive mcp2221_raw_event() to memcpy device data into the freed memory, causing a write use-after-free. Route all return paths through a single exit point that clears mcp->rxbuf and mcp->rxbuf_size, so that the existing !mcp->rxbuf guard in the raw_event handler can reject any report arriving after the transfer has ended.
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: 67a95c21463d066060b0f66d65a75d45bb386ffb , < 03c34309eb1bce1b3b5f7c4a94b703f419120383 (git)
Affected: 67a95c21463d066060b0f66d65a75d45bb386ffb , < 968546b676d992dd1da3e057d40598231f725996 (git)
Affected: 67a95c21463d066060b0f66d65a75d45bb386ffb , < db2333f88729c8aae062cb171ed058725ff5c901 (git)
guessed Create a notification for this product.
Linux Linux Affected: 5.7
Unaffected: 0 , < 5.7 (semver)
Unaffected: 6.18.51 , ≤ 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/hid/hid-mcp2221.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "03c34309eb1bce1b3b5f7c4a94b703f419120383",
              "status": "affected",
              "version": "67a95c21463d066060b0f66d65a75d45bb386ffb",
              "versionType": "git"
            },
            {
              "lessThan": "968546b676d992dd1da3e057d40598231f725996",
              "status": "affected",
              "version": "67a95c21463d066060b0f66d65a75d45bb386ffb",
              "versionType": "git"
            },
            {
              "lessThan": "db2333f88729c8aae062cb171ed058725ff5c901",
              "status": "affected",
              "version": "67a95c21463d066060b0f66d65a75d45bb386ffb",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "drivers/hid/hid-mcp2221.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "5.7"
            },
            {
              "lessThan": "5.7",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.18.*",
              "status": "unaffected",
              "version": "6.18.51",
              "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.18.51",
                  "versionStartIncluding": "5.7",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.4",
                  "versionStartIncluding": "5.7",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3-rc1",
                  "versionStartIncluding": "5.7",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nHID: mcp2221: clear rxbuf after I2C/SMBus transfer completes\n\nmcp_i2c_smbus_read() stores the caller-supplied buffer pointer in\nmcp-\u003erxbuf for the duration of a transfer but never clears it when the\ntransfer finishes or times out. Once the caller frees or reuses the\nbuffer, mcp-\u003erxbuf becomes a dangling pointer. A delayed or spurious\nMCP2221_I2C_GET_DATA report can then drive mcp2221_raw_event() to\nmemcpy device data into the freed memory, causing a write\nuse-after-free.\n\nRoute all return paths through a single exit point that clears\nmcp-\u003erxbuf and mcp-\u003erxbuf_size, so that the existing !mcp-\u003erxbuf guard\nin the raw_event handler can reject any report arriving after the\ntransfer has ended."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 7.8,
            "baseSeverity": "HIGH",
            "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
            "version": "3.1"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "AV:L - A local attacker can bind hid-mcp2221 by forging BUS_USB 04d8:00dd via UHID_CREATE2 on /dev/uhid (no hid_is_usb() guard), then issue I2C_RDWR/I2C_SMBUS reads on the resulting /dev/i2c-N so mcp_i2c_smbus_read() leaves mcp-\u003erxbuf dangling; a malicious USB MCP2221 is only a lower-severity physical path.\nAC:L - The attacker controls both sides: they start the I2C/SMBus read that stores the bounce buffer in mcp-\u003erxbuf, let mcp_i2c_smbus_read() return without clearing it (timeout or completed xfer), then inject a delayed MCP2221_I2C_GET_DATA report via UHID_INPUT so mcp2221_raw_event() memcpy\u0027s into the already-freed buffer.\nPR:L - Neither uhid_dev_create2() nor i2cdev_open() checks capabilities; access is DAC on /dev/uhid and /dev/i2c-*, which udev uaccess-tags for the seat user and which are commonly 0660 root:i2c on embedded/industrial MCP2221 systems, i.e. low privilege rather than real init-namespace root.\nUI:N - The attacker creates the uhid device, issues the I2C/SMBus read ioctl, and injects the delayed HID input report from their own process; no separate victim action is required.\nS:U - The write use-after-free corrupts host-kernel heap or returned SMBus stack under the kernel\u0027s own authority and is ordinary local privilege-escalation/DoS, with no VM escape, IOMMU bypass, or other cross-authority impact.\nC:H - mcp2221_raw_event() memcpy\u0027s attacker-controlled HID payload into a freed I2C bounce buffer (up to 60 bytes per report, repeatable up to the attacker-chosen rxbuf_size of 8192 via I2C_RDWR); a write UAF of a sprayed slab object yields an arbitrary kernel read primitive.\nI:H - The same memcpy is a write use-after-free of attacker-controlled bytes into freed kernel memory; with heap spraying this is an arbitrary-write and control-flow hijack primitive, so integrity impact is High per UAF guidance.\nA:H - Writing into the freed i2c-dev bounce buffer or returned SMBus stack object can oops or panic the kernel even when not fully exploited, and the dangling mcp-\u003erxbuf persists until the next read so the crash is retriggerable at will."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-13T06:32:02.209Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/03c34309eb1bce1b3b5f7c4a94b703f419120383"
        },
        {
          "url": "https://git.kernel.org/stable/c/968546b676d992dd1da3e057d40598231f725996"
        },
        {
          "url": "https://git.kernel.org/stable/c/db2333f88729c8aae062cb171ed058725ff5c901"
        }
      ],
      "title": "HID: mcp2221: clear rxbuf after I2C/SMBus transfer completes",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-89622",
    "datePublished": "2026-09-11T19:45:20.090Z",
    "dateReserved": "2026-09-11T19:38:34.737Z",
    "dateUpdated": "2026-09-13T06:32:02.209Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-89622",
      "date": "2026-09-16",
      "epss": "0.00157",
      "percentile": "0.05254"
    },
    "nvd": "{\"cve\":{\"id\":\"CVE-2026-89622\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-09-11T20:19:47.517\",\"lastModified\":\"2026-09-13T07:17:27.677\",\"vulnStatus\":\"Received\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\nHID: mcp2221: clear rxbuf after I2C/SMBus transfer completes\\n\\nmcp_i2c_smbus_read() stores the caller-supplied buffer pointer in\\nmcp-\u003erxbuf for the duration of a transfer but never clears it when the\\ntransfer finishes or times out. Once the caller frees or reuses the\\nbuffer, mcp-\u003erxbuf becomes a dangling pointer. A delayed or spurious\\nMCP2221_I2C_GET_DATA report can then drive mcp2221_raw_event() to\\nmemcpy device data into the freed memory, causing a write\\nuse-after-free.\\n\\nRoute all return paths through a single exit point that clears\\nmcp-\u003erxbuf and mcp-\u003erxbuf_size, so that the existing !mcp-\u003erxbuf guard\\nin the raw_event handler can reject any report arriving after the\\ntransfer has ended.\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"drivers/hid/hid-mcp2221.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"67a95c21463d066060b0f66d65a75d45bb386ffb\",\"lessThan\":\"03c34309eb1bce1b3b5f7c4a94b703f419120383\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"67a95c21463d066060b0f66d65a75d45bb386ffb\",\"lessThan\":\"968546b676d992dd1da3e057d40598231f725996\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"67a95c21463d066060b0f66d65a75d45bb386ffb\",\"lessThan\":\"db2333f88729c8aae062cb171ed058725ff5c901\",\"versionType\":\"git\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"drivers/hid/hid-mcp2221.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"5.7\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"5.7\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.18.51\",\"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:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H\",\"baseScore\":7.8,\"baseSeverity\":\"HIGH\",\"attackVector\":\"LOCAL\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"LOW\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"HIGH\",\"integrityImpact\":\"HIGH\",\"availabilityImpact\":\"HIGH\"},\"exploitabilityScore\":1.8,\"impactScore\":5.9}]},\"references\":[{\"url\":\"https://git.kernel.org/stable/c/03c34309eb1bce1b3b5f7c4a94b703f419120383\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/968546b676d992dd1da3e057d40598231f725996\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/db2333f88729c8aae062cb171ed058725ff5c901\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}",
    "redhat_vex": {
      "aggregate_severity": "Moderate",
      "current_release_date": "2026-09-14T09:58:49+00:00",
      "cve": "CVE-2026-89622",
      "id": "CVE-2026-89622",
      "initial_release_date": "2026-09-11T00:00:00+00:00",
      "product_status:known_not_affected": "276",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: HID: mcp2221: clear rxbuf after I2C/SMBus transfer completes",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-89622.json",
      "version": "3"
    },
    "suse_vex": {
      "aggregate_severity": "important",
      "current_release_date": "2026-09-16T00:01:29Z",
      "cve": "CVE-2026-89622",
      "id": "CVE-2026-89622",
      "initial_release_date": "2026-09-12T16:24:51Z",
      "product_status:known_affected": "210",
      "product_status:known_not_affected": "143",
      "source": "SUSE CSAF VEX",
      "status": "interim",
      "title": "SUSE CVE CVE-2026-89622",
      "url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2026-89622.json",
      "version": "4"
    }
  }
}



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…