CVE-2026-89899 PUBLISHED

media: cec: disable delayed work before freeing an interrupted transmit

Assigner: Linux
Reserved: 11.09.2026 Published: 16.09.2026 Updated: 16.09.2026

In the Linux kernel, the following vulnerability has been resolved:

media: cec: disable delayed work before freeing an interrupted transmit

cec_transmit_msg_fh() drops adap->lock to wait for a blocking transmit in wait_for_completion_killable(). If that wait is interrupted by a signal, cancel_delayed_work_sync() can run before the CEC kthread arms the reply timeout via schedule_delayed_work(&data->work) in cec_transmit_done_ts(). The work is then armed after the cancel, and the data is freed with its delayed_work still pending:

ODEBUG: free active (active state 0) object: ... hint: cec_wait_timeout

Use disable_delayed_work_sync(): it cancels the work and disables it, so the later schedule_delayed_work() becomes a no-op and the work cannot be re-armed. The data is freed right after, so it need not be re-enabled.

Metrics

CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS Score: 7.8

AV:L - The UAF is in cec_transmit_msg_fh(), reached only via the local CEC_TRANSMIT ioctl on /dev/cec* (cec_ioctl to cec_transmit). A CEC peer on the HDMI bus cannot signal-interrupt wait_for_completion_killable(), so this is Local, unlike CEC RX IRQ bugs scored Adjacent. AC:L - The attacker issues a blocking CEC_TRANSMIT with a reply timeout and signals their own thread so cancel_delayed_work_sync() races the CEC kthread arming data->work in cec_transmit_done_ts(). They control both sides and can retry; syzkaller triggered it. PR:L - cec_open() defaults to CEC_MODE_INITIATOR, and neither CEC_TRANSMIT nor CEC_ADAP_S_LOG_ADDRS calls capable(). Only raw mode needs CAP_SYS_RAWIO and monitor modes need CAP_NET_ADMIN, neither required here. Unprivileged users with /dev/cec (video group, uaccess, Android HDMI-CEC) can trigger it. UI:N - The attacker opens /dev/cec, configures logical addresses, issues the blocking transmit ioctl, and delivers a signal to their own process. No separate victim action is required. S:U - The use-after-free corrupts kernel heap (struct cec_data) in the host kernel. It does not cross a VM, IOMMU, or other separate security authority. C:H - cec_wait_timeout() runs on a kmalloc'd struct cec_data after kfree(), so a sprayed replacement object yields an attacker-controlled adap pointer and list walks. Per kernel CNA guidance, use-after-free is High confidentiality. I:H - The delayed-work UAF lets the attacker spray struct cec_data and corrupt list_heads and the adapter mutex when cec_wait_timeout()/cec_data_cancel() run, enabling arbitrary write and control-flow hijack. Per kernel CNA guidance, use-after-free is High integrity. A:H - Freeing struct cec_data while its delayed_work is still pending causes cec_wait_timeout() to run on freed memory, producing a kernel oops or panic even without a full exploit. Per kernel CNA guidance, use-after-free is High availability.

Product Status

Vendor Linux
Product Linux
Versions Default: unaffected
  • affected from 490d84f6d73c12f4204241cff8651eed60aae914 to 9a951931d4b4084acd64fa55fc3672a9da45ddf9 (excl.)
  • affected from 490d84f6d73c12f4204241cff8651eed60aae914 to a3adb63b121937b97f7fdc51e96564c7c799538b (excl.)
  • affected from 490d84f6d73c12f4204241cff8651eed60aae914 to 9c6ceb0949227c1f0cf0e19393daec72d9889871 (excl.)
  • affected from 490d84f6d73c12f4204241cff8651eed60aae914 to 0fbd5c2327020858c45b2d1c65775d64cdeca523 (excl.)
  • Version e448dfd6d3ec944411f6575bc24e4f8baa1e297f is affected
  • Version 2781b86d7e45de09befa5ace296b66787146561f is affected
  • affected from 4.18.19 to 4.19 (excl.)
  • affected from 4.19.2 to 4.20 (excl.)
Vendor Linux
Product Linux
Versions Default: affected
  • Version 4.20 is affected
  • unaffected from 0 to 4.20 (excl.)
  • unaffected from 6.12.110 to 6.12.* (incl.)
  • unaffected from 6.18.51 to 6.18.* (incl.)
  • unaffected from 7.2.5 to 7.2.* (incl.)
  • unaffected from 7.3-rc1 to * (incl.)

References