{"affected": [{"affectedData": [{"defaultStatus": "unaffected", "product": "Linux", "programFiles": ["drivers/media/usb/hackrf/hackrf.c"], "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "vendor": "Linux", "versions": [{"lessThan": "87b9685cca91ed715c39ba544715832d26a7f4b4", "status": "affected", "version": "8bc4a9ed85046c214458c9e82aea75d2f46cfffd", "versionType": "git"}, {"lessThan": "131ec9046e1c8af101aebdaec4e8095e05f3312b", "status": "affected", "version": "8bc4a9ed85046c214458c9e82aea75d2f46cfffd", "versionType": "git"}, {"lessThan": "67fd62e3efdc9dce01f76d95a745212f4feb38e6", "status": "affected", "version": "8bc4a9ed85046c214458c9e82aea75d2f46cfffd", "versionType": "git"}, {"lessThan": "45cbaf5c7cdc5386d86377f0daf94a17a007fed0", "status": "affected", "version": "8bc4a9ed85046c214458c9e82aea75d2f46cfffd", "versionType": "git"}, {"lessThan": "98a0a81ce78020c2522e0046f49d200de9778cb9", "status": "affected", "version": "8bc4a9ed85046c214458c9e82aea75d2f46cfffd", "versionType": "git"}, {"lessThan": "07e9e674b6146b1f6fc41b1f54b8968bf2802824", "status": "affected", "version": "8bc4a9ed85046c214458c9e82aea75d2f46cfffd", "versionType": "git"}, {"lessThan": "2145c71a8044362e82e9923f001ba2aeb771b848", "status": "affected", "version": "8bc4a9ed85046c214458c9e82aea75d2f46cfffd", "versionType": "git"}, {"lessThan": "fcd1d70792a35c8a97414fe429f48311e41269c2", "status": "affected", "version": "8bc4a9ed85046c214458c9e82aea75d2f46cfffd", "versionType": "git"}, {"lessThan": "3b7da2b4d0fe014eff181ed37e3bf832eb8ed258", "status": "affected", "version": "8bc4a9ed85046c214458c9e82aea75d2f46cfffd", "versionType": "git"}]}, {"defaultStatus": "affected", "product": "Linux", "programFiles": ["drivers/media/usb/hackrf/hackrf.c"], "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "vendor": "Linux", "versions": [{"status": "affected", "version": "4.4"}, {"lessThan": "4.4", "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: hackrf: fix to not free memory after the device is registered in hackrf_probe()\n\nIn hackrf driver, the following race condition occurs:\n```\n\t\tCPU0\t\t\t\t\t\tCPU1\nhackrf_probe()\n kzalloc(); // alloc hackrf_dev\n ....\n v4l2_device_register();\n ....\n\t\t\t\t\t\tfd = sys_open(\"/path/to/dev\"); // open hackrf fd\n\t\t\t\t\t\t....\n v4l2_device_unregister();\n ....\n kfree(); // free hackrf_dev\n ....\n\t\t\t\t\t\tsys_ioctl(fd, ...);\n\t\t\t\t\t\t v4l2_ioctl();\n\t\t\t\t\t\t video_is_registered() // UAF!!\n\t\t\t\t\t\t....\n\t\t\t\t\t\tsys_close(fd);\n\t\t\t\t\t\t v4l2_release() // UAF!!\n\t\t\t\t\t\t hackrf_video_release()\n\t\t\t\t\t\t kfree(); // DFB!!\n```\n\nWhen a V4L2 or video device is unregistered, the device node is removed so\nnew open() calls are blocked.\n\nHowever, file descriptors that are already open-and any in-flight I/O-do\nnot terminate immediately; they remain valid until the last reference is\ndropped and the driver's release() is invoked.\n\nTherefore, freeing device memory on the error path after hackrf_probe()\nhas registered dev it will lead to a race to use-after-free vuln, since\nthose already-open handles haven't been released yet.\n\nAnd since release() free memory too, race to use-after-free and\ndouble-free vuln occur.\n\nTo prevent this, if device is registered from probe(), it should be\nmodified to free memory only through release() rather than calling\nkfree() directly."}, {"lang": "es", "value": "En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:\n\nmedia: hackrf: correcci\u00f3n para no liberar memoria despu\u00e9s de que el dispositivo es registrado en hackrf_probe()\n\nEn el controlador hackrf, la siguiente condici\u00f3n de carrera ocurre:\n\u201d\u201d\u201c\n\t\tCPU0\t\t\t\t\t\tCPU1\nhackrf_probe()\n kzalloc(); // asigna hackrf_dev\n ....\n v4l2_device_register();\n ....\n\t\t\t\t\t\tfd = sys_open(\u201c/path/to/dev\u201d); // abre el descriptor de archivo hackrf\n\t\t\t\t\t\t....\n v4l2_device_unregister();\n ....\n kfree(); // libera hackrf_dev\n ....\n\t\t\t\t\t\tsys_ioctl(fd, ...);\n\t\t\t\t\t\t v4l2_ioctl();\n\t\t\t\t\t\t video_is_registered() // \u00a1\u00a1UAF!!\n\t\t\t\t\t\t....\n\t\t\t\t\t\tsys_close(fd);\n\t\t\t\t\t\t v4l2_release() // \u00a1\u00a1UAF!!\n\t\t\t\t\t\t hackrf_video_release()\n\t\t\t\t\t\t kfree(); // \u00a1\u00a1DFB!!\n\u201d\u201d\u201d\n\nCuando un dispositivo V4L2 o de video es dado de baja, el nodo del dispositivo es eliminado, por lo que las nuevas llamadas a open() son bloqueadas.\n\nSin embargo, los descriptores de archivo que ya est\u00e1n abiertos -y cualquier E/S en curso- no terminan inmediatamente; permanecen v\u00e1lidos hasta que la \u00faltima referencia es liberada y se invoca el release() del controlador.\n\nPor lo tanto, liberar la memoria del dispositivo en la ruta de error despu\u00e9s de que hackrf_probe() ha registrado el dispositivo conducir\u00e1 a una condici\u00f3n de carrera de vulnerabilidad de uso despu\u00e9s de liberaci\u00f3n, ya que esos manejadores ya abiertos a\u00fan no han sido liberados.\n\nY dado que release() tambi\u00e9n libera memoria, ocurren una condici\u00f3n de carrera de uso despu\u00e9s de liberaci\u00f3n y una vulnerabilidad de doble liberaci\u00f3n.\n\nPara evitar esto, si el dispositivo es registrado desde probe(), deber\u00eda modificarse para liberar memoria solo a trav\u00e9s de release() en lugar de llamar a kfree() directamente."}], "id": "CVE-2026-31576", "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.230", "references": [{"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "tags": ["Patch"], "url": "https://git.kernel.org/stable/c/07e9e674b6146b1f6fc41b1f54b8968bf2802824"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "url": "https://git.kernel.org/stable/c/131ec9046e1c8af101aebdaec4e8095e05f3312b"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "tags": ["Patch"], "url": "https://git.kernel.org/stable/c/2145c71a8044362e82e9923f001ba2aeb771b848"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "tags": ["Patch"], "url": "https://git.kernel.org/stable/c/3b7da2b4d0fe014eff181ed37e3bf832eb8ed258"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "tags": ["Patch"], "url": "https://git.kernel.org/stable/c/45cbaf5c7cdc5386d86377f0daf94a17a007fed0"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "url": "https://git.kernel.org/stable/c/67fd62e3efdc9dce01f76d95a745212f4feb38e6"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "url": "https://git.kernel.org/stable/c/87b9685cca91ed715c39ba544715832d26a7f4b4"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "tags": ["Patch"], "url": "https://git.kernel.org/stable/c/98a0a81ce78020c2522e0046f49d200de9778cb9"}, {"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "tags": ["Patch"], "url": "https://git.kernel.org/stable/c/fcd1d70792a35c8a97414fe429f48311e41269c2"}], "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "vulnStatus": "Modified", "weaknesses": [{"description": [{"lang": "en", "value": "CWE-416"}], "source": "nvd@nist.gov", "type": "Primary"}]}