CVE-2026-74691
Gravedad:
Pendiente de análisis
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
22/08/2026
Última modificación:
22/08/2026
Descripción
*** Pendiente de traducción *** In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
net: thunderbolt: Tear down DMA paths before stopping the rings<br />
<br />
tbnet_tear_down() stops both rings and frees their frame buffers before<br />
calling tb_xdomain_disable_paths(). tb_ring_stop() zeroes the ring&#39;s<br />
descriptor base and tbnet_free_buffers() unmaps and frees the pages the<br />
frames sit in, so by the time __tb_path_deactivate_hop() polls the hop&#39;s<br />
&#39;pending&#39; bit, anything still in flight has nowhere to drain to.<br />
<br />
The teardown sequence has been in this order since the driver was added.<br />
The setup path has not: commit ff7cd07f3064 ("net: thunderbolt: Enable<br />
DMA paths only after rings are enabled") moved the path enable to the end<br />
of tbnet_connected_work() and documented why:<br />
<br />
/* Both logins successful so enable the rings, high-speed DMA<br />
* paths and start the network device queue.<br />
*<br />
* Note we enable the DMA paths last to make sure we have primed<br />
* the Rx ring before any incoming packets are allowed to<br />
* arrive.<br />
*/<br />
<br />
Teardown was never updated to match, so the rings and the paths now come<br />
down in the same order they go up instead of in reverse.<br />
<br />
On an ASMedia ASM4242 host router the &#39;pending&#39; bit then never clears:<br />
every teardown burns the full 500 ms timeout and<br />
__tb_path_deactivate_hop() returns -ETIMEDOUT. Raising the timeout to<br />
5 s does not help, so the hop is not slow to drain, it never drains<br />
at all.<br />
<br />
The failure is invisible above the thunderbolt core.<br />
__tb_path_deactivate_hops() is void and only calls tb_port_warn();<br />
tb_path_deactivate(), tb_tunnel_deactivate() and<br />
__tb_disconnect_xdomain_paths() are void as well, and<br />
tb_disconnect_xdomain_paths() ends in an unconditional "return 0". So<br />
tb_xdomain_disable_paths() reports success and the netdev_warn() below<br />
it never fires. Repeated teardowns eventually take the XDomain control<br />
channel down, after which the peer node is gone and only a power cycle<br />
brings the controller back.<br />
<br />
Deactivating the paths first fixes it. Measured with kretprobes on a<br />
stock v6.17 tree with no other patches applied, on a link that was up<br />
and had just carried traffic:<br />
<br />
before: __tb_path_deactivate_hop() returns 0 for the first hop, then<br />
-ETIMEDOUT for the second 500335 us later<br />
after: 0 for both, 525 us apart<br />
<br />
Alternating the two orderings ABBA over three load levels, four<br />
teardowns per arm: every teardown failed before the change (21 of 21<br />
that ran), none failed after (0 of 24). The before arms ran short<br />
because the link died partway through. The same split shows up when<br />
the interface is enslaved to a bond instead of just brought down, which<br />
is how I ran into this in the first place. Throughput and latency after<br />
the change are unchanged.<br />
<br />
Hosts whose routers drain the hop despite the stale descriptor base see<br />
no functional difference, since the paths end up deactivated either way.
Impacto
Referencias a soluciones, herramientas e información
- https://git.kernel.org/stable/c/0da9a6d27155ad072dd76db8cd637feead99a0e0
- https://git.kernel.org/stable/c/103a9b663ac1cacb8465aeff18f84a247154a562
- https://git.kernel.org/stable/c/4dd71cb0d23d40cb58fe4261c7bd183dca66caa0
- https://git.kernel.org/stable/c/68bf02b6b4ad3f748c6db71fd77b6c0402d252f4
- https://git.kernel.org/stable/c/7cce39109206bc5497e0953806563644b88bfc44
- https://git.kernel.org/stable/c/9a482b2b117e5fa656b6d24fc01799e8ac2d4368
- https://git.kernel.org/stable/c/b5a21615f627c48dafaa6ef82a34a5b97a4352aa


