Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Vulnerabilidad en kernel de Linux (CVE-2021-47304)

Gravedad CVSS v3.1:
MEDIA
Tipo:
CWE-415 Doble liberación
Fecha de publicación:
21/05/2024
Última modificación:
12/05/2025

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: tcp: corrige tcp_init_transfer() para no restablecer icsk_ca_initialized Esta confirmación corrige un error (encontrado por syzkaller) que podría causar dobles inicializaciones falsas para los módulos de control de congestión, lo que podría causar pérdidas de memoria o Otros problemas para los módulos de control de congestión (como CDG) que asignan memoria en sus funciones de inicio. El escenario con errores construido por syzkaller era algo así como: (1) crear un socket TCP (2) iniciar una conexión TFO a través de sendto() (3) mientras el socket está en TCP_SYN_SENT, llamar a setsockopt(TCP_CONGESTION), que llama a: tcp_set_congestion_control() - > tcp_reinit_congestion_control() -> tcp_init_congestion_control() (4) recibe ACK, se establece la conexión, llama a tcp_init_transfer(), establece icsk_ca_initialized=0 (sin llamar primero a cc->release()), llama a tcp_init_congestion_control() nuevamente. Tenga en cuenta que en esta secuencia tcp_init_congestion_control() se llama dos veces sin una llamada cc->release() en el medio. Por lo tanto, para los módulos CC que asignan memoria en su función init(), por ejemplo, CDG, puede ocurrir una pérdida de memoria. La herramienta syzkaller logró encontrar un reproductor que desencadenó dicha filtración en CDG. El error se introdujo cuando la confirmación 8919a9b31eb4 ("tcp: solo inicia el control de congestión si aún no está inicializado") introdujo icsk_ca_initialized y estableció icsk_ca_initialized en 0 en tcp_init_transfer(), perdiendo la posibilidad de una secuencia como la anterior, donde un proceso podría llamar setsockopt(TCP_CONGESTION) en el estado TCP_SYN_SENT (es decir, después de connect() o TFO open sendmsg()), que llamaría a tcp_init_congestion_control(). No tenía la intención de restablecer ninguna inicialización que el usuario ya hubiera realizado explícitamente; simplemente perdió la posibilidad de esa secuencia particular (que Syzkaller logró encontrar).

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.10 (incluyendo) 5.10.53 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.11 (incluyendo) 5.13.5 (excluyendo)
cpe:2.3:o:linux:linux_kernel:5.14:rc1:*:*:*:*:*:*