Vulnerabilidad en kernel de Linux (CVE-2022-49872)
Gravedad:
Pendiente de análisis
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
01/05/2025
Última modificación:
02/05/2025
Descripción
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: net: gso: corrección del pánico en frag_list con tipos de asignación de encabezado mixtos. Desde el commit 3dcbdb134f32 ("net: gso: corrección del error skb_segment al dividir gso_size de un skb alterado con frag_list de encabezado lineal"), se permite cambiar gso_size de un paquete GRO. Sin embargo, esta confirmación asume que basta con comprobar el primer miembro de list_skb; es decir, si alguno de los miembros de list_skb tiene un encabezado distinto de head_frag, el primero también lo tendrá. Resulta que esta suposición no se cumple. Hemos observado que se ha alcanzado BUG_ON en skb_segment cuando los skbs de frag_list tenían un head_frag distinto con el controlador vmxnet3. Esto se debe a que __netdev_alloc_skb y __napi_alloc_skb pueden devolver un skb con respaldo de página o asignado a km, según el tamaño solicitado. Como resultado, el último skb pequeño en el paquete GRO puede ser asignado a km. Hay tres ubicaciones diferentes donde esto puede ser corregido: (1) Podríamos revisar head_frag en GRO y no permitir que GROing skbs con diferente head_frag. Sin embargo, eso llevaría a una regresión del rendimiento en rutas de avance normales con gso_size sin modificar, donde !head_frag en el último paquete no es un problema. (2) Establecer un indicador en bpf_skb_net_grow y bpf_skb_net_shrink que indique que NETIF_F_SG no es deseable. Esto requeriría consumir un poco en sk_buff. Además, ese indicador puede ser desactivado cuando todos los skbs en la frag_list están en retroceso de página. Para mantener un buen rendimiento, bpf_skb_net_grow/shrink tendría que recorrer la frag_list. (3) Recorrer la frag_list en skb_segment al determinar si NETIF_F_SG debe ser borrado. Esto, por supuesto, ralentiza el proceso. Este parche implementa (3). Para limitar el impacto en el rendimiento de skb_segment, la lista solo se recorre para skb con SKB_GSO_DODGY configurado y gso_size modificado. Por lo tanto, las rutas normales no la alcanzarán. Podríamos revisar solo el último skb, pero como necesitamos recorrer la lista completa de todos modos, mejor optemos por lo seguro.
Impacto
Referencias a soluciones, herramientas e información
- https://git.kernel.org/stable/c/0a9f56e525ea871d3950b90076912f5c7494f00f
- https://git.kernel.org/stable/c/50868de7dc4e7f0fcadd6029f32bf4387c102ee6
- https://git.kernel.org/stable/c/5876b7f249a1ecbbcc8e35072c3828d6526d1c3a
- https://git.kernel.org/stable/c/598d9e30927b15731e83797fbd700ecf399f42dd
- https://git.kernel.org/stable/c/65ad047fd83502447269fda8fd26c99077a9af47
- https://git.kernel.org/stable/c/9e4b7a99a03aefd37ba7bb1f022c8efab5019165
- https://git.kernel.org/stable/c/ad25a115f50800c6847e0d841c5c7992a9f7c1b3
- https://git.kernel.org/stable/c/bd5362e58721e4d0d1a37796593bd6e51536ce7a