Descripción
En el kernel de Linux, se resolvió la siguiente vulnerabilidad: net: skbuff: no aplicar skb_tx_error() al skb de origen en skb_zerocopy() skb_zerocopy() copia frags desde @from hacia @to. Ante un fallo de skb_orphan_frags(), llama a skb_tx_error(@from), una operación destructiva sobre el skb de origen, que no pertenece a la función auxiliar de copia. Esto completa el uarg zerocopy de @from y borra SKBFL_ALL_ZEROCOPY, incluido el marcador de propiedad de páginas SKBFL_SHARED_FRAG. Ambos invocadores ya informan el fallo en su propia ruta de descarte. nfnetlink_queue lo hace en nla_put_failure, y Open vSwitch lo hace en la rama de descarte por flow-miss de ovs_dp_process_packet(), por lo que no se pierde nada al eliminarlo aquí. En la ruta OVS_ACTION_ATTR_USERSPACE de Open vSwitch, el skb no se libera ante este error: do_execute_actions() ignora el valor de retorno de output_userspace() y, salvo que el upcall haya sido la última acción, sigue reenviando el mismo skb a través de las acciones restantes del flujo. El uarg se completa mientras ese skb sigue en tránsito, indicando al productor que sus búferes están libres, y SKBFL_SHARED_FRAG se borra en un skb que el resto de la pila aún maneja. Ese indicador es lo que hace que esp_input() llame a skb_cow_data() en lugar de descifrar en el lugar, por lo que una entrega ESP local posterior puede descifrar sobre frags que el skb no posee de forma privada. Se deja el informe de errores a los invocadores.
Qué hacer
Revisa si usas el producto afectado y en qué versión, y aplica la actualización o la mitigación que indique el aviso del fabricante. CISA no ha confirmado que se esté explotando; si eso cambia, esta ficha pasa a «explotada» y te avisamos en el boletín.
Versiones afectadas
- Linux Afectadas: 36d5fe6a000790f56039afe26834265db0a3ad4c y anteriores a 849bdb83123760a865bcb2970127f4c0b9423ba3 · 36d5fe6a000790f56039afe26834265db0a3ad4c y anteriores a fb10e0e9b220a2eed08931a60dbaad9a2370c908 · 36d5fe6a000790f56039afe26834265db0a3ad4c y anteriores a 767ec2a65cc022d303b0c9c12811e7db22057341 · 36d5fe6a000790f56039afe26834265db0a3ad4c y anteriores a 8069643ae64dfdf634b6c78c7f622e5323031436 · 36d5fe6a000790f56039afe26834265db0a3ad4c y anteriores a 04dd250a78e268af3e7124beb1dc10ec1dd88d60 · 36d5fe6a000790f56039afe26834265db0a3ad4c y anteriores a a13b1e80e5015cd732440b475c0ef443dc4a2157 · 36d5fe6a000790f56039afe26834265db0a3ad4c y anteriores a bab5a851e44a3601d31f2aa8043f385bb50ac5d9 · 36d5fe6a000790f56039afe26834265db0a3ad4c y anteriores a 8ece906150128d5ec2462aabcc978c568433eca4 · c5f0c0e7525443add533495e93ba8de6feab2396 · 1674b4bf3eea3cac51b70778e89f8025f7cfe695
- Linux Afectadas: 3.14 No afectadas: 5.10.270 · 5.15.221 · 6.1.188 · 6.6.157 · 6.12.110 · 6.18.51
Según el registro de la vulnerabilidad en CVE.org, tal como lo publicó el fabricante. Confirma tu versión exacta en el aviso del fabricante.
Referencias
- Referencia en git.kernel.orggit.kernel.org/stable/c/849bdb83123760a865bcb2970127f4c0b9423ba3
- Referencia en git.kernel.orggit.kernel.org/stable/c/fb10e0e9b220a2eed08931a60dbaad9a2370c908
- Referencia en git.kernel.orggit.kernel.org/stable/c/767ec2a65cc022d303b0c9c12811e7db22057341
- Referencia en git.kernel.orggit.kernel.org/stable/c/8069643ae64dfdf634b6c78c7f622e5323031436
- Referencia en git.kernel.orggit.kernel.org/stable/c/04dd250a78e268af3e7124beb1dc10ec1dd88d60
- Referencia en git.kernel.orggit.kernel.org/stable/c/a13b1e80e5015cd732440b475c0ef443dc4a2157
- Referencia en git.kernel.orggit.kernel.org/stable/c/bab5a851e44a3601d31f2aa8043f385bb50ac5d9
- Referencia en git.kernel.orggit.kernel.org/stable/c/8ece906150128d5ec2462aabcc978c568433eca4
Ver el texto original en inglés (CVE.org)
net: skbuff: don't skb_tx_error() the source skb in skb_zerocopy()
In the Linux kernel, the following vulnerability has been resolved: net: skbuff: don't skb_tx_error() the source skb in skb_zerocopy() skb_zerocopy() copies frags from @from into @to. On an skb_orphan_frags() failure it calls skb_tx_error(@from), a destructive operation on the source skb the copy helper does not own. That completes @from's zerocopy uarg and clears SKBFL_ALL_ZEROCOPY, including the SKBFL_SHARED_FRAG page-ownership marker. Both callers already report the failure on their own drop path. nfnetlink_queue does it at nla_put_failure, and Open vSwitch does it in the flow-miss drop arm of ovs_dp_process_packet(), so nothing is lost by dropping it here. On Open vSwitch's OVS_ACTION_ATTR_USERSPACE path the skb is not freed on this error: do_execute_actions() ignores output_userspace()'s return value and, unless the upcall was the last action, keeps forwarding the same skb through the flow's remaining actions. The uarg is completed while that skb is still in flight, telling the producer its buffers are free, and SKBFL_SHARED_FRAG is cleared on an skb the rest of the stack still handles. That flag is what makes esp_input() call skb_cow_data() instead of decrypting in place, so a later local ESP delivery can decrypt over frags the skb does not own privately. Leave error reporting to the callers.