lunes, 27 de junio de 2011

¿Es Segura Internet? (III). Las armas de Jack Sparrow

En la primera parte de esta serie, abordamos los conceptos básicos de Seguridad en Internet, incidiendo en la importancia de que los usuarios conozcamos y pongamos en uso unas pocas buenas prácticas que hagan más difícil

Vimos en la segunda parte  que los atacantes pueden acceder a nuestros servidores web utilizando tráfico web estándar (http o https) y, si les damos la oportunidad, se aprovecharán de alguna vulnerabilidad de nuestros sistemas, equipos software base o aplicaciones para comprometer nuestra seguridad.

En esta última parte, de contenido más técnico, queremos responder a las preguntas:

¿Cómo consigue un pirata informático introducirse en nuestros sistemas informáticos? ¿Qué armas utilizan los hackers y con qué resultados?


Habitualmente, lo hacen utilizando como puerta de entrada nuestras aplicaciones Web.

El Top 10 de los ataques a aplicaciones Web
En la gráfica siguiente podemos ver los ataques más típicos a aplicaciones Web según el OWASP (Open Web Application Security  Project). Ver informe completo aquí.


El principal tipo de ataque es el de Inyección, que está asociada normalmente a la falta de verificación de los datos que introduce el usuario en sus interacciones a través de la Web, como veremos más adelante.

Tipos de ataque a aplicaciones Web

Vamos a describir algunos de estos mecanismos de ataque:
  • Inyección de SQL:Normalmente, en las páginas Web se nos pide introducir algún dato. La aplicación recoge el dato y ejecuta algún tipo de acción o comando, habitualmente sobre una base de datos SQL.

    Por ejemplo, en la página inicial de acceso, después de pedir al usuario introducir su nombre y  clave, la aplicación ejecutaría una sentencia sql del tipo: 
Select * from usuarios where usuario=$nombre and clave=$clave;

Donde $nombre y $clave contienen los valores introducidos por el usuario.

Si en la aplicación Web no hacemos una buena comprobación de los valores que introduce el usuario, este podría incluir caracteres de escape o especiales de forma que, al componer la sentencia sql, se podrían ejecutar acciones no deseadas en la base de datos o en el sistema operativo sobre el los que se ejecutan nuestras aplicaciones.
A modo ilustrativo, si el usuario introduce en los campos de la página web los valores:

            Nombre=Andres
Clave=cualquiera’;drop table usuarios;--

La sentencia SQL que se ejecutaría finalmente sería :

            Select * from usuarios where usuario=’Andres’ and clave=’ cualquiera’;drop table usuarios;--‘;

Lo que daría como resultado el borrado en la base de datos de toda la tabla de usuarios!!!!

(Notese que el caracter ; suele interpretarse como separador entre dos comandos SQL, mientras que el caracter -- suele ser empleado para comenzar un comentario. Esto puede variar según la base de datos y/o el sistema utilizado).

De forma similar se podrían realizar acciones más dañinas y sofisticadas.

  • Cross site scripting (XSS):
Es un tipo de ataque de inyección consistente en incluir un script  en un campo de la aplicación, en un parámetro o en una variable. En muchas ocasiones, el comportamiento normal de  la aplicación es reflejar o reproducir los datos que el usuario introduce.

Si la aplicación no hace una comprobación correcta de lo que se introduce en los campos, en parámetros de las URLs o en las variables, y lo que introduzco es un código en Javascript, el navegador del usuario lo ejecutará. 

Realmente, no es una vulnerabilidad que afecte a nuestro servidor web. A lo que afecta es al comportamiento del navegador. Este tipo de ataque se ha utilizado para aparentemente alterar la fotografía de alguno de nuestros políticos en la web corporativa. La foto estaba bien en la Web, pero lo que veía el usuario en su navegador era la página oficial “alterada”.

Sin embargo, no hay que subestimar XSS ya que las posibilidades de utilizarlo para alterar el comportamiento de la web , o de capturar o alterar datos, son casi infinitas y la mayor parte de las webs más conocidas y utilizadas  (redes sociales, periódicos, fabricantes software) son vulnerables a este tipo de ataques . 

  • Cross site Request Forgery (CSRF):
Es un poco lo contrario a XSS. En este caso, el atacante intenta inyectar una petición a la aplicación como si fuera el usuario real. De hecho, la petición la genera el propio navegador del usuario.

El  ataque debe  realizare mientras está activa una sesión . Por ejemplo, si tenemos la costumbre de abrir gmail y dejar la sesión activa todo el día, esto facilita este tipo de ataques.

El atacante tiene que forzar a la víctima a realizar una petición preparada por él.

Esto se puede hacer de la siguiente manera. Mientras el usuario está conectado a su banco, en otra pestaña accede a una web comprometida (en la que por ejemplo, se muestra información atractiva sobre depósitos u ofertas bancarias).

Si el usuario pincha en un enlace de esta web, se genera una petición válida al banco sin saber que el usuario lo advierta. El banco, por su parte, lo considera una petición válida, ya que el usuario se ha identificado correctamente.

Los bancos se protegen de este tipo de ataques añadiendo validaciones adicionales a las operaciones más críticas, como solicitar un código o firma de comprobación adicional (a veces recibido vía SMS)  para autorizar transferencias.

Vamos a pasar a continuación a ver qué medidas pueden adoptarse para protegernos de los ataques de los  piratas modernos.

Evitando a Jack Sparrow

Como resumen a lo que hemos visto hasta ahora, hay dos tipos de aspectos a tener en cuenta en la Seguridad Web: 
  • Los relativos a la seguridad del entorno sobre el que se asientan las aplicaciones que desarrollamos (comunicaciones, sistemas operativos, bases de datos, lenguajes de programación, Servidores de aplicaciones y Web, Gestores de contenido, etc)
  •  Los específicos a los controles que debemos realizar en nuestras aplicaciones Web. 
Las medidas a adoptar deben cubrir ambos aspectos:

·     Actualización del software de base: Sistemas operativos, servidores web, servidores de aplicaciones, bases de datos, etc.

Es algo básico, pero no por eso menos importante y muchas veces olvidado. Debemos utilizar las últimas versiones estables del software utilizado para nuestros servicios web y actualizarlas constantemente.

Esto evita tener vulnerabilidades conocidas que pueden permitir a un hacker explotar debilidades conocidas.

·    Dar la menor información a los posibles atacantes sobre qué sistemas utilizamos en nuestra plataforma web.

Los ataques son más sencillos si el atacante identifica el  sistema operativo, servidor web, bases de datos y  lenguajes de programación utilizados.

Las medidas concretas a adoptar comprenderían:
    • Ocultar en las cabeceras html y en general del código de nuestras  páginas web aquellos datos que puedan dar pistas sobre qué sistemas utilizo.

      Ver el código fuente de nuestra página web es algo que cualquier navegador web permite. Un hacker experto puede buscar en el código referencias a productos utilizados, sistemas operativos, versiones de bases de datos, etc.

      Por ejemplo, si en el código de nuestra página se encuentra algo similar a:

                    "contentviewer_WAR_alfresco_packportlet_INSTANCE_K5zv....

      aunque no entendamos el código, vemos que hace una referencia a un producto en concreto, Alfresco, que es un conocido gestor de contenidos. Con esta información, un hacker buscaría debilidades conocidas y documentadas de este producto para iniciar un ataque dirigido.
    • No utilizar variables que den pistas e las tecnologías de desarrollo utilizadas (ej PhpSession, errormysql, etc)
    • eliminar mensajes de error en los que se indiquen direcciones IP o tecnologías utilizadas,
    • eliminar metaetiquetas que indiquen los productos utilizados o la empresa que ha diseñado la web.
    • Eliminar los comentarios de los programas.
    • Eliminar directorios y contenidos conocidos de las distribuciones estandar del software utilizado.
  • No confiar en las comprobaciones que se realicen en el cliente web (ej. JavaScript). El usuario puede guardar la página web en local, modificarla y enviar datos no validados. Por lo tanto, cualquier valor que recibamos del navegador, debe ser comprobado y validado en el servidor web. 
  • Utilización de Firewalls de aplicación web.
Los firewall estándar no sirven de protección para los servicios web. Únicamente restringen el tráfico a los puertos 80 y 443, pero los ataques suelen producirse sobre el tráfico Web permitido.
Los firewalls de aplicación web permiten  proteger  recursos de nuestro servidor web con vulnerabilidades conocidas.

  • Configuración de IDS (Sistemas de detección de intrusos) para detectar ataques sobre nuestra  infraestructura Web.
  • Realizar auditorias web.

    Los logs pueden permitir identificar comportamientos extraños o no deseados de los usuarios. Suelen utilizarse después de producirse un ataque pero su uso debe ser principalmente preventivo. Es conveniente planificar la revisión de logs como una tarea más de cada día.
  • Formar a los desarrolladores en seguridad Web.
Logotipo del OWASP
Los desarrolladores aprenden todo tipo de técnicas y metodologías, pero frecuentemente se olvidan los aspectos de seguridad como parte de esta formación.

Solo hay que pensar que, en cualquier producto software comercial se corrigen varias vulnerabilidades cada mes. ¿Cuántas vulnerabilidades se corrigen en  las aplicaciones que desarrollamos in house?

Como fuente de conocimiento e ideas para mejorar la seguridad de las aplicaciones, se puede consultar los diferentes recursos que ofrece la web del proyecto de seguridad de aplicaciones web  http://www.owasp.org/.


La regla del 90%

Desgraciadamente, en este caso, las probabilidades van en nuestra contra. Podemos asegurar un 90% de nuestros equipos y aplicaciones web adoptando todas las medidas recomendadas. Sin embargo, a un atacante le valdría  con encontrar un único agujero  en ese 10% que hemos dejado sin proteger, para comprometer nuestros sistemas.

Conclusiones

Con esto finalizamos esta incursión por las aguas de la seguridad Web. El objetivo de esta serie de posts ha sido únicamente el de concienciar sobre la importancia de la Seguridad de las Aplicaciones Web.

La seguridad, en general, es un mundo técnicamente complejo y difícil de hacer comprender a la alta dirección, ya que supone que los proyectos  requieran una mayor inversión en tiempo y dinero para finalmente no poder garantizar una seguridad completa (dicen que las palabras seguridad y completa no deberían estar nunca escritas en la misma frase...).

Sin embargo, es un esfuerzo necesario, particularmente en los aspectos de la seguridad web. Si nos fijamos, hay una tendencia en todas las organizaciones a que todas nuestras aplicaciones, internas y externas,  estén basadas en tecnología  web, lo que aumenta la importancia de las medidas de protección a las que nos hemos referido.

Finalmente, incidir de nuevo en la formación y concienciación tanto de los desarrolladores y técnicos de sistemas de nuestras organización, como de la alta dirección para dispongan de la información y del conocimiento que les permita adoptar las decisiones oportunas relativas a la seguridad de las aplicaciones web y de los sistemas de información que las soportan.

No hay comentarios:

Publicar un comentario

Agradecemos tu comentario