XSS Cross-Site Scripting (I)

—Maestro, una vez más me atrevo a acercarme a ti con mis preguntitas sobre seguridad.
—Menos guasa, que ya sabes que yo “sólo sé que no sé nada”.
—Bueno, algo sabes…
—¿Qué tripa se te ha ro… digo… en qué puedo ayudarte?
—Estaba leyendo un blog en el que se hablaba de Cross-Site Scripting y, la verdad, no consigo entender de qué va el asunto; ni San Google me ha podido ayudar. Sólo he sacado en claro que el nombre no es del todo descriptivo y que se trata de utilizar una vulnerabilidad para inyectar código en un sitio para obtener datos de un usuario que cree estar visitando otro o algo así.
—Pues efectivamente, se trata de aprovechar una vulnerabilidad y es de lo más interesante. Es uno de los casos en los que puede caer hasta un usuario prudente, ya que no depende de que realice una actividad temeraria durante la navegación. Como sabes que suelo hacer, empezaré por describirte un posible escenario de lo que puede pasarle a un usuario, antes de entrar en la descripción de las interioridades.

“Alicia está leyendo uno de sus blogs favoritos sobre economía. Esta vez hay un post sobre un tema un tanto polémico y, como suele ocurrir, alguno de los comentarios es un poco incendiario, por lo que todos los demás se dedican a darle la razón o a contradecirlo. Alicia, curiosa, navega hasta el comentario en cuestión, lo lee, y aporta su opinión, identificándose previamente como usuaria registrada. El mal ya está hecho.

Al día siguiente, aparece un comentario de Alicia en el que se comporta como un troll, pero no ha sido ella. No es nada muy importante, pero tiene que dar algunas explicaciones al propietario del blog, a alguno de sus conocidos del MundoReal® que saben su nick y, por supuesto, pedir que le den de baja su usuario registrado.

Luego, empieza a ponerse un poco paranoica (o no) y piensa que el mismo usuario y contraseña lo está usando en otros blogs y foros y hasta en su cuenta de ¿flickr? ¿Facebook? … No en nada importante, como el banco online, claro. En fin, te haces una idea, ¿no?”

—Pero ¿qué ha hecho mal Alicia?
—Nada.
—Entonces, ¿de quién es la culpa?
—En este caso, de quien ha desarrollado la plataforma del blog, pero esto puede ocurrir en cualquier aplicación Web que acepte entradas de los usuarios (formularios, blogs, foros).
—Y, ¿cómo funciona?
—La base está en hacer que el sitio web vulnerable te muestre código script que tú has introducido (inyectado) previamente. Por ejemplo, en un campo buscador o en uno de un formulario o, en el caso del blog, en el campo de entrada del comentario. Si en lugar de introducir texto inocuo, el hacker pone código script y el servidor lo almacena o lo devuelve, el navegador de Alicia ejecutaría ese script.
—No acabo de entenderlo. ¿El hacker introduce el código y luego otro usuario lo ve y se ejecuta? Pero el otro usuario estará en otro sitio y en otro momento, ¿no?
—Cierto, te lo explico un poco mejor: el hacker pone un comentario en el blog de antes, pero además de texto normal, introduce un trozo de código en (java)script. Si la aplicación guarda esa información en una BD o en un archivo para uso posterior (como ocurre con los blogs), cuando Alicia accede a los comentarios del blog, el script se muestra, y por tanto se ejecuta en su navegador. Es lo que se llama un ataque stored (almacenado).
—¿Y si no se almacena el texto?
—Entonces, es ligeramente más complejo. Se trata de conseguir que Alicia acceda al sitio vulnerable con toda la información que el atacante necesita ya metida en la URL. Es decir, tiene que “clickar” en una URL que contiene la dirección de la página del sitio vulnerable, el campo correspondiente, el contenido y el “efecto” del click de enviar. Aunque parece complejo, en realidad no es muy complicado construir la URL. En este caso, se trata de un ataque reflected (reflejado).
—¿Cómo consigue el hacker que Alicia clicke en una URL así?
—Normalmente, ingeniería social. Es decir, engañándola. Puede ser con un email en el que se le dice que mire algo en un sitio web (que, además, conoce y en el que probablemente confía), o con una URL con una referencia a una noticia o a otro contenido del sitio Web vulnerable. El usuario clicka porque conoce el sitio destino, pero la URL es maligna y contiene un script. En fin, hay muchas formas.
—Y con eso el hacker consigue…
—Por ejemplo, la cookie de sesión de Alicia, con la que puede suplantarla, obtener y cambiar su contraseña, obtener información privada que tiene el sitio vulnerable, etc. Además, como mucha gente utiliza el mismo usuario y la misma contraseña en varios sitios, puede empezar a acceder a esos sitios, obtener más información … en fin, te haces una idea.
—Entiendo. Y, ¿cómo se puede evitar?
—Desde el punto de vista de Alicia, hay poco que pueda hac…

Ring, Riiinngg

—Vaya, el teléfono. Espera, ahora te cuento.

(Continuará…)

Jornada de Seguridad: D. Salvador Soriano (Ley de Impulso de la Sociedad de la Información)

Siguiendo con la serie de posts sobre las ponencias de la jornada Seguridad 2008 del jueves pasado en Valencia, corresponde a este intrépido reportero dar noticia de las ideas principales de la charla de D. Salvador Soriano, subdirector general de servicios de la sociedad de la información, que habló sobre la Ley de Medidas de Impulso de la Sociedad de la Información o LISI.

Al parecer, una de las barreras principales para la extensión de los servicios de la sociedad de la información es la desconfianza de los ciudadanos. Estamos en las primeras posiciones de la Unión Europea en cuanto a falta de confianza en la seguridad en el uso de las TIC. Además, a pesar de que nuestras administraciones figuran en los primeros puestos en cuanto a servicios telemáticos ofrecidos a los ciudadanos y las empresas, estas últimas están a la cola en cuanto al uso de dichos servicios.

[Read more…]

10 consejos de seguridad personal

Si no sigues estos consejos, incrementas la probabilidad de perder información o de que te la roben. Siguiendo una cierta tradición de los decaloguistas, pondremos 11.

1. Haz copias de seguridad… y comprueba de vez en cuando que funcionan.

2. Elige contraseñas que no sea trivial suponer (no uses fechas personales, ni tu nombre ni el de tus allegados). Cambia las contraseñas por defecto o las que te den los administradores o los sitios al darte de alta. Cambia las contraseñas regularmente. Usa letras y números combinados.

3. Utiliza un antivirus. Los hay gratuitos y muy buenos. Mantenlo actualizado. Se puede hacer de manera automática diariamente. Instala una aplicación de detección de spyware.

4. Actualiza tu sistema operativo. Aplica los parches de seguridad.

5. No uses Internet Explorer. Usa Opera o Firefox. Deshabilita ejecución automática de cualquier anexo en el correo electrónico.

6. Usa un cortafuegos personal. No dejes conectarse a nadie por defecto. No dejes puertos abiertos sin saber para qué se usan.

7. Deshabilita servicios que no utilices, como el acceso remoto.

8. Si tienes red WiFi, habilita protección WPA. No te conectes a redes que no usen WPA. Cambia la contraseña del router y desactiva el broadcast del SSID.

9. No abras correos con anexos de gente desconocida. Ni de gente conocida que “no entienden de esto” y puede que te pasen algo que les han pasado…

10. No respondas al correo basura. NO les digas que no quieres más correo basura, porque es la manera de que sepan que tu dirección es buena y lees los mensajes.

11. Haz el equivalente digital de lo que harías en el mundo real: no te metas en callejones oscuros, no llames la atención de los delincuentes, cierra la puerta con llave al salir de casa, aunque vayas a pedir sal al vecino, no dejes una copia de la llave en el buzón, etc.

Open Source y seguridad

No se puede basar la seguridad de un programa en el secreto de los algoritmos utilizados o de su implementación (el secreto se debe aplicar a las claves privadas). Aunque parezca paradójico, es más seguro poner a disposición pública el código fuente de un programa que mantenerlo en secreto. Abrir el código supone exponer sus vulnerabilidades y parecería que es mejor que los delincuentes no puedan verlas, que no les demos esa ventaja.

Sin embargo, hay que tener en cuenta que los delincuentes buscan vulnerabilidades de dos formas: (a) ejecutando el programa, proporcionándole datos “problemáticos” y analizando los resultados o (b) buscando patrones en el código fuente. En el primer caso no se requiere los fuentes y en el segundo se pueden obtener mediante un des-compilador (suficiente para buscar vulnerabilidades, aunque no para entender y modificar la funcionalidad de un programa).

Una vulnerabilidad no conocida es una espada de Damocles. Puede que alguien la descubra y no lo divulgue, con objeto de sacarle partido en su propio provecho. Por eso es positivo difundir información sobre las vulnerabilidades en los canales públicos, porque los delincuentes ya disponen de la información y la distribuyen por sus canales. De esta manera, al menos los defensores tienen igualdad de oportunidades.

Cuando el código está a la vista, los desarrolladores tienden a escribir código más cuidado y elegante (la comunidad puede ser muy cruel) y a utilizar estándares, lo que elimina en gran medida el riesgo de introducir errores. De hecho, cuando un programa pasa de cerrado a abierto, durante un tiempo, las vulnerabilidades antes ocultas quedan expuestas. Pero, poco después, se corrigen, dando como resultado un programa más seguro.

Una organización realmente preocupada por su seguridad, debería tener acceso al código de sus programas críticos para poderlos auditar.