media: as102: fix to not free memory after the device is registered in as102_usb_probe()
In the Linux kernel, the following vulnerability has been resolved: media: as102: fix to not free memory after the device is registered in as102_usb_probe() In as102_usb driver, the following race condition occurs: ``` CPU0 CPU1 as102_usb_probe() kzalloc(); // alloc as102_dev_t .... usb_register_dev(); fd = sys_open("/path/to/dev"); // open as102 fd .... usb_deregister_dev(); .... kfree(); // free as102_dev_t .... sys_close(fd); as102_release() // UAF!! as102_usb_release() kfree(); // DFB!! ``` When a USB character device registered with usb_register_dev() is later unregistered (via usb_deregister_dev() or disconnect), the device node is removed so new open() calls fail. However, file descriptors that are already open do not go away immediately: they remain valid until the last reference is dropped and the driver's .release() is invoked. In as102, as102_usb_probe() calls usb_register_dev() and then, on an error path, does usb_deregister_dev() and frees as102_dev_t right away. If userspace raced a successful open() before the deregistration, that open FD will later hit as102_release() --> as102_usb_release() and access or free as102_dev_t again, occur a race to use-after-free and double-free vuln. The fix is to never kfree(as102_dev_t) directly once usb_register_dev() has succeeded. After deregistration, defer freeing memory to .release(). In other words, let release() perform the last kfree when the final open FD is closed.
- Products
- Kernel
- Affected versions
- Not specified
- Fixed versions
- 5.10.258, 5.15.209, 6.1.175, 6.12.83, 6.18.24, 6.19.14, 6.6.136, 7.0.1
- CVEs
- CVE-2026-31578
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 5 Nov 2026, 02:05 UTC · Revision 1
Source evidence
media: as102: fix to not free memory after the device is registered in as102_usb_probe()
core-osv · Original sourcePublished 24 Apr 2026, 14:42 UTC
In the Linux kernel, the following vulnerability has been resolved: media: as102: fix to not free memory after the device is registered in as102_usb_probe() In as102_usb driver, the following race condition occurs: ``` CPU0 CPU1 as102_usb_probe() kzalloc(); // alloc as102_dev_t .... usb_register_dev(); fd = sys_open("/path/to/dev"); // open as102 fd .... usb_deregister_dev(); .... kfree(); // free as102_dev_t .... sys_close(fd); as102_release() // UAF!! as102_usb_release() kfree(); // DFB!! ``` When a USB character device registered with usb_register_dev() is later unregistered (via usb_deregister_dev() or disconnect), the device node is removed so new open() calls fail. However, file descriptors that are already open do not go away immediately: they remain valid until the last reference is dropped and the driver's .release() is invoked. In as102, as102_usb_probe() calls usb_register_dev() and then, on an error path, does usb_deregister_dev() and frees as102_dev_t right away. If userspace raced a successful open() before the deregistration, that open FD will later hit as102_release() --> as102_usb_release() and access or free as102_dev_t again, occur a race to use-after-free and double-free vuln. The fix is to never kfree(as102_dev_t) directly once usb_register_dev() has succeeded. After deregistration, defer freeing memory to .release(). In other words, let release() perform the last kfree when the final open FD is closed.
osv:CVE-2026-31578
Kernel
Fixed versions: 5.10.258, 5.15.209, 6.1.175, 6.6.136, 6.12.83, 6.18.24, 6.19.14, 7.0.1
Complete source record
{
"id": "c5e53dd2cc5e83fd844712173f8ccc33ca881192e01cd73a33beab345a32eaf0",
"url": "https://osv.dev/vulnerability/CVE-2026-31578",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "media: as102: fix to not free memory after the device is registered in as102_usb_probe()",
"summary": "In the Linux kernel, the following vulnerability has been resolved: media: as102: fix to not free memory after the device is registered in as102_usb_probe() In as102_usb driver, the following race condition occurs: ``` CPU0 CPU1 as102_usb_probe() kzalloc(); // alloc as102_dev_t .... usb_register_dev(); fd = sys_open(\"/path/to/dev\"); // open as102 fd .... usb_deregister_dev(); .... kfree(); // free as102_dev_t .... sys_close(fd); as102_release() // UAF!! as102_usb_release() kfree(); // DFB!! ``` When a USB character device registered with usb_register_dev() is later unregistered (via usb_deregister_dev() or disconnect), the device node is removed so new open() calls fail. However, file descriptors that are already open do not go away immediately: they remain valid until the last reference is dropped and the driver's .release() is invoked. In as102, as102_usb_probe() calls usb_register_dev() and then, on an error path, does usb_deregister_dev() and frees as102_dev_t right away. If userspace raced a successful open() before the deregistration, that open FD will later hit as102_release() --> as102_usb_release() and access or free as102_dev_t again, occur a race to use-after-free and double-free vuln. The fix is to never kfree(as102_dev_t) directly once usb_register_dev() has succeeded. After deregistration, defer freeing memory to .release(). In other words, let release() perform the last kfree when the final open FD is closed.",
"evidence": "osv:CVE-2026-31578",
"products": [
{
"name": {
"value": "Kernel",
"evidence": "/affected/1/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "5.10.258",
"evidence": "/affected/1/ranges"
},
{
"value": "5.15.209",
"evidence": "/affected/1/ranges"
},
{
"value": "6.1.175",
"evidence": "/affected/1/ranges"
},
{
"value": "6.6.136",
"evidence": "/affected/1/ranges"
},
{
"value": "6.12.83",
"evidence": "/affected/1/ranges"
},
{
"value": "6.18.24",
"evidence": "/affected/1/ranges"
},
{
"value": "6.19.14",
"evidence": "/affected/1/ranges"
},
{
"value": "7.0.1",
"evidence": "/affected/1/ranges"
}
],
"affected_versions": []
}
],
"severity": "unknown",
"structured": {
"id": "CVE-2026-31578",
"aliases": [
"CVE-2026-31578"
],
"affected": [
{
"ranges": [
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"type": "GIT",
"events": [
{
"introduced": "cd19f7d3e39b3160595d56bb3e3a2bf4f7f4669c"
},
{
"fixed": "0d36653a3a821e5a974798adb347b3ea09332914"
},
{
"fixed": "25d500cf391e384356a612b85cf60b353ad3cd0c"
},
{
"fixed": "07ceb444c8f627cf863864d4274b5a77769725ed"
},
{
"fixed": "cb8092038e95dc1113a68e63762de40fff61ba71"
},
{
"fixed": "582fbecb3756330006fe1950762412a68c2cacd2"
},
{
"fixed": "09e9206008b887aa553733bd915d73131071a086"
},
{
"fixed": "2eeae47a438694408189138048a786be99954032"
},
{
"fixed": "7e5aedf6059cba2a669d86caeaf5a51f33ec85a1"
},
{
"fixed": "8bd29dbe03fc5b0f039ab2395ff37b64236d2f0c"
}
]
}
],
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-31578.json"
}
},
{
"ranges": [
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "3.14.0"
},
{
"fixed": "5.10.258"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "5.11.0"
},
{
"fixed": "5.15.209"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "5.16.0"
},
{
"fixed": "6.1.175"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "6.2.0"
},
{
"fixed": "6.6.136"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "6.7.0"
},
{
"fixed": "6.12.83"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "6.13.0"
},
{
"fixed": "6.18.24"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "6.19.0"
},
{
"fixed": "6.19.14"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "6.20.0"
},
{
"fixed": "7.0.1"
}
]
}
],
"package": {
"name": "Kernel",
"ecosystem": "Linux"
},
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-31578.json"
}
}
],
"modified": "2026-10-28T02:30:41.791942538Z",
"provider": "osv",
"references": [
"https://git.kernel.org/stable/c/07ceb444c8f627cf863864d4274b5a77769725ed",
"https://git.kernel.org/stable/c/09e9206008b887aa553733bd915d73131071a086",
"https://git.kernel.org/stable/c/0d36653a3a821e5a974798adb347b3ea09332914",
"https://git.kernel.org/stable/c/25d500cf391e384356a612b85cf60b353ad3cd0c",
"https://git.kernel.org/stable/c/2eeae47a438694408189138048a786be99954032",
"https://git.kernel.org/stable/c/582fbecb3756330006fe1950762412a68c2cacd2",
"https://git.kernel.org/stable/c/7e5aedf6059cba2a669d86caeaf5a51f33ec85a1",
"https://git.kernel.org/stable/c/8bd29dbe03fc5b0f039ab2395ff37b64236d2f0c",
"https://git.kernel.org/stable/c/cb8092038e95dc1113a68e63762de40fff61ba71",
"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/31xxx/CVE-2026-31578.json",
"https://nvd.nist.gov/vuln/detail/CVE-2026-31578",
"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git"
],
"provider_metadata": {
"cna_assigner": "Linux",
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/31xxx/CVE-2026-31578.json"
}
},
"related_cves": [
{
"value": "CVE-2026-31578",
"evidence": "/id"
}
],
"security_relevant": true,
"severity_evidence": null
},
"source_id": "core-osv",
"document_id": 509340,
"published_at": "2026-04-24T14:42:09.519+00:00"
}