ClickCease Guía de vulnerabilidades de corrupción de memoria en el núcleo de Linux

Tabla de contenidos

Únase a nuestro popular boletín

Únase a más de 4.500 profesionales de Linux y el código abierto.

2 veces al mes. Sin spam.

Guía de vulnerabilidades de corrupción de memoria en el núcleo de Linux

Rohan Timalsina

22 de mayo de 2023 - Equipo de expertos TuxCare

Los ciberataques están motivados principalmente por el beneficio económico, lo que lleva a los atacantes a idear nuevas técnicas para acceder continuamente a los datos. A pesar del constante aumento de la frecuencia y complejidad de estos ataques, las vulnerabilidades de corrupción de memoria siguen siendo el principal problema que persiste desde hace cuatro décadas. 

Los administradores pueden aprovechar sus conocimientos sobre la corrupción de memoria para proteger activamente su infraestructura contra los ciberatacantes. Esta guía pretende proporcionar a los administradores los conocimientos necesarios para comprender la corrupción de memoria y sus consecuencias en caso de explotación de vulnerabilidades. 

 

¿Qué son las vulnerabilidades del núcleo de Linux?

El kernel de Linux es vulnerable a diversos problemas de memoria. Las siguientes vulnerabilidades basadas en la memoria son en las que se centran los atacantes y son la base de muchos de los parches de seguridad que se publican cada mes. Si alguna vez te has preguntado por qué una vulnerabilidad específica requiere un parche crítico, estos problemas pueden conducir a graves violaciones de datos.

 

Desbordamiento del búfer

Un desbordamiento de búfer se produce cuando los desarrolladores no validan las variables antes de asignarles datos. Cuando los datos superan la capacidad definida de la variable, se produce un "desbordamiento", que permite a un atacante inyectar su propio código en el espacio de memoria adyacente. Sin una validación adecuada de los datos, un desbordamiento del búfer podría dar lugar a que un atacante obtuviera acceso de root o pudiera ejecutar código remoto.

Dado que Linux está escrito en C, es vulnerable al desbordamiento del búfer, a diferencia de otros lenguajes de programación como Python y Java, que no son vulnerables a los ataques de desbordamiento.

CVE-2023-0179 es un ejemplo de vulnerabilidad de desbordamiento de búfer. Este problema podría permitir la fuga de direcciones de pila y heap, y potencialmente permitir la Escalada Local de Privilegios al usuario root mediante la ejecución de código arbitrario.

 

Desbordamiento de enteros

Los desarrolladores definen el valor máximo que puede almacenarse en una variable entera en función del tipo de datos utilizado. Por ejemplo, una variable entera sin signo de 32 bits puede almacenar valores comprendidos entre 0 y 4.294.967.295, mientras que un entero con signo puede almacenar valores comprendidos entre -2.147.483.648 y 2.147.483.647. Sin embargo, si el código añade un valor que supera el límite máximo de la variable, se produce un "desbordamiento", lo que conduce a resultados inesperados. 

Por ejemplo, si una sentencia intenta sumar 1 a una variable que almacena el valor 2.147.483.647, el resultado será un valor negativo de -2.147.483.648. Del mismo modo, si un entero negativo se desborda, el resultado será un número positivo. El comportamiento de los enteros sin signo depende del lenguaje de programación utilizado, pero en el caso del lenguaje C, los resultados son a menudo impredecibles.

CVE-2022-0998 es una vulnerabilidad de desbordamiento de enteros encontrada en el código del controlador de dispositivo virtio del kernel de Linux. Un usuario local puede utilizar este fallo para bloquear o escalar potencialmente sus privilegios en el sistema.

 

Corrupción de la memoria

Los desarrolladores y administradores de servidores a menudo encuentran que la corrupción de memoria en el kernel de Linux es un problema difícil. Dicha corrupción puede conducir a comportamientos impredecibles, y en algunos casos, no se lanza ningún error. Este problema surge cuando los desarrolladores alteran involuntariamente los datos en memoria o modifican punteros que apuntan a ubicaciones de memoria específicas donde se almacenan los datos. 

CVE-2023-1073 es un ejemplo de vulnerabilidad de corrupción de memoria descubierta en el subsistema de dispositivos de interfaz humana (HID) del kernel de Linux. Un atacante local puede utilizar este fallo para bloquear o potencialmente escalar sus privilegios en el sistema.

Denegación de servicio

Son ampliamente conocidos los ataques de denegación de servicio distribuidos (DDoS), en los que los atacantes aprovechan múltiples dispositivos secuestrados para inundar un objetivo con tráfico, lo que provoca la caída de los servidores. 

Sin embargo, cualquier ataque que interfiera con un servicio se conoce como ataque de denegación de servicio (DoS). Una gestión inadecuada de la memoria suele provocar ataques DoS basados en la memoria, conocidos como ataques de agotamiento de recursos. Estas vulnerabilidades pueden ser perjudiciales, provocando caídas críticas del servicio que afecten a miles de usuarios si existen en los servidores.

CVE-2023-1390 es un ejemplo de vulnerabilidad remota de denegación de servicio descubierta en el módulo TIPC del kernel de Linux. Este fallo permite a un atacante remoto provocar una denegación de servicio.

 

Desviación de puntero NULL

En programación C, un puntero es una variable que almacena la dirección de memoria de un valor, en lugar del valor en sí. Esto permite a los desarrolladores manipular el valor almacenado en una ubicación de memoria específica, incluso si la variable asociada con esa ubicación está fuera de alcance. 

Una desviación de puntero NULL tiene lugar cuando una aplicación intenta acceder a una posición de memoria a través de un puntero que asume como válido, pero que en realidad es NULL. Esto puede provocar que la aplicación se bloquee o termine inesperadamente.

CVE-2022-47929 es una vulnerabilidad de desviación de puntero NULL encontrada en la implementación de la disciplina de colas de red del kernel de Linux. Esta vulnerabilidad permite a un atacante local causar una denegación de servicio (caída del sistema).

 

Utilizar antes de la inicialización

Cuando una función utiliza una variable para modificar o crear datos, la propia variable debe inicializarse primero con un valor. Si a la variable no se le asigna un valor, se considera no inicializada y provoca un comportamiento indefinido si se hace referencia a ella en el programa.

El comportamiento indefinido de los datos no inicializados es difícil de detectar ya que los compiladores de C no están obligados a diagnosticar o lanzar un error. La mayoría de los desarrolladores trabajan con herramientas de prueba o fuzzing para identificar los datos no inicializados que podrían causar problemas de error indefinido.

CVE-2022-29968 es un ejemplo de una vulnerabilidad use-before-initialization encontrada en el kernel de Linux donde el subsistema io_uring carece de inicialización de kiocb->private. Este fallo permite a un atacante local exponer información sensible (memoria del kernel).

 

¿Cuáles son las vulnerabilidades de memoria más peligrosas?

Cada año, MITRE publica su Informe sobre los 25 puntos débiles más peligrosos del software. Tenga en cuenta que este informe incluye ataques basados en la web, pero las tres vulnerabilidades de memoria más comunes y peligrosas son:

  • Desbordamientos del búfer
  • Desbordamientos de enteros que conducen a un desbordamiento del búfer
  • Dereferencia de puntero (falta comprobación de puntero)

Las tres vulnerabilidades pueden provocar graves filtraciones de datos. Las vulnerabilidades de corrupción de memoria han sido responsables de algunas de las mayores filtraciones de datos hasta la fecha. Una conclusión importante de un informe de inteligencia reciente es que alrededor del 72% de los ataques son específicos de aplicaciones y de aplicaciones web. Un atacante puede identificar problemas en el código y crear un exploit para aprovecharse de la vulnerabilidad, ya que los programas de código abierto se incluyen con frecuencia en código dependiente o son la propia aplicación principal.

La tercera estadística interesante del informe es que el 21% de los ataques tienen como objetivo el sector tecnológico. La información sensible debe ser almacenada, conectada en red, protegida y transferida por el sector tecnológico. Al centrarse en este sector, los atacantes podrían acceder a la infraestructura que almacena los datos y abusar discretamente de ella, exponiendo posiblemente a la empresa durante meses.

 

¿Cómo se identifican las vulnerabilidades de corrupción de memoria?

La corrupción de la memoria suele ser el resultado de errores de los desarrolladores, pero en escenarios en los que se ejecutan varias aplicaciones en una misma máquina, identificar qué aplicación está causando problemas puede ser complicado. Una forma de identificar errores en Linux es comprobar los registros del sistema, donde el sistema operativo detecta cualquier problema. 

Por ejemplo, Linux reserva los primeros 64 KB de memoria para la BIOS, y cualquier modificación realizada en este espacio de memoria es escaneada por el sistema operativo. Si Linux detecta cualquier cambio realizado en esta memoria reservada, registra una advertencia para que los administradores solucionen el problema.

Como Linux es un sistema operativo de código abierto, los investigadores informan de muchas vulnerabilidades basadas en la memoria. Uno de estos descubrimientos recientes es la vulnerabilidad "BleedingTooth", que permite a los atacantes con la dirección bd de una máquina objetivo bloquearla, causando una denegación de servicio (DoS), elevando privilegios y posiblemente obteniendo acceso a claves de cifrado.

Los investigadores de seguridad utilizan diversas herramientas y técnicas para encontrar fallos en el software, como la revisión minuciosa del código y el uso de herramientas de escaneado, como el fuzzing, para detectar errores que pueden notificarse a los desarrolladores. Una vez detectadas las vulnerabilidades, los desarrolladores parchean el código y se publica una actualización de seguridad para solucionar el problema.

 

¿Cómo se soluciona la corrupción de memoria?

Afortunadamente, Linux ha implementado varias características de seguridad para ayudar a combatir la corrupción de memoria, incluyendo Kernel Address Space Layout Randomization, Control Flow Integrity, y Kernel Page Table Isolation. Sin embargo, a pesar de estas características de mitigación, el sistema operativo y sus dependencias siguen siendo vulnerables a los ataques.

Las técnicas de mitigación varían en función de la vulnerabilidad detectada, pero las soluciones temporales suelen consistir en desactivar un componente crítico. Por ejemplo, durante el incidente Heartbleed, los administradores podían desactivar el heartbeat utilizado en OpenSSL para comunicarse entre el cliente y el servidor. Aunque esto resolvió temporalmente el problema, cualquier aplicación que requiriera una señal de heartbeat del servidor habría experimentado resultados inesperados, como caídas o denegación de servicio.

Sin embargo, las técnicas de mitigación temporales no son permanentes, y deben aplicarse parches para dejar de explotar la vulnerabilidad de forma permanente. Los parches de seguridad actualizan el código, pero requieren un reinicio del sistema, lo que supone tiempo de inactividad. En consecuencia, los administradores de sistemas suelen retrasar la aplicación de parches a las vulnerabilidades hasta que se dispone de una ventana de mantenimiento, lo que ha provocado algunas de las violaciones de datos más importantes hasta la fecha.

 

¿Cómo proteger su infraestructura de las vulnerabilidades de corrupción de memoria?

Dado que los administradores quedan a merced de los desarrolladores, es esencial que tomen las medidas adecuadas para detener a los atacantes. Puede que usted no controle el código, pero los administradores pueden tomar las medidas adecuadas para minimizar la superficie de ataque de la red y evitar ser el próximo objetivo. He aquí algunas formas en que los administradores pueden detener los ataques basados en memoria:

  • Realice análisis de vulnerabilidades con regularidad. Los análisis de vulnerabilidades identificarán problemas, incluidos los que ya se han hecho públicos. Cuando se encuentra una vulnerabilidad, se puede instalar un parche.
  • Realice pruebas exhaustivas de cualquier aplicación de terceros antes de promoverla a un servidor de producción.
  • Utilice live patching de KernelCare para aplicar rápidamente los últimos parches de seguridad sin necesidad de reiniciar el sistema.

 

Conclusión

La detección de vulnerabilidades basadas en la memoria es un reto, y la aplicación inmediata de parches es crucial para proporcionar una protección óptima contra errores. KernelCare Enterprise ofrece un servicio de aplicación de parches en directo que elimina la necesidad de que los administradores retrasen la aplicación de parches. Parchea automáticamente varias versiones de Linux sin tiempo de inactividad ni interrupciones, garantizando que la infraestructura crítica no quede expuesta a vulnerabilidades mientras se espera una ventana de mantenimiento.

Resumen
Guía de vulnerabilidades de corrupción de memoria en el núcleo de Linux
Nombre del artículo
Guía de vulnerabilidades de corrupción de memoria en el núcleo de Linux
Descripción
Lea esta entrada del blog y conozca la amenaza de las vulnerabilidades de corrupción de memoria, incluidas sus causas y cómo proteger su sistema.
Autor
Nombre del editor
TuxCare
Logotipo de la editorial

¿Desea automatizar la aplicación de parches de vulnerabilidad sin reiniciar el núcleo, dejar el sistema fuera de servicio o programar ventanas de mantenimiento?

Más información sobre Live Patching con TuxCare

Conviértete en escritor invitado de TuxCare

Empezar

Correo

Únete a

4,500

Profesionales de Linux y código abierto

Suscríbase a
nuestro boletín