Identificar, mitigar y prevenir ataques de desbordamiento de búfer en sus sistemas
Las vulnerabilidades de desbordamiento de búfer siguen siendo una vía habitual por la que los ciberdelincuentes obtienen acceso ilegal a los sistemas informáticos. Además, se trata de un problema creciente, ya que año tras año se registra un aumento constante de las vulnerabilidades de desbordamiento del búfer.
También es un problema antiguo. Puede que no lo sepas, pero los ataques de desbordamiento de búfer son uno de los los vectores de ataque más antiguos - los desbordamientos de búfer se identificaron por primera vez como un riesgo de violación de la seguridad en 1972.
Con decenas de miles de vulnerabilidades de desbordamiento de búfer conocidas, incluidos casos tan profundos como Heartbleed, los desarrolladores y administradores de sistemas deben conocer bien cómo detectar, mitigar y prevenir los ataques de desbordamiento de búfer.
Siga leyendo para saber qué es un ataque de desbordamiento del búfer y qué puede hacer su organización para detener estas amenazas.
¿Qué es un ataque de desbordamiento del búfer?
En primer lugar, hay que entender qué es un búfer en términos de software informático. Los búferes son áreas de almacenamiento temporal de datos mientras se ejecuta un programa. Los búferes son necesarios porque los sistemas interconectados, incluidas las aplicaciones, no siempre están sincronizados.
En otras palabras, a veces, cuando se envía información de un punto a otro, el destinatario no está preparado y la información debe esperar en algún sitio. Para eso se utiliza un búfer: los búferes permiten la coordinación. Esto puede deberse a que los dos puntos funcionan a velocidades diferentes o con prioridades distintas.
Comprender un desbordamiento de búfer
La memoria del ordenador es finita, por lo que los programadores deben definir los espacios de almacenamiento con un tamaño finito, incluido el tamaño de un búfer. Por ejemplo, un programador definirá un búfer para almacenar una contraseña de 8 caracteres en 8 bytes. Cuando se escribe la contraseña y se envía al búfer, se supone que la contraseña no tiene más de 8 caracteres de longitud y, por lo tanto, cabe en el búfer.
Un desbordamiento del búfer se produce cuando, en lugar de una contraseña de 8 caracteres, se envía al búfer una contraseña de 10 caracteres. Cuando esto ocurre, el programa informático se ve obligado a guardar los datos en algún sitio y, como resultado, los datos sobrantes se almacenan en otro búfer. En algunos casos, los dos caracteres adicionales pueden acabar almacenados en algún lugar que sobrescriba datos importantes o incluso el código del programa.
Por supuesto, los programadores deben evitar que esto ocurra diseñando su código para comprobar si las entradas superan la longitud del búfer, o utilizando otras herramientas de mitigación. Sin embargo, si el programador simplemente se basa en la suposición de que la entrada siempre coincidirá con el tamaño del búfer, entonces puede surgir una vulnerabilidad de desbordamiento de búfer - y que podría conducir a un ataque de desbordamiento de búfer.
Cómo funciona un ataque de desbordamiento del búfer
En términos sencillos, en un ataque de desbordamiento de búfer, un hacker escribe intencionadamente datos que exceden el tamaño del búfer en un búfer - provocando un desbordamiento del búfer. La intención puede ser bloquear la aplicación o escribir datos maliciosos (incluido código ejecutable) en un espacio de almacenamiento de datos deseado.
Por ejemplo, si un atacante coordina correctamente el desbordamiento del búfer, puede escribir código malicioso en un espacio objetivo que contenga código ejecutable y, a continuación, ejecutar su propio código. Del mismo modo, el hacker puede utilizar un desbordamiento de búfer para sobrescribir los datos del búfer y cambiar el comportamiento de un programa.
Hay esencialmente dos tipos de ataques de desbordamiento de búfer:
- Los ataques de desbordamiento del búfer de la pila son el tipo más común de ataque de desbordamiento de búfer e implican la sobreescritura de la memoria de pila que se utiliza durante la ejecución de un programa. Al escribir un exceso de datos en el búfer, el hacker casi siempre consigue corromper los datos del búfer contiguo.
- Desbordamientos de heap implican un ataque en el que el hacker intenta inundar el espacio de memoria que se asigna a un programa más allá de lo que se utiliza para las operaciones que se están ejecutando en ese momento. Corrompe los datos de forma que la aplicación que se está ejecutando sobrescribe sus estructuras internas.
Ambas estrategias de ataque pueden comprometer los sistemas, provocar la pérdida de datos y la interrupción del servicio.
¿Cuáles son los riesgos de un ataque de desbordamiento del búfer?
Los desbordamientos de búfer son sólo uno de los muchos vectores de ataque que existen, y las intenciones se solapan con muchos otros exploits de vulnerabilidades.
Vale la pena señalar que, incluso cuando la ejecución remota de código es demasiado difícil con un ataque de desbordamiento de búfer, los hackers pueden causar estragos utilizando desbordamientos de búfer para simplemente causar caídas de aplicaciones - y una condición de denegación de servicio (DoS) - que, a su vez, dará lugar a otras consecuencias.
Además, se puede argumentar que un ataque de desbordamiento de búfer es a menudo sólo el primer paso en un plan de ataque mucho más complejo - si el objetivo final es la ejecución remota de código, escalada de privilegios, o algo más.
Por supuesto, los ataques de desbordamiento de búfer tienen características únicas, pero en general podemos sugerir que los hackers utilizarían un ataque de desbordamiento de búfer para lograr cualquiera de los siguientes objetivos:
- Interrupción del servicio: Mediante un ataque de desbordamiento de búfer, un pirata informático podría provocar una interrupción del servicio. Puede ser relativamente fácil utilizar una vulnerabilidad de desbordamiento de búfer para hacer que una aplicación se bloquee, provocando la caída de los servicios que soporta.
- Acceso no autorizado: Un actor malintencionado puede utilizar una vulnerabilidad de desbordamiento de búfer para obtener acceso ilícito a la infraestructura informática, lo que podría abrir la puerta a un sinfín de amenazas.
- Ejecución del código: A través de un ataque de desbordamiento de búfer, un atacante puede utilizar sus sistemas para ejecutar código que el atacante escribió con fines delictivos.
- Pérdida de datos: Los ataques de desbordamiento del búfer se pueden utilizar para desviar datos manipulando el comportamiento de la aplicación y luego redirigir las salidas y capturar ilegalmente los flujos de datos.
A grandes rasgos, los riesgos de las vulnerabilidades de desbordamiento del búfer son similares a los de la mayoría de las vulnerabilidades, y sin duda son igual de graves.
Ejemplos reales de vulnerabilidades por desbordamiento del búfer
Al principio de este artículo, señalábamos que las vulnerabilidades de desbordamiento de búfer se identificaron por primera vez en 1972. Aunque algunos casos de ataques exitosos habrían surgido poco después, el mundo informático de hace 50 años y pico no era tan omnipresente, ni estaba tan expuesto, como lo está hoy.
El primer ejemplo clave de un ataque generalizado de desbordamiento de búfer es el gusano Morris. En 1988, este gusano viajó por la incipiente Internet hasta hacer caer el 10% de la entonces "Internet" en sólo dos días. A lo largo de dos años, este gusano informático afectó a 60.000 ordenadores.
Tal vez la vulnerabilidad de desbordamiento de búfer más conocida sea Heartbleed. Surgió en 2014 como una vulnerabilidad crítica en una pieza de software que se utiliza ampliamente: OpenSSL. Innumerables servidores de Internet gestionados por empresas importantes, como Yahoo, utilizaban la biblioteca criptográfica OpenSSL para implementar el protocolo TLS (seguridad de la capa de transporte).
Esta vulnerabilidad de desbordamiento de búfer también fue causada por un simple error. Se redujo a una clásica falta de comprobación de límites en el código informático detrás de OpenSSL. Por supuesto, OpenSSL fue finalmente corregido mediante un parche pero no antes de que la vulnerabilidad causara alarma generalizada - y daños.
Los riesgos no se limitan a los rincones técnicos de Internet. Las aplicaciones populares también corren el riesgo de sufrir exploits de desbordamiento de búfer: la popular app de chat WhatsApp sufre una vulnerabilidad de desbordamiento de búfer, que fue archivada como CVE-2019-3568 en mayo de 2019. En este caso, los atacantes pudieron utilizar la vulnerabilidad para ejecutar código malicioso en el dispositivo móvil de un usuario manipulando paquetes justo al inicio de una llamada de voz.
Otros ejemplos son:
- El gusano Stuxnet en 2010: Dirigido al programa nuclear iraní, el ataque explotó una vulnerabilidad de desbordamiento de búfer en el sistema operativo Windows.
- El hackeo de Sony Pictures en 2014: Los atacantes utilizaron un exploit de desbordamiento de búfer en la red de la empresa para acceder a información sensible y causar trastornos generalizados.
- El ataque del ransomware WannaCry en mayo de 2017: Este ataque afectó a más de 200.000 ordenadores en 150 países aprovechando una vulnerabilidad de desbordamiento de búfer en Microsoft Windows.
- El ataque a la cadena de suministro de SolarWinds en diciembre de 2020: Los atacantes utilizaron un exploit de desbordamiento de búfer en el software de gestión de red SolarWinds Orion, obteniendo acceso a las redes de múltiples organizaciones.
- El exploit de día cero de Zscaler en noviembre de 2021: Este ataque afectó a los servicios de seguridad basados en la nube de Zscaler utilizando una vulnerabilidad de desbordamiento de búfer para ejecutar código arbitrario.
Mitigación y prevención de ataques de desbordamiento del búfer
El panorama de los desbordamientos de búfer ha cambiado un poco con el tiempo: en cierto modo, los riesgos más elementales de desbordamiento de búfer se mitigan ahora automáticamente. Los proveedores de sistemas operativos y software, así como los programadores, tienden a aplicar prácticas que limitan los desbordamientos de búfer incluso cuando existe una vulnerabilidad subyacente.
Tanto los proveedores como los usuarios de software deben ser conscientes de los riesgos de desbordamiento del búfer y mitigarlos en consecuencia. Dicho esto, los usuarios no pueden hacer mucho para proteger sus entornos contra los ataques de desbordamiento del búfer. Corresponde al proveedor programar el software de forma segura y parchearlo rápidamente cuando sea necesario.
Prevención por parte del vendedor
Los vendedores de software son los responsables últimos de prevenir las vulnerabilidades de desbordamiento de búfer. La existencia de oportunidades para explotar las limitaciones de los búferes a menudo se reduce a las características del software.
Puede ser tan sencillo como ser consciente de las limitaciones del lenguaje de programación utilizado y de los riesgos implícitos de ese lenguaje: C y C++ no tienen protección integrada contra los desbordamientos de búfer, mientras que Java, PERL y C# disponen de algunos mecanismos de seguridad.
He aquí algunos enfoques específicos que pueden adoptar los vendedores:
- Cuidado con las suposiciones: Los programadores a menudo pueden asumir ciertos hechos en torno a las operaciones de una aplicación, pero los atacantes pueden explotar estas suposiciones. En lugar de ello, los programadores deben codificar teniendo en cuenta que las suposiciones pueden ser violadas. La comprobación de límites, que implica verificar que una entrada no excede el tamaño del búfer, es un ejemplo clave.
- Aleatorización de la disposición del espacio de direcciones (ASLR): Muchos ataques de desbordamiento de búfer se basan en el conocimiento de la ubicación del espacio de direcciones. Al aleatorizar la disposición del espacio de direcciones, es más difícil coordinar un desbordamiento de búfer, ya que la ubicación del objetivo se desplaza de forma continua y aleatoria.
- Ejecución límite: Configurar las pilas como no ejecutables significa que los atacantes no pueden utilizar desbordamientos de búfer para ejecutar código malicioso en una pila.
- Evite los errores de programación: Las oportunidades de desbordamiento del búfer se deben, la mayoría de las veces, a un código informático específico. Los programadores deben comportarse a conciencia y evitar cometer errores que puedan ser aprovechados por los atacantes.
Los puntos anteriores pueden mitigar los riesgos de ataques de desbordamiento del búfer, pero en última instancia, inevitablemente se cometerán errores.
Mitigación desde el lado del usuario
Al hablar de las opciones que los vendedores pueden aprovechar para fortalecer su software contra los ataques de desbordamiento de búfer, nos dejamos un punto clave: las vulnerabilidades de desbordamiento de búfer a menudo sólo se descubren una vez que el software ya se ha lanzado al mercado.
Este escenario no es inusual y refleja lo que suele ocurrir con el descubrimiento de vulnerabilidades. Hay una solución sencilla: el proveedor publica un parche que cierra la vulnerabilidad de desbordamiento del búfer, y el usuario final instala el parche para mitigar la vulnerabilidad.
Cuando los usuarios finales están motivados para proteger sus cargas de trabajo contra las vulnerabilidades de desbordamiento del búfer, la opción más eficaz, con mucha diferencia, siempre será la aplicación regular y coherente de parches. Sin embargo, la aplicación eficaz de parches es más fácil de decir que de hacer, ya que puede resultar molesta y consumir muchos recursos.
La aplicación de parches automatizada y sin reinicios mediante herramientas como KernelCare reduce la necesidad de recursos y de interrupciones del servidor. No obstante, a veces las vulnerabilidades de desbordamiento del búfer son desconocidas, o simplemente no existe un parche eficaz. Algunas opciones a las que pueden recurrir los usuarios son:
- Supervise los comportamientos inusuales: Vigile de cerca el rendimiento y los registros de su servidor y su red para detectar la actividad de intrusos del mismo modo que vigilaría cualquier otro exploit.
- Gestionar los privilegios: Los atacantes a menudo confían en permisos y privilegios poco gestionados. Asegúrese de que sus aplicaciones y sus usuarios operan con el mínimo de permisos de acceso para garantizar que los atacantes no tienen la oportunidad de escalar.
- Herramientas de prevención de amenazas: Las vulnerabilidades de día cero pueden explotarse rápidamente, pero las herramientas automatizadas, como los cortafuegos de aplicaciones web, pueden detener algunos ataques mediante la supervisión de patrones de comportamiento sospechosos y la simple detención del tráfico procedente de fuentes sospechosas.
Por último, sugerimos a los usuarios finales que protejan sus cargas de trabajo eligiendo cuidadosamente a sus proveedores de sistemas operativos y software. Hágase preguntas clave: ¿cuál es la reputación del proveedor en materia de seguridad del software? ¿Lanza rápidamente parches cuando se detecta una vulnerabilidad?
Dado que las vulnerabilidades de desbordamiento del búfer son esencialmente un problema de programación, corresponde a los proveedores gestionar la vulnerabilidad y, como usuario final, usted puede protegerse investigando cuidadosamente con qué proveedores trabaja.
Resumen
Los proveedores de software son los responsables últimos de mitigar las vulnerabilidades de desbordamiento del búfer. Al fin y al cabo, todo se reduce al código de la aplicación. Afortunadamente, los proveedores suelen responder publicando parches que eliminan las oportunidades de explotar los desbordamientos de búfer.
Para las organizaciones, la rápida introducción de nuevos parches es fundamental. Herramientas automatizadas como KernelCare Enterprise ayudan a eliminar la fricción en la aplicación de parches. No obstante, al igual que con cualquier otra amenaza cibernética, las empresas también deben aplicar medidas de ciberhigiene más amplias para limitar los riesgos de vulnerabilidades de desbordamiento de búfer, y vulnerabilidades en general.