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