Vulnerabilidades del software
Vulnerabilidades del software
Las vulnerabilidades son la piedra angular de la seguridad, puesto que suponen el origen del que derivan numerosos fallos de seguridad. Una vulnerabilidad en un programa informático o software es simplemente un error, un problema en su código o en su configuración. Es muy probable –por no decir que se produce siempre– que los programas contengan errores, puesto que han sido creados por seres humanos. Esto es especialmente frecuente en el caso de las aplicaciones muy complejas (como por ejemplo, un sistema operativo), que tienden a contener errores de manera exponencial. La peculiaridad que convierte un simple fallo en una vulnerabilidad es la posibilidad de que el "abuso inteligente" de este defecto pudiera llevar a un riesgo de seguridad que compromete todo el sistema sobre el que se ejecuta esa aplicación. En los siguientes epígrafes se analizarán los aspectos básicos de las vulnerabilidades: por qué ocurren y cómo gestionarlas.
Qué es una vulnerabilidad
Una vulnerabilidad es un fallo en un programa o sistema informático. Pero no cualquiera, sino un fallo de seguridad. Es necesaria esta distinción puesto que no todos los errores de programación derivan en fallos de seguridad. Un error en un programa puede llevar a que no funcione correctamente o que su comportamiento no sea el esperado, pero no todos estos tipos de problemas pueden considerarse fallos de seguridad. Según la capacidad de aprovecharse de este defecto, la vulnerabilidad será más o menos grave. Una vulnerabilidad se define, básicamente, por cinco factores o parámetros que deben identificarla.
Producto
Para definir una vulnerabilidad, lo primero que es necesario conocer es a qué productos afecta. Dentro de un mismo programa, incluso, puede afectar a una sola versión, a toda una rama o incluso a programas totalmente diferentes que compartan un mismo fallo. Este último supuesto ocurre cuando la aplicación afectada por la vulnerabilidad reside en sistemas operativos diferentes. Por ejemplo, todas las distribuciones de Linux comparten una buena cantidad de software, entre ellos, el propio núcleo del sistema. Una sola vulnerabilidad en el kernel puede afectar a todas las distribuciones que lo utilicen, desde Debian a Mandriva pasando por OpenSuSE.
Dónde
Dentro de un mismo programa, una vulnerabilidad se localiza habitualmente en un componente o módulo. Los programas suelen componerse de varios módulos que interactúan entre sí. Una vulnerabilidad puede encontrarse en un módulo concreto del programa o bien por utilizar una configuración concreta. Por ejemplo, puede existir una vulnerabilidad en el módulo de interpretación de ficheros en formato RTF en Microsoft Word sin afectar al módulo que procesa otro tipo de ficheros. O en el módulo de procesado de ficheros MP3 en el programa de reproducción Winamp. Es posible que la vulnerabilidad no pueda ser aprovechada si este módulo no se encuentra activo. Por ejemplo, el módulo de procesamiento de JavaScript en documentos PDF no se encuentra activo por defecto en Adobe Reader. Si, por el contrario, el fallo se encuentra en un componente intrínseco al programa, no existe posibilidad de deshabilitar componentes. Esto puede ocurrir por ejemplo si se encuentra un fallo en el explorador de Windows o en su propio núcleo.
Causa y consecuencia
¿Cuál es el origen del problema? ¿En qué falló su programador? Esto se refiere al fallo técnico concreto que cometió el programador a la hora de crear la aplicación que es el origen de la vulnerabilidad. Por ejemplo, puede que no comprobarse bien qué valores alojaba una variable, los límites de la memoria, o que olvidara establecer unos permisos adecuados a unos ficheros. Un ejemplo claro es, que una falta de comprobación de caracteres en una aplicación web (causa), lleve a una posible inyección SQL (consecuencia). Otro ejemplo: Una falta de comprobación de límites en una variable (causa), puede llevar a un desbordamiento de memoria intermedia (consecuencia). Un último ejemplo: Un descuido a la hora de establecer los permisos de un servicio en Windows (causa) puede llevar a un salto de restricciones (consecuencia). Normalmente la causa de una vulnerabilidad es un fallo técnico de programación, una falta de comprobación que permite que se den circunstancias indeseadas en el código durante su ejecución.
Impacto
El impacto es lo que puede conseguir un atacante que aprovechase la vulnerabilidad. Por ejemplo, si existe un desbordamiento de memoria intermedia, es posible que el atacante pueda conseguir ejecutar código. Si la consecuencia de la vulnerabilidad es que el programa comienza a consumir recursos, es posible que el atacante pueda llegar a conseguir una denegación de servicio (hacer que el programa deje de responder). Si no se han comprobado bien los permisos del programa (causa) puede que se produzca un salto de restricciones (consecuencia) y que el atacante consiga elevar privilegios en el sistema (impacto).
Vector A la forma que tiene el atacante de aprovechar la vulnerabilidad se le conoce como “vector de ataque”. Un vector de ataque común es el envío de información especialmente manipulada a un puerto concreto del sistema. Otra forma de conseguir aprovechar una vulnerabilidad es creando un fichero manipulado que será procesado por ese programa. Por ejemplo, si se encuentra una vulnerabilidad en Word, es muy probable que el vector de ataque sea un archivo en formato .doc que aproveche la vulnerabilidad. Si la víctima lo procesa con un Word vulnerable, el atacante conseguirá el impacto deseado.
El programador de la aplicación MSPaint 7 omitió la comprobación correcta de un parámetro que define la longitud que debe tener una imagen, en la función SetImageSize del fichero image_size.dll. Así pues, como no se comprueba que el valor del parámetro coincida con el tamaño real de la imagen, se produce un desbordamiento de memoria. Explicado de forma sencilla: la memoria del ordenador llega a sitios donde no debería. Por tanto, un atacante puede retocar la cabecera de una imagen para modificar su atributo de tamaño, añadir a esa imagen qué código quiere ejecutar y aprovecharse de la vulnerabilidad. Vamos a extraer la información necesaria que define la vulnerabilidad:
• Producto y versión: MSPaint 7 es la versión afectada.
• Causa / Consecuencia: Se omite la comprobación del parámetro tamaño (causa) y se produce un desbordamiento de memoria intermedia (consecuencia)
• Dónde / Módulo: En la función SetImageSize del componente image_size.dll. Es una librería en la que se apoya mspaint.exe.
• Impacto: Lo que podría conseguir un atacante es ejecutar código arbitrario. O sea, ejecutar cualquier programa que desee: malware, virus, etc.
• Vector: ¿Cómo puede un atacante explotarla? Un atacante debería enviar un archivo de imagen manipulado (con el código que quiere ejecutar incrustado en su interior, y el parámetro incorrecto retocado) a la víctima, y ésta abrirla con la versión de MSPaint vulnerable. En ese momento se ejecutaría el código arbitrario con el que se ha manipulado la imagen y la víctima quedaría comprometida.
Comentarios
Publicar un comentario