Cómo reparar las vulnerabilidades más comunes del kernel de Linux
El kernel de Linux es ampliamente considerado el pilar de algunos de los proyectos más populares entre la comunidad de código abierto. Como módulo central del sistema operativo, la estabilidad, el rendimiento y la seguridad del sistema dependen en gran medida del kernel.
Por esta razón, los desarrolladores deben tener una comprensión completa de las fallas y vulnerabilidades de software comunes que afectan al kernel de Linux. Esto ayuda no solo a minimizar las posibilidades de exploits, sino también a mejorar la calidad general del software que compilas.
La mayoría de las vulnerabilidades en el kernel de Linux están asociadas con fallas como inyecciones de SQL. Asimismo, cadena de formato no controlada, desbordamiento de búfer, el desbordamiento de enteros y la inyección de comandos del sistema operativo. Independientemente de la falla detrás de una vulnerabilidad, hay tres factores principales que determinan su impacto o gravedad. Estos son:
- Existencia: presencia de una vulnerabilidad dentro del software
- Acceso: La posibilidad de que los atacantes tengan acceso a una vulnerabilidad
- Exploit: la potencialidad de los atacantes que aprovechan una vulnerabilidad utilizando técnicas o herramientas específicas.
Al explotar vulnerabilidades conocidas, los ciberdelincuentes pueden comprometer un sistema al obtener privilegios de root, provocar un bloqueo del sistema o acceder a la memoria. En este artículo, te guiaremos a través de tres de las vulnerabilidades más comunes del kernel de Linux.
También profundizaremos en cómo puedes detectar y mitigar estas vulnerabilidades.
1. CVE-2019-11477
Puntuación CVSS: 7.8
Afecta a los núcleos de Linux 2.6.29 versiones y superiores
Tipo (s) de vulnerabilidad: Denegación de servicio
También Conocida como TCP SACK PANIC. La CVE-2019-11477 es causada por un desbordamiento de enteros cuando el subsistema de red de Linux procesa el reconocimiento selectivo de TCP (SACK ).
Mientras se procesan segmentos TCP SACK, la estructura de datos del búfer de socket del núcleo se fragmenta. Para procesar eficientemente los bloques SACK, el núcleo combina múltiples buffers de socket en uno. Esto potencialmente desborda la variable que contiene el número de segmentos.
Un atacante podría aprovechar esta vulnerabilidad mediante el envío de solicitudes SACK creadas, lo que provocaría una condición de kernel panic. La explotación de la CVE-2019-11477 podría afectar la disponibilidad del sistema, causando una denegación de servicio.
Vale la pena mencionar que CVE-2019-11477 está estrechamente relacionado con otras dos vulnerabilidades asignadas con el ID CVE: CVE-2019-11478 y CVE-2019-11479. Ambas consideradas de gravedad moderada.
CVE-2019-11478 está relacionada con TCP SACK, mientras que este último es causado por una falla al procesar el tamaño máximo de segmento (MSS).
CVE-2019-11478
Una falla en el núcleo de Linux permite a los atacantes enviar una secuencia especialmente diseñada de solicitudes de SACK que fragmenta la cola de retransmisión de TCP.
Al explotar la cola fragmentada, un atacante podría causar un costoso recorrido de la lista vinculada para las solicitudes SACK recibidas para la misma conexión TCP.
El resultado sería un uso excesivo de los recursos del sistema a medida que la CPU intenta reconstruir la lista.
CVE-2019-11479
Esta vulnerabilidad es causada por una falla que permite a los ciberdelincuentes enviar paquetes con un valor MSS bajo. Esto conduce a un consumo excesivo de recursos.
El atacante obliga al núcleo a segmentar las respuestas en varios segmentos TCP, cada uno de los cuales contiene solo 8 bytes de datos.
Esto aumenta el ancho de banda requerido para transmitir la misma cantidad de datos. Esto conlleva a un consumo excesivo de recursos de CPU y potencia de procesamiento de NIC.
El impacto del ataque puede terminar después de que el atacante deja de enviar tráfico. No obstante, lo anterior se traduce en una reducción significativa en el rendimiento del sistema que resulta en un DoS para algunos usuarios.
Resolviendo vulnerabilidades TCP SACK PANIC
Si tu sistema es propenso a estas vulnerabilidades de TCP SACK PANIC, debes tomar medidas rápidas deshabilitando el componente vulnerable. Alternativamente, puedes usar iptables para detener conexiones cuyo tamaño de MSS pueda explotar con éxito la vulnerabilidad.
El segundo es más efectivo ya que mitiga las tres vulnerabilidades. Para evitar conexiones con MSS bajo, debes usar los siguientes comandos para el firewall tradicional de iptables.
Nota: debes deshabilitar net.ipv4.tcp_mtu_probing para que esta solución funcione de manera efectiva.
Esto elimina todos los intentos de conexión cuyo tamaño de MSS oscila entre 1 y 500.
2. CVE-2017-18017
Puntuación CVSS: 10.0
Versiones afectadas: Anteriores a 4.11 y 4.9x Anteriores a 4.9.36
Tipo (s) de vulnerabilidad: Denegación de servicio, corrupción de memoria
Una vulnerabilidad causada por la falla del Kernel para manejar excepciones puede conducir a una condición de denegación de servicio.
En la vulnerabilidad CVE-2017-18017, la función tcpmss_mangle_packet que se encuentra en net/netfilter/xt_TCPMSS.c permite a los hackers remotos ejecutar un ataque DoS.
Los atacantes también pueden realizar acciones no especificadas aprovechando la existencia de xt_TCPMSS en las acciones de iptables.
La función net/netfilter/xt_TCPMSS.c desempeña un papel importante en el filtrado de la comunicación de red. Esta función define el MSS que está permitido aceptar encabezados TCP.
El impacto de este tipo de falla podría ser potencialmente grave considerando que los atacantes pueden explotar la vulnerabilidad de forma remota.
Aquí hay un fragmento de código que puedes aplicar para mitigar esta vulnerabilidad:
3. CVE-2018-5390
Puntuación CVSS: 7.5
Versiones afectadas: Kernel de Linux 6 y superior
Tipo (s) de vulnerabilidad: Denegación de servicio
CVE-2018-5390 es una vulnerabilidad moderadamente grave en el kernel de Linux, también conocida como SegmentSmack.
Ocurre debido a una falla que existe en la forma en que el Kernel maneja paquetes TCP especialmente diseñados.
Los atacantes remotos pueden explotar esta falla para activar llamadas a las funciones tcp_prune_ofo_queue() y tcp_collapse_ofo_queue() enviando paquetes modificados dentro de las sesiones TCP activas.
Esto provoca la saturación de la CPU y un ancho de banda insuficiente para admitir el tráfico de red entrante en el sistema. Esta situación en última instancia conduce a una denegación de servicio. Sin embargo, para que un atacante mantenga la condición DoS, requiere sesiones continuas de dos vías a un puerto abierto. Esto significa que los ataques no pueden realizarse utilizando direcciones IP falsificadas.
Resolviendo SegmentSmack
Además de instalar un Kernel de Linux actualizado o reparado, puedes mitigar la vulnerabilidad cambiando los valores predeterminados de 4MB y 3MB de net.ipv4.ipfrag_low_thresh y net.ipv4.ipfrag_high_thresh (así como sus contrapartes de IPv6) a 192kB y 256kB respectivamente. El resultado será una caída significativa en la saturación de la CPU durante el ataque.
Aquí hay un script simple que puedes usar para cambiar o reducir la configuración predeterminada tanto para IPv4 como para IPv6.
#!/bin/shif [ "x$1" == "xlow" ]; then echo Settinig limits low: sysctl -w net.ipv4.ipfrag_low_thresh=196608 sysctl -w net.ipv4.ipfrag_high_thresh=262144 sysctl -w net.ipv6.ip6frag_low_thresh=196608 sysctl -w net.ipv6.ip6frag_high_thresh=262144 echoelif [ "x$1" == "xdef" ]; then echo Settinig limits default: sysctl -w net.ipv4.ipfrag_high_thresh=4194304 sysctl -w net.ipv4.ipfrag_low_thresh=3145728 sysctl -w net.ipv6.ip6frag_high_thresh=4194304 sysctl -w net.ipv6.ip6frag_low_thresh=3145728 echofiecho Current values:sysctl net.ipv4.ipfrag_low_threshsysctl net.ipv4.ipfrag_high_threshsysctl net.ipv6.ip6frag_low_threshsysctl net.ipv6.ip6frag_high_thresh
Protégete contra las vulnerabilidades del kernel de Linux
La forma más efectiva de protegerte contra las vulnerabilidades del kernel de Linux y las vulnerabilidades asociadas es escanear continuamente los repositorios.
De esta manera, es más fácil identificar componentes de código abierto vulnerables en tu proyecto y proporcionar la reparación necesaria a tiempo.
Una de las mejores herramientas para el trabajo es WhiteSource Bolt. Es una aplicación de GitHub que te permite escanear repositorios privados y públicos ilimitados para detectar vulnerabilidades en tiempo real. Si Bolt descubre vulnerabilidades dentro de tu código, genera automáticamente un nuevo problema en el rastreador de problemas.
También proporciona un informe detallado que muestra la puntuación CVSS de la vulnerabilidad, así como las correcciones sugeridas.
Aquí hay una instantánea que muestra cómo los desarrolladores de GitHub usan Bolt. Esta aplicación aprovecha el poder del código abierto sin comprometer la seguridad o la agilidad:
Además de usar Bolt, es crucial asegurarte de que las versiones de tus productos de software estén siempre actualizadas. Esto te ayudará a mantenerte protegido ya que los parches y las correcciones a menudo se implementan en versiones más nuevas.