Description
In the Linux kernel, the following vulnerability has been resolved: USB: cdc-acm: skip URB restart in port_shutdown if disconnected acm_port_shutdown() is called from the tty-port machinery whenever the last user closes the port. acm_disconnect() sets acm->disconnected and calls tty_port_tty_vhangup(), which eventually triggers port_shutdown(). At that point acm_disconnect() has already called acm_poison_urbs() and is about to free the control and read URBs. However, acm_port_shutdown() unconditionally calls acm_unpoison_urbs() and, when the ALWAYS_POLL_CTRL quirk is set, immediately re-submits the ctrlurb and all read URBs. If the concurrent acm_disconnect() then frees those URBs and their DMA buffers while they are in-flight, the result is a use-after-free in acm_ctrl_irq() or acm_read_bulk_callback() accessing the freed DMA memory. Fix by checking acm->disconnected after draining the delayed anchor and returning early: if we are in a disconnect path the URBs must remain poisoned and must not be resubmitted. The early return is placed after the delayed-anchor drain loop because that loop only cancels write-side accounting (wb->use = false and autopm counter) and does not touch the hardware path.
Affected products
Version statuses are supplied by the assigning organization. Consult the original record for detailed ranges and platform conditions.
Linux Linux
Default version status: unaffected
d826061aa64cb28089bf4c73e301dd7928662b84 to < d97da42e9de577dc827d4e8866e6971deefe2d9caffected8fb82e3555a7d56a05d8ef0edee9859f889c0860 to < d86775e79838d7d2e38ccf506a7d0f8e2dd4d5d0affected603d5a7110832e10165d21f9a1486399457177de to < 9742905d9ed5bf23ebe4c100dec80b6bc50fb522affected5d29d7ff8679e5a525f22da467ba33c042e8029b to < a0ed07b5bbb2d8fcef86810453216070691816e7affectedf58752ebcb35e156c85cd1a82d6579c7af3b9023 to < 420ca35af891d33522cc08504768ccd60a4c450aaffectedf58752ebcb35e156c85cd1a82d6579c7af3b9023 to < dc614d6bc991740d41d5a99ac7765c4b675dda88affected283f8162cc3c82086537cbc7dc01870dbeb07a91affectedf77f10bc76c2da86b4248269472f6d971e37828baffected6.1.175 to < 6.1.191affected6.6.136 to < 6.6.160affected6.12.83 to < 6.12.113affected6.18.24 to < 6.18.56affected6.19.14 to < 6.20affected7.0.1 to < 7.1affected
Linux Linux
Default version status: affected
7.1affected0 to < 7.1unaffected6.1.191 to ≤ 6.1.*unaffected6.6.160 to ≤ 6.6.*unaffected6.12.113 to ≤ 6.12.*unaffected6.18.56 to ≤ 6.18.*unaffected7.2.10 to ≤ 7.2.*unaffected7.3 to ≤ *unaffected
References
- https://git.kernel.org/stable/c/d97da42e9de577dc827d4e8866e6971deefe2d9c ↗
- https://git.kernel.org/stable/c/d86775e79838d7d2e38ccf506a7d0f8e2dd4d5d0 ↗
- https://git.kernel.org/stable/c/9742905d9ed5bf23ebe4c100dec80b6bc50fb522 ↗
- https://git.kernel.org/stable/c/a0ed07b5bbb2d8fcef86810453216070691816e7 ↗
- https://git.kernel.org/stable/c/420ca35af891d33522cc08504768ccd60a4c450a ↗
- https://git.kernel.org/stable/c/dc614d6bc991740d41d5a99ac7765c4b675dda88 ↗