{"affected": [{"affectedData": [{"defaultStatus": "unaffected", "product": "Linux", "programFiles": ["drivers/media/usb/as102/as102_usb_drv.c"], "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "vendor": "Linux", "versions": [{"lessThan": "0d36653a3a821e5a974798adb347b3ea09332914", "status": "affected", "version": "cd19f7d3e39b3160595d56bb3e3a2bf4f7f4669c", "versionType": "git"}, {"lessThan": "25d500cf391e384356a612b85cf60b353ad3cd0c", "status": "affected", "version": "cd19f7d3e39b3160595d56bb3e3a2bf4f7f4669c", "versionType": "git"}, {"lessThan": "07ceb444c8f627cf863864d4274b5a77769725ed", "status": "affected", "version": "cd19f7d3e39b3160595d56bb3e3a2bf4f7f4669c", "versionType": "git"}, {"lessThan": "cb8092038e95dc1113a68e63762de40fff61ba71", "status": "affected", "version": "cd19f7d3e39b3160595d56bb3e3a2bf4f7f4669c", "versionType": "git"}, {"lessThan": "582fbecb3756330006fe1950762412a68c2cacd2", "status": "affected", "version": "cd19f7d3e39b3160595d56bb3e3a2bf4f7f4669c", "versionType": "git"}, {"lessThan": "09e9206008b887aa553733bd915d73131071a086", "status": "affected", "version": "cd19f7d3e39b3160595d56bb3e3a2bf4f7f4669c", "versionType": "git"}, {"lessThan": "2eeae47a438694408189138048a786be99954032", "status": "affected", "version": "cd19f7d3e39b3160595d56bb3e3a2bf4f7f4669c", "versionType": "git"}, {"lessThan": "7e5aedf6059cba2a669d86caeaf5a51f33ec85a1", "status": "affected", "version": "cd19f7d3e39b3160595d56bb3e3a2bf4f7f4669c", "versionType": "git"}, {"lessThan": "8bd29dbe03fc5b0f039ab2395ff37b64236d2f0c", "status": "affected", "version": "cd19f7d3e39b3160595d56bb3e3a2bf4f7f4669c", "versionType": "git"}]}, {"defaultStatus": "affected", "product": "Linux", "programFiles": ["drivers/media/usb/as102/as102_usb_drv.c"], "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "vendor": "Linux", "versions": [{"status": "affected", "version": "3.14"}, {"lessThan": "3.14", "status": "unaffected", "version": "0", "versionType": "semver"}, {"lessThanOrEqual": "5.10.*", "status": "unaffected", "version": "5.10.258", "versionType": "semver"}, {"lessThanOrEqual": "5.15.*", "status": "unaffected", "version": "5.15.209", "versionType": "semver"}, {"lessThanOrEqual": "6.1.*", "status": "unaffected", "version": "6.1.175", "versionType": "semver"}, {"lessThanOrEqual": "6.6.*", "status": "unaffected", "version": "6.6.136", "versionType": "semver"}, {"lessThanOrEqual": "6.12.*", "status": "unaffected", "version": "6.12.83", "versionType": "semver"}, {"lessThanOrEqual": "6.18.*", "status": "unaffected", "version": "6.18.24", "versionType": "semver"}, {"lessThanOrEqual": "6.19.*", "status": "unaffected", "version": "6.19.14", "versionType": "semver"}, {"lessThanOrEqual": "7.0.*", "status": "unaffected", "version": "7.0.1", "versionType": "semver"}, {"lessThanOrEqual": "*", "status": "unaffected", "version": "7.1", "versionType": "original_commit_for_fix"}]}], "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"}], "configurations": [{"nodes": [{"cpeMatch": [{"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "matchCriteriaId": "14109CEF-714B-4029-A318-97AA58A01833", "versionEndExcluding": "6.6.136", "vulnerable": true}, {"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "matchCriteriaId": "7F0AE5B5-23AC-4DCC-B37A-51CA1DAE7BA8", "versionEndExcluding": "6.12.83", "versionStartIncluding": "6.7", "vulnerable": true}, {"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "matchCriteriaId": "8126B8B8-6D0B-4443-86C1-672AEE893555", "versionEndExcluding": "6.18.24", "versionStartIncluding": "6.13", "vulnerable": true}, {"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "matchCriteriaId": "D6A8A074-BBF4-4803-ABED-519A839435BB", "versionEndExcluding": "6.19.14", "versionStartIncluding": "6.19", "vulnerable": true}, {"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "matchCriteriaId": "9B5888AB-7403-4335-89E4-21CC0B48366A", "versionEndExcluding": "7.0.1", "versionStartIncluding": "7.0", "vulnerable": true}], "negate": false, "operator": "OR"}]}], "cveTags": [], "descriptions": [{"lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nmedia: as102: fix to not free memory after the device is registered in as102_usb_probe()\n\nIn as102_usb driver, the following race condition occurs:\n```\n\t\tCPU0\t\t\t\t\t\tCPU1\nas102_usb_probe()\n kzalloc(); // alloc as102_dev_t\n ....\n usb_register_dev();\n\t\t\t\t\t\tfd = sys_open(\"/path/to/dev\"); // open as102 fd\n\t\t\t\t\t\t....\n usb_deregister_dev();\n ....\n kfree(); // free as102_dev_t\n ....\n\t\t\t\t\t\tsys_close(fd);\n\t\t\t\t\t\t as102_release() // UAF!!\n\t\t\t\t\t\t as102_usb_release()\n\t\t\t\t\t\t kfree(); // DFB!!\n```\n\nWhen a USB character device registered with usb_register_dev() is later\nunregistered (via usb_deregister_dev() or disconnect), the device node is\nremoved so new open() calls fail. However, file descriptors that are\nalready open do not go away immediately: they remain valid until the last\nreference is dropped and the driver's .release() is invoked.\n\nIn as102, as102_usb_probe() calls usb_register_dev() and then, on an\nerror path, does usb_deregister_dev() and frees as102_dev_t right away.\nIf userspace raced a successful open() before the deregistration, that\nopen FD will later hit as102_release() --> as102_usb_release() and access\nor free as102_dev_t again, occur a race to use-after-free and\ndouble-free vuln.\n\nThe fix is to never kfree(as102_dev_t) directly once usb_register_dev()\nhas succeeded. After deregistration, defer freeing memory to .release().\n\nIn other words, let release() perform the last kfree when the final open\nFD is closed."}, {"lang": "es", "value": "En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:\n\nmedia: as102: correcci\u00f3n para no liberar memoria despu\u00e9s de que el dispositivo es registrado en as102_usb_probe()\n\nEn el controlador as102_usb, la siguiente condici\u00f3n de carrera ocurre:\n\u201d\u201d\u201c\n\t\tCPU0\t\t\t\t\t\tCPU1\nas102_usb_probe()\n kzalloc(); // alloc as102_dev_t\n ....\n usb_register_dev();\n\t\t\t\t\t\tfd = sys_open(\u201c/path/to/dev\u201d); // open as102 fd\n\t\t\t\t\t\t....\n usb_deregister_dev();\n ....\n kfree(); // free as102_dev_t\n ....\n\t\t\t\t\t\tsys_close(fd);\n\t\t\t\t\t\t as102_release() // UAF!!\n\t\t\t\t\t\t as102_usb_release()\n\t\t\t\t\t\t kfree(); // DFB!!\n\u201d\u201d\u201d\n\nCuando un dispositivo de caracteres USB registrado con usb_register_dev() es posteriormente desregistrado (a trav\u00e9s de usb_deregister_dev() o desconexi\u00f3n), el nodo del dispositivo es eliminado por lo que las nuevas llamadas a open() fallan. Sin embargo, los descriptores de archivo que ya est\u00e1n abiertos no desaparecen inmediatamente: permanecen v\u00e1lidos hasta que la \u00faltima referencia es eliminada y se invoca el .release() del controlador.\n\nEn as102, as102_usb_probe() llama a usb_register_dev() y luego, en una ruta de error, hace usb_deregister_dev() y libera as102_dev_t de inmediato. Si el espacio de usuario compiti\u00f3 con un open() exitoso antes del desregistro, ese FD abierto posteriormente alcanzar\u00e1 as102_release() - as102_usb_release() y acceder\u00e1 o liberar\u00e1 as102_dev_t de nuevo, ocurrir\u00e1 una condici\u00f3n de carrera de uso despu\u00e9s de liberaci\u00f3n y una vulnerabilidad de doble liberaci\u00f3n.\n\nLa correcci\u00f3n es nunca kfree(as102_dev_t) directamente una vez que usb_register_dev() ha tenido \u00e9xito. Despu\u00e9s del desregistro, diferir la liberaci\u00f3n de memoria a .release().\n\nEn otras palabras, dejar que release() realice el \u00faltimo kfree cuando el FD abierto final es cerrado."}], "id": "CVE-2026-31578", "lastModified": "2026-11-11T23:10:00.263", "metrics": {"cvssMetricV31": [{"cvssData": {"attackComplexity": "LOW", "attackVector": "LOCAL", "availabilityImpact": "HIGH", "baseScore": 7.8, "baseSeverity": "HIGH", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "privilegesRequired": "LOW", "scope": "UNCHANGED", "userInteraction": "NONE", "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H", "version": "3.1"}, "exploitabilityScore": 1.8, "impactScore": 5.9, "source": "nvd@nist.gov", "type": "Primary"}]}, "published": "2026-04-24T15:16:32.480", "references": [{"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "url": "https://git.kernel.org/stable/c/07ceb444c8f627cf863864d4274b5a77769725ed"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "tags": ["Patch"], "url": "https://git.kernel.org/stable/c/09e9206008b887aa553733bd915d73131071a086"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "url": "https://git.kernel.org/stable/c/0d36653a3a821e5a974798adb347b3ea09332914"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "url": "https://git.kernel.org/stable/c/25d500cf391e384356a612b85cf60b353ad3cd0c"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "tags": ["Patch"], "url": "https://git.kernel.org/stable/c/2eeae47a438694408189138048a786be99954032"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "tags": ["Patch"], "url": "https://git.kernel.org/stable/c/582fbecb3756330006fe1950762412a68c2cacd2"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "tags": ["Patch"], "url": "https://git.kernel.org/stable/c/7e5aedf6059cba2a669d86caeaf5a51f33ec85a1"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "tags": ["Patch"], "url": "https://git.kernel.org/stable/c/8bd29dbe03fc5b0f039ab2395ff37b64236d2f0c"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "tags": ["Patch"], "url": "https://git.kernel.org/stable/c/cb8092038e95dc1113a68e63762de40fff61ba71"}], "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "vulnStatus": "Modified", "weaknesses": [{"description": [{"lang": "en", "value": "CWE-416"}], "source": "nvd@nist.gov", "type": "Primary"}]}