CVE-2026-99050 (GCVE-0-2026-99050)
Vulnerability from cvelistv5
Published
2026-10-23 12:22
Modified
2026-10-24 14:10
Severity ?
VLAI Severity ?
EPSS score ?
Summary
In the Linux kernel, the following vulnerability has been resolved:
gpio: mpsse: fix race when arming the IRQ poll worker
gpio_mpsse_irq_enable() arms the poll worker before publishing it:
schedule_work() runs before the worker is added to priv->workers. If
gpio_mpsse_disconnect() walks the list in that window it misses the
worker, and once disconnect returns, the USB core frees mpsse_priv
while the orphaned gpio_mpsse_poll() work keeps accessing it, causing
a use-after-free.
Fix this by publishing and arming the worker in one irq_spin
critical section. Teardown walks the same list under irq_spin, so a
worker found on the list is guaranteed to be armed, and
cancel_work_sync() handles it whether it is queued or running.
A worker armed after the disconnect walk would still be missed, so
also set a new priv->dying flag under irq_spin before the teardown
walk, and check it in the same critical section, freeing it via
kfree_rcu() instead when the device is going away, since kfree()
would be called with the IRQ core's raw spinlock held and may sleep
on PREEMPT_RT. schedule_work() is safe to call with irq_spin held,
and the next probe gets a fresh mpsse_priv, so the flag never needs
to be cleared.
This issue was found by an in-house static analysis tool.
References
Impacted products
{
"containers": {
"cna": {
"affected": [
{
"defaultStatus": "unaffected",
"product": "Linux",
"programFiles": [
"drivers/gpio/gpio-mpsse.c"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"lessThan": "76390ac0bca7e5058b7482eb4d951c3bda5df812",
"status": "affected",
"version": "472d900c8bcac301ae0e40fdca7db799bd989ff5",
"versionType": "git"
},
{
"lessThan": "c0071ee496e1228976c72b096f529503222708a0",
"status": "affected",
"version": "179ef1127d7a4f09f0e741fa9f30b8a8e7886271",
"versionType": "git"
},
{
"lessThan": "7efa1a1953cd6b20b23a3524d5b4b81789c6ef25",
"status": "affected",
"version": "179ef1127d7a4f09f0e741fa9f30b8a8e7886271",
"versionType": "git"
},
{
"lessThan": "6.18.57",
"status": "affected",
"version": "6.18.6",
"versionType": "semver"
}
]
},
{
"defaultStatus": "affected",
"product": "Linux",
"programFiles": [
"drivers/gpio/gpio-mpsse.c"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"status": "affected",
"version": "6.19"
},
{
"lessThan": "6.19",
"status": "unaffected",
"version": "0",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.18.*",
"status": "unaffected",
"version": "6.18.57",
"versionType": "semver"
},
{
"lessThanOrEqual": "7.2.*",
"status": "unaffected",
"version": "7.2.11",
"versionType": "semver"
},
{
"lessThanOrEqual": "*",
"status": "unaffected",
"version": "7.3",
"versionType": "original_commit_for_fix"
}
]
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.18.57",
"versionStartIncluding": "6.18.6",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "7.2.11",
"versionStartIncluding": "6.19",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "7.3",
"versionStartIncluding": "6.19",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
]
}
],
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\ngpio: mpsse: fix race when arming the IRQ poll worker\n\ngpio_mpsse_irq_enable() arms the poll worker before publishing it:\nschedule_work() runs before the worker is added to priv-\u003eworkers. If\ngpio_mpsse_disconnect() walks the list in that window it misses the\nworker, and once disconnect returns, the USB core frees mpsse_priv\nwhile the orphaned gpio_mpsse_poll() work keeps accessing it, causing\na use-after-free.\n\nFix this by publishing and arming the worker in one irq_spin\ncritical section. Teardown walks the same list under irq_spin, so a\nworker found on the list is guaranteed to be armed, and\ncancel_work_sync() handles it whether it is queued or running.\n\nA worker armed after the disconnect walk would still be missed, so\nalso set a new priv-\u003edying flag under irq_spin before the teardown\nwalk, and check it in the same critical section, freeing it via\nkfree_rcu() instead when the device is going away, since kfree()\nwould be called with the IRQ core\u0027s raw spinlock held and may sleep\non PREEMPT_RT. schedule_work() is safe to call with irq_spin held,\nand the next probe gets a fresh mpsse_priv, so the flag never needs\nto be cleared.\n\nThis issue was found by an in-house static analysis tool."
}
],
"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 process can race GPIO_V2_GET_LINE_IOCTL -\u003e linereq_create() -\u003e edge_detector_setup() -\u003e request_threaded_irq() -\u003e gpio_mpsse_irq_enable() against USBDEVFS_IOCTL/USBDEVFS_DISCONNECT -\u003e usb_driver_release_interface() -\u003e gpio_mpsse_disconnect(); no network input reaches the bug.\nAC:L - The attacker can issue the GPIO line-event request and USBFS unbind concurrently and repeat after rebinding; both sides of the schedule_work()-before-list_add() window are attacker-controlled.\nPR:L - Neither gpio_ioctl() nor the USBDEVFS_DISCONNECT path performs a capability check; the process only needs non-root DAC/ACL access to /dev/gpiochipN and writable access to the matching /dev/bus/usb node.\nUI:N - The same process submits the line-event and USB disconnect ioctls that create the race, so no action by another user is required.\nS:U - The freed mpsse_priv and orphaned gpio_mpsse_poll() worker are both in the host kernel; the path crosses no VM, IOMMU, or other security authority.\nC:H - gpio_mpsse_poll() continues through attacker-reclaimable mpsse_priv fields, including GPIO, IRQ-domain, USB-buffer, and interface pointers; the resulting UAF and write primitive can yield kernel code execution and unrestricted reads.\nI:H - gpio_mpsse_poll() locks and traverses priv-\u003eworkers after priv is freed; reclaiming that allocation lets controlled list pointers reach list_del(), providing attacker-directed kernel writes and control-flow corruption.\nA:H - The orphaned gpio_mpsse_poll() can access freed mutex, spinlock, and list state, or use the NULL/stale priv-\u003eintf in MPSSE I/O, causing an oops or kernel panic."
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-10-24T14:10:11.370Z",
"orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"shortName": "Linux"
},
"references": [
{
"url": "https://git.kernel.org/stable/c/76390ac0bca7e5058b7482eb4d951c3bda5df812"
},
{
"url": "https://git.kernel.org/stable/c/c0071ee496e1228976c72b096f529503222708a0"
},
{
"url": "https://git.kernel.org/stable/c/7efa1a1953cd6b20b23a3524d5b4b81789c6ef25"
}
],
"title": "gpio: mpsse: fix race when arming the IRQ poll worker",
"x_generator": {
"engine": "bippy-1.2.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"assignerShortName": "Linux",
"cveId": "CVE-2026-99050",
"datePublished": "2026-10-23T12:22:29.204Z",
"dateReserved": "2026-09-25T10:25:14.388Z",
"dateUpdated": "2026-10-24T14:10:11.370Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
Loading…
Loading…
Sightings
| Author | Source | Type | Date |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
- Confirmed: The vulnerability is confirmed from an analyst perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
- Patched: This vulnerability was successfully patched by the user reporting the sighting.
- Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
- Not confirmed: The user expresses doubt about the veracity of the vulnerability.
- Not patched: This vulnerability was not successfully patched by the user reporting the sighting.
Loading…
Loading…