El investigador de seguridad Jonathan
Looney, de Netflix, ha descubierto varias vulnerabilidades en la implementación
de TCP/IP del kernel Linux que permitirían a un atacante remoto provocar
denegaciones de servicio en los sistemas que trabajen con las versiones del
núcleo afectadas.
La vulnerabilidad más crítica,
bautizada como «SACK Panic» y etiquetada con CVE-2019-11477, debe su nombre a
los paquetes de reconocimiento selectivo (SACK). Este protocolo se define en el
RFC 2018 y RFC 2883, y trata de solventar el problema de las retransmisiones
innecesarias de paquetes durante una conexión TCP. Cuando el envío de un
segmento falla, se solicita la retransmisión de ese segmento mediante un
paquete ACK con el número del último fragmento recibido. Aunque los
subsiguientes segmentos se hayan recibido correctamente, el servidor volverá a
retransmitirlos en orden. Para solucionar este problema de optimización se
utiliza la trama SACK, que se envía junto con el ACK duplicado (utilizado para
solicitar la retransmisión), indicando el rango de tramas que sí se han recibido
correctamente. Con esta información, el servidor ya puede retransmitir sólo los
paquetes que no se han recibido, optimizando así la comunicación.
Otro concepto que debemos definir es
el de «tamaño de segmento máximo» (MSS). El MSS es un parámetro que se envía en
las cabeceras TCP de cada paquete y especifica el tamaño máximo (en bytes) que
se puede recibir sin fragmentar. Valores elevados en el MSS podrían provocar
más fragmentación y en consecuencia una reducción de la velocidad.
Pasaremos ahora a explicar
detalladamente la vulnerabilidad:
En la implementación de TCP/IP del
kernel Linux se utiliza una estructura llamada Socket Buffer (SKB). Básicamente
es una lista enlazada de buffers que almacenan paquetes de red. Esta lista se
utiliza para guardar la cola de transmisión, la cola de recepción, cola de
paquetes SACK, etc. Las estructuras SKB pueden almacenar los datos
fragmentados, en un máximo de 17 fragmentos como se define en su fichero de
cabecera:
Cuando un paquete debe ser enviado, se
guarda información de control en una estructura como la siguiente, utilizada
para instruir cómo se realizará el envío:
De esta estructura, debemos fijarnos
en los campos ‘tcp_gso_segs‘ y ‘tcp_gso_size‘, que se utilizan para almacenar
información relativa a la fragmentación de los paquetes.
Pues bien, cuando la descarga de
segmentación (TSO) está activa y el mecanismo de retransmisión SACK habilitado,
puede producirse una situación en la que alguna estructura SKB alcance el
número máximo de fragmentos permitido y se provoque un desbordamiento de entero
en ‘tcp_gso_segs’, resultando en un kernel panic.
Un atacante remoto podría favorecer
estas condiciones configurando el MSS de la conexión TCP al mínimo y enviando
una secuencia de paquetes SACK especialmente manipulada. Un MSS mínimo, dejaría
sólo 8 bytes libres por segmento, lo que elevaría el número de tramas TCP
necesarias para enviar toda la información.
Las versiones 2.6.29 y posteriores del
kernel Linux son vulnerables. Netflix ha publicado un parche para corregir el
fallo:
kernel Linux 2.6.29: PATCH_net_1_4.patch
kernel Linux 4.14: PATCH_net_1_4.patch
+ PATCH_net_1a.patch
Las otras dos vulnerabilidades
identificadas han sido etiquetadas con CVE-2019-11478 y CVE-2019-11479
respectivamente y se consideran de gravedad media. La primera también está
relacionada con los paquetes SACK, y permitiría a un atacante remoto segmentar
la cola de retransmisiones ralentizando el envío de paquetes SACK (en versiones
anteriores a 4.15) o hasta el punto de agotar los recursos al tener que
recorrer una lista enlazada de paquetes SACK demasiado larga.
La segunda, permitiría a un atacante
agotar los recursos del sistema configurando un valor bajo del MSS. Lo que
elevaría la fragmentación y el ancho de banda requerido para transmitir la
misma cantidad de información. Esta vulnerabilidad afecta a todas las versiones
de Linux y para explotarla se requeriría el envío continuo de tráfico.
Netflix también ha publicado los
parches para estas dos vulnerabilidades:
CVE-2019-11478 – PATCH_net_2_4.patch
CVE-2019-11479 – PATCH_net_3_4.patch
y PATCH_net_4_4.patch
Más información:
- TCP
SACK PANIC – Kernel vulnerabilities – CVE-2019-11477, CVE-2019-11478 &
CVE-2019-11479 https://access.redhat.com/security/vulnerabilities/tcpsack
- Linux
and FreeBSD Kernel: Multiple TCP-based remote denial of service vulnerabilities
https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001.md
Fuente: Hispasec