{"id":"CVE-2022-49968","state":"PUBLISHED","title":"ieee802154/adf7242: defer destroy_workqueue call","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nieee802154/adf7242: defer destroy_workqueue call\n\nThere is a possible race condition (use-after-free) like below\n\n  (FREE)                     |  (USE)\n  adf7242_remove             |  adf7242_channel\n   cancel_delayed_work_sync  |\n    destroy_workqueue (1)    |   adf7242_cmd_rx\n                             |    mod_delayed_work (2)\n                             |\n\nThe root cause for this race is that the upper layer (ieee802154) is\nunaware of this detaching event and the function adf7242_channel can\nbe called without any checks.\n\nTo fix this, we can add a flag write at the beginning of adf7242_remove\nand add flag check in adf7242_channel. Or we can just defer the\ndestructive operation like other commit 3e0588c291d6 (\"hamradio: defer\nax25 kfree after unregister_netdev\") which let the\nieee802154_unregister_hw() to handle the synchronization. This patch\ntakes the second option.\n\nruns\")","publishedAt":"2025-06-18T11:00:32.443Z","updatedAt":"2026-08-05T08:56:55.772Z","severity":{"score":8,"label":"High","version":"3.1","vector":"CVSS:3.1/AV:A/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H","source":"Linux"},"assigner":"Linux","products":["Linux Linux"],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"58e9683d14752debc6f22daf6b23e031787df31f","status":"affected","lessThan":"dede80aaf01f4b6e8657d23726cb4a3da226ec4c","versionType":"git"},{"version":"58e9683d14752debc6f22daf6b23e031787df31f","status":"affected","lessThan":"bed12d7531df1417fc92c691999ff95e03835008","versionType":"git"},{"version":"58e9683d14752debc6f22daf6b23e031787df31f","status":"affected","lessThan":"23a29932715ca43bceb2eae1bdb770995afe7271","versionType":"git"},{"version":"58e9683d14752debc6f22daf6b23e031787df31f","status":"affected","lessThan":"9f8558c5c642c62c450c98c99b7d18a709fff485","versionType":"git"},{"version":"58e9683d14752debc6f22daf6b23e031787df31f","status":"affected","lessThan":"15f3b89bd521d5770d36a61fc04a77c293138ba6","versionType":"git"},{"version":"58e9683d14752debc6f22daf6b23e031787df31f","status":"affected","lessThan":"afe7116f6d3b888778ed6d95e3cf724767b9aedf","versionType":"git"},{"version":"a2363e2d88bf50022ee643c49ee5d4f7e8c915ea","status":"affected","versionType":"git"},{"version":"4.17.19","status":"affected","lessThan":"4.18","versionType":"semver"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/net/ieee802154/adf7242.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"4.18","status":"affected"},{"version":"0","status":"unaffected","lessThan":"4.18","versionType":"semver"},{"version":"4.19.258","status":"unaffected","lessThanOrEqual":"4.19.*","versionType":"semver"},{"version":"5.4.213","status":"unaffected","lessThanOrEqual":"5.4.*","versionType":"semver"},{"version":"5.10.142","status":"unaffected","lessThanOrEqual":"5.10.*","versionType":"semver"},{"version":"5.15.66","status":"unaffected","lessThanOrEqual":"5.15.*","versionType":"semver"},{"version":"5.19.8","status":"unaffected","lessThanOrEqual":"5.19.*","versionType":"semver"},{"version":"6.0","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/net/ieee802154/adf7242.c"]}],"references":["https://git.kernel.org/stable/c/dede80aaf01f4b6e8657d23726cb4a3da226ec4c","https://git.kernel.org/stable/c/bed12d7531df1417fc92c691999ff95e03835008","https://git.kernel.org/stable/c/23a29932715ca43bceb2eae1bdb770995afe7271","https://git.kernel.org/stable/c/9f8558c5c642c62c450c98c99b7d18a709fff485","https://git.kernel.org/stable/c/15f3b89bd521d5770d36a61fc04a77c293138ba6","https://git.kernel.org/stable/c/afe7116f6d3b888778ed6d95e3cf724767b9aedf"],"weaknesses":[],"ingestedAt":"2026-10-29T20:05:26.763Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2022/49xxx/CVE-2022-49968.json","commit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2022-49968","state":"PUBLISHED","datePublished":"2025-06-18T11:00:32.443Z","dateUpdated":"2026-08-05T08:56:55.772Z","assignerShortName":"Linux","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateReserved":"2025-06-18T10:57:27.384Z"},"containers":{"cna":{"title":"ieee802154/adf7242: defer destroy_workqueue call","descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nieee802154/adf7242: defer destroy_workqueue call\n\nThere is a possible race condition (use-after-free) like below\n\n  (FREE)                     |  (USE)\n  adf7242_remove             |  adf7242_channel\n   cancel_delayed_work_sync  |\n    destroy_workqueue (1)    |   adf7242_cmd_rx\n                             |    mod_delayed_work (2)\n                             |\n\nThe root cause for this race is that the upper layer (ieee802154) is\nunaware of this detaching event and the function adf7242_channel can\nbe called without any checks.\n\nTo fix this, we can add a flag write at the beginning of adf7242_remove\nand add flag check in adf7242_channel. Or we can just defer the\ndestructive operation like other commit 3e0588c291d6 (\"hamradio: defer\nax25 kfree after unregister_netdev\") which let the\nieee802154_unregister_hw() to handle the synchronization. This patch\ntakes the second option.\n\nruns\")"}],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"58e9683d14752debc6f22daf6b23e031787df31f","status":"affected","lessThan":"dede80aaf01f4b6e8657d23726cb4a3da226ec4c","versionType":"git"},{"version":"58e9683d14752debc6f22daf6b23e031787df31f","status":"affected","lessThan":"bed12d7531df1417fc92c691999ff95e03835008","versionType":"git"},{"version":"58e9683d14752debc6f22daf6b23e031787df31f","status":"affected","lessThan":"23a29932715ca43bceb2eae1bdb770995afe7271","versionType":"git"},{"version":"58e9683d14752debc6f22daf6b23e031787df31f","status":"affected","lessThan":"9f8558c5c642c62c450c98c99b7d18a709fff485","versionType":"git"},{"version":"58e9683d14752debc6f22daf6b23e031787df31f","status":"affected","lessThan":"15f3b89bd521d5770d36a61fc04a77c293138ba6","versionType":"git"},{"version":"58e9683d14752debc6f22daf6b23e031787df31f","status":"affected","lessThan":"afe7116f6d3b888778ed6d95e3cf724767b9aedf","versionType":"git"},{"version":"a2363e2d88bf50022ee643c49ee5d4f7e8c915ea","status":"affected","versionType":"git"},{"version":"4.17.19","status":"affected","lessThan":"4.18","versionType":"semver"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/net/ieee802154/adf7242.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"4.18","status":"affected"},{"version":"0","status":"unaffected","lessThan":"4.18","versionType":"semver"},{"version":"4.19.258","status":"unaffected","lessThanOrEqual":"4.19.*","versionType":"semver"},{"version":"5.4.213","status":"unaffected","lessThanOrEqual":"5.4.*","versionType":"semver"},{"version":"5.10.142","status":"unaffected","lessThanOrEqual":"5.10.*","versionType":"semver"},{"version":"5.15.66","status":"unaffected","lessThanOrEqual":"5.15.*","versionType":"semver"},{"version":"5.19.8","status":"unaffected","lessThanOrEqual":"5.19.*","versionType":"semver"},{"version":"6.0","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/net/ieee802154/adf7242.c"]}],"references":[{"url":"https://git.kernel.org/stable/c/dede80aaf01f4b6e8657d23726cb4a3da226ec4c"},{"url":"https://git.kernel.org/stable/c/bed12d7531df1417fc92c691999ff95e03835008"},{"url":"https://git.kernel.org/stable/c/23a29932715ca43bceb2eae1bdb770995afe7271"},{"url":"https://git.kernel.org/stable/c/9f8558c5c642c62c450c98c99b7d18a709fff485"},{"url":"https://git.kernel.org/stable/c/15f3b89bd521d5770d36a61fc04a77c293138ba6"},{"url":"https://git.kernel.org/stable/c/afe7116f6d3b888778ed6d95e3cf724767b9aedf"}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:A/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H","baseScore":8,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:A - The ADF7242 is an IEEE 802.15.4 transceiver; after destroy_workqueue and before unregister disables the IRQ, adf7242_isr() unconditionally calls mod_delayed_work() on the freed workqueue when the radio raises an RX interrupt, so an attacker in WPAN/Zigbee radio range can trigger the UAF by transmitting frames.\nAC:L - Once driver remove/unbind begins, the window through ieee802154_unregister_hw() (rtnl, interface teardown, then adf7242_stop/disable_irq) is large enough that continuous adjacent frame injection reliably hits the still-armed ISR path; the attacker fully controls the use side of the race.\nPR:N - Triggering the ISR use-after-free requires only the ability to send 802.15.4 radio frames that cause hardware IRQs—no local Linux credentials or CAP_NET_ADMIN—while the free side is a separate administrator unbind/unload.\nUI:R - SPI driver remove (sysfs unbind or rmmod) is required to destroy the workqueue before unregister; that teardown is a privileged operator/system maintenance action the adjacent attacker cannot perform alone.\nS:U - The UAF corrupts kernel heap state on the same host and yields standard local privilege-escalation impact without crossing a VM, IOMMU, or other security-authority boundary.\nC:H - This is a kernel workqueue use-after-free; freed-object reuse enables disclosure of kernel memory contents, so confidentiality impact is High per UAF guidance.\nI:H - mod_delayed_work() on a destroyed workqueue is exploitable heap memory corruption that can be turned into arbitrary write / control-flow hijacking via heap spraying.\nA:H - Use-after-free through the IRQ/workqueue path can cause kernel oops/panic even without full exploitation, so availability impact is High."}]}],"providerMetadata":{"shortName":"Linux","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateUpdated":"2026-08-05T08:56:55.772Z"},"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.18","versionEndExcluding":"4.19.258"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.18","versionEndExcluding":"5.4.213"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.18","versionEndExcluding":"5.10.142"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.18","versionEndExcluding":"5.15.66"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.18","versionEndExcluding":"5.19.8"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.18","versionEndExcluding":"6.0"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.17.19"}]}]}],"x_generator":{"engine":"bippy-1.2.0"}}}}}