CVE-2026-43194

In the Linux kernel, the following vulnerability has been resolved: net: consume xmit errors of GSO frames udpgro_frglist.sh and udpgro_bench.sh are the flakiest tests currently in NIPA. They fail in the same exact way, TCP GRO test stalls occasionally and the test gets killed after 10min. These tests use veth to simulate GRO. They attach a trivial ("return XDP_PASS;") XDP program to the veth to force TSO off and NAPI on. Digging into the failure mode we can see that the connection is completely stuck after a burst of drops. The sender's snd_nxt is at sequence number N [1], but the receiver claims to have received (rcv_nxt) up to N + 3 * MSS [2]. Last piece of the puzzle is that senders rtx queue is not empty (let's say the block in the rtx queue is at sequence number N - 4 * MSS [3]). In this state, sender sends a retransmission from the rtx queue with a single segment, and sequence numbers N-4*MSS:N-3*MSS [3]. Receiver sees it and responds with an ACK all the way up to N + 3 * MSS [2]. But sender will reject this ack as TCP_ACK_UNSENT_DATA because it has no recollection of ever sending data that far out [1]. And we are stuck. The root cause is the mess of the xmit return codes. veth returns an error when it can't xmit a frame. We end up with a loss event like this: ------------------------------------------------- | GSO super frame 1 | GSO super frame 2 | |-----------------------------------------------| | seg | seg | seg | seg | seg | seg | seg | seg | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ------------------------------------------------- x ok ok <ok>| ok ok ok <x> \\ snd_nxt "x" means packet lost by veth, and "ok" means it went thru. Since veth has TSO disabled in this test it sees individual segments. Segment 1 is on the retransmit queue and will be resent. So why did the sender not advance snd_nxt even tho it clearly did send up to seg 8? tcp_write_xmit() interprets the return code from the core to mean that data has not been sent at all. Since TCP deals with GSO super frames, not individual segment the crux of the problem is that loss of a single segment can be interpreted as loss of all. TCP only sees the last return code for the last segment of the GSO frame (in <> brackets in the diagram above). Of course for the problem to occur we need a setup or a device without a Qdisc. Otherwise Qdisc layer disconnects the protocol layer from the device errors completely. We have multiple ways to fix this. 1) make veth not return an error when it lost a packet. While this is what I think we did in the past, the issue keeps reappearing and it's annoying to debug. The game of whack a mole is not great. 2) fix the damn return codes We only talk about NETDEV_TX_OK and NETDEV_TX_BUSY in the documentation, so maybe we should make the return code from ndo_start_xmit() a boolean. I like that the most, but perhaps some ancient, not-really-networking protocol would suffer. 3) make TCP ignore the errors It is not entirely clear to me what benefit TCP gets from interpreting the result of ip_queue_xmit()? Specifically once the connection is established and we're pushing data - packet loss is just packet loss? 4) this fix Ignore the rc in the Qdisc-less+GSO case, since it's unreliable. We already always return OK in the TCQ_F_CAN_BYPASS case. In the Qdisc-less case let's be a bit more conservative and only mask the GSO errors. This path is taken by non-IP-"networks" like CAN, MCTP etc, so we could regress some ancient thing. This is the simplest, but also maybe the hackiest fix? Similar fix has been proposed by Eric in the past but never committed because original reporter was working with an OOT driver and wasn't providing feedback (see Link).
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc1:*:*:*:*:*:*

History

11 Nov 2026, 20:10

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta: net: consumir errores de xmit de tramas GSO udpgro_frglist.sh y udpgro_bench.sh son las pruebas más inestables actualmente en NIPA. Fallan exactamente de la misma manera, la prueba TCP GRO se detiene ocasionalmente y la prueba se interrumpe después de 10 minutos. Estas pruebas usan veth para simular GRO. Adjuntan un programa XDP trivial (’return XDP_PASS;’) al veth para forzar la desactivación de TSO y la activación de NAPI. Al investigar el modo de fallo podemos ver que la conexión está completamente atascada después de una ráfaga de caídas. El snd_nxt del remitente está en el número de secuencia N [1], pero el receptor afirma haber recibido (rcv_nxt) hasta N + 3 * MSS [2]. La última pieza del rompecabezas es que la cola rtx del remitente no está vacía (digamos que el bloque en la cola rtx está en el número de secuencia N - 4 * MSS [3]). En este estado, el remitente envía una retransmisión desde la cola rtx con un solo segmento, y números de secuencia N-4MSS:N-3MSS [3]. El receptor lo ve y responde con un ACK hasta N + 3 * MSS [2]. Pero el remitente rechazará este ACK como TCP_ACK_UNSENT_DATA porque no tiene recuerdo de haber enviado datos tan lejos [1]. Y estamos atascados. La causa raíz es el desorden de los códigos de retorno de xmit. veth devuelve un error cuando no puede xmitir una trama. Terminamos con un evento de pérdida como este: ------------------------------------------------- | GSO super frame 1 | GSO super frame 2 | |-----------------------------------------------| | seg | seg | seg | seg | seg | seg | seg | seg | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ------------------------------------------------- x ok ok [ok]| ok ok ok [x] \\ snd_nxt ’x’ significa paquete perdido por veth, y ’ok’ significa que pasó. Dado que veth tiene TSO deshabilitado en esta prueba, ve segmentos individuales. El segmento 1 está en la cola de retransmisión y será reenviado. Entonces, ¿por qué el remitente no avanzó snd_nxt a pesar de que claramente envió hasta el seg 8? tcp_write_xmit() interpreta el código de retorno del núcleo para significar que los datos no han sido enviados en absoluto. Dado que TCP trata con supertramas GSO, no con segmentos individuales, el quid del problema es que la pérdida de un solo segmento puede interpretarse como la pérdida de todos. TCP solo ve el último código de retorno para el último segmento de la trama GSO (entre corchetes angulares ’<>’ en el diagrama anterior). Por supuesto, para que el problema ocurra, necesitamos una configuración o un dispositivo sin un Qdisc. De lo contrario, la capa Qdisc desconecta completamente la capa de protocolo de los errores del dispositivo. Tenemos múltiples formas de solucionar esto. 1) hacer que veth no devuelva un error cuando perdió un paquete. Si bien esto es lo que creo que hicimos en el pasado, el problema sigue reapareciendo y es molesto de depurar. El juego de ’whack a mole’ no es bueno. 2) arreglar los malditos códigos de retorno Solo hablamos de NETDEV_TX_OK y NETDEV_TX_BUSY en la documentación, así que quizás deberíamos hacer que el código de retorno de ndo_start_xmit() sea un booleano. Eso es lo que más me gusta, pero quizás algún protocolo antiguo, no realmente de red, sufriría. 3) hacer que TCP ignore los errores No me queda del todo claro qué beneficio obtiene TCP de interpretar el resultado de ip_queue_xmit()? Específicamente, una vez que la conexión está establecida y estamos enviando datos, ¿la pérdida de paquetes es solo pérdida de paquetes? 4) esta solución Ignorar el rc en el caso sin Qdisc + GSO, ya que no es fiable. Ya siempre devolvemos OK en el caso TCQ_F_CAN_BYPASS. En el caso sin Qdisc, seamos un poco más conservadores y solo enmascaremos los errores GSO. Esta ruta es tomada por ’redes’ no IP como CAN, MCTP, etc., así que podríamos causar una regresión en algo antiguo. Esta es la más simple, pero ¿también quizás la solu --TRUNCADO--

19 Oct 2026, 20:18

Type Values Removed Values Added
CWE CWE-754

Information

Published : 2026-05-06 12:16

Updated : 2026-11-11 20:10


NVD link : CVE-2026-43194

Mitre link : CVE-2026-43194

CVE.ORG link : CVE-2026-43194


JSON object : View

Products Affected

linux

  • linux_kernel
CWE
NVD-CWE-noinfo CWE-754

Improper Check for Unusual or Exceptional Conditions