Descripción
En el kernel de Linux se resolvió la siguiente vulnerabilidad: sctp: descartar un chunk si su transporte fue eliminado sctp_rcv() resuelve el transporte una vez por paquete y lo deja en chunk->transport. La referencia de la búsqueda, o la que toma sctp_add_backlog() si el socket pertenece al espacio de usuario, lo mantiene hasta que el chunk se procesa. Un ASCONF DEL-IP autenticado puede eliminarlo mientras tanto. sctp_assoc_rm_peer() saca el transporte de la asociación y llama a sctp_transport_free(), que lo marca como muerto y libera la referencia que mantenía la asociación. Existe una ventana en ambas rutas: el paquete puede quedar en el backlog del socket y, en la ruta directa, la búsqueda finaliza antes de bh_lock_sock(). El chunk DATA de ese paquete vuelve a colocar el transporte eliminado en asoc->peer.last_data_from. Una vez procesado el paquete, esa referencia desaparece y el transporte es liberado por RCU, por lo que el siguiente SACK diferido lleva el puntero al chunk SACK y sctp_outq_select_transport() lee el estado del transporte liberado. Se descarta el chunk en sctp_inq_push(), junto a la verificación existente de rcvr->dead. Ambas rutas llegan allí con el bloqueo del socket de la asociación tomado. El par lo retransmite.
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: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 y anteriores a 3fc072e7cb4a0ff251d13cfc2d24f62489cd9386 · 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 y anteriores a d7cb5ad832095dc4becfdb2a36007ffd50e49fb0 · 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 y anteriores a 0422b092a3d43ca462932ff9f747731ca078d1d4 · 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 y anteriores a 928fd7920ba37cc5637a211b9be979083413a2fa · 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 y anteriores a c6c86a5e62a4fec36692ddd64b9144b660f71f96 · 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 y anteriores a 1035bdef1efb9b1076d1a57b81e08c637ff08ecc · 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 y anteriores a 3537961df2163258bddc230db0e18dc14e925ea6 · 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 y anteriores a 03a9d10ecf71f54b2af8020935f2033d4a132be5
- Linux Afectadas: 2.6.12 No afectadas: 5.10.270 · 5.15.221 · 6.1.188 · 6.6.157 · 6.12.109 · 6.18.50
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/3fc072e7cb4a0ff251d13cfc2d24f62489cd9386
- Referencia en git.kernel.orggit.kernel.org/stable/c/d7cb5ad832095dc4becfdb2a36007ffd50e49fb0
- Referencia en git.kernel.orggit.kernel.org/stable/c/0422b092a3d43ca462932ff9f747731ca078d1d4
- Referencia en git.kernel.orggit.kernel.org/stable/c/928fd7920ba37cc5637a211b9be979083413a2fa
- Referencia en git.kernel.orggit.kernel.org/stable/c/c6c86a5e62a4fec36692ddd64b9144b660f71f96
- Referencia en git.kernel.orggit.kernel.org/stable/c/1035bdef1efb9b1076d1a57b81e08c637ff08ecc
- Referencia en git.kernel.orggit.kernel.org/stable/c/3537961df2163258bddc230db0e18dc14e925ea6
- Referencia en git.kernel.orggit.kernel.org/stable/c/03a9d10ecf71f54b2af8020935f2033d4a132be5
Ver el texto original en inglés (CVE.org)
sctp: drop a chunk if its transport was removed
In the Linux kernel, the following vulnerability has been resolved: sctp: drop a chunk if its transport was removed sctp_rcv() resolves the transport once per packet and leaves it in chunk->transport. The lookup reference, or the one sctp_add_backlog() takes if the socket is owned by userspace, keeps it around until the chunk has been processed. An authenticated ASCONF DEL-IP can remove it in the meantime. sctp_assoc_rm_peer() takes the transport out of the association and calls sctp_transport_free(), which tags it dead and drops the reference the association held. There is a window on both paths: the packet can sit on the socket backlog, and on the direct path the lookup completes before bh_lock_sock(). The DATA chunk in that packet puts the removed transport back into asoc->peer.last_data_from. Once the packet is done that reference goes away and the transport is freed by RCU, so the next delayed SACK carries the pointer into the SACK chunk and sctp_outq_select_transport() reads the freed transport's state. Drop the chunk in sctp_inq_push(), next to the existing rcvr->dead check. Both paths reach it with the association's socket lock held. The peer retransmits it.