Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.

martes, 30 de septiembre de 2008

Archivo hosts actualizado

El "hola mundo" de este blog fue un post que trataba sobre la navegación en Internet sin publicidad, ese gran mal que se ha ido apoderando en todas las formas posibles de la red de redes. Si bien hoy día las conexiones a Internet suelen ser tan rápidas que descargar esa publicidad no supone un porcentaje importante del ancho de banda, también hay ocasiones en las que no conviene malgastarlo. Es el caso de las conexiones mediante 3G, en las que se nos factura en función del tráfico generado, y en caso de tener una tarifa plana hay ocasiones en las que se aplica una reducción de velocidad en la conexión si superamos un determinado tráfico mensual.


Por otro lado, no cabe duda que hay publicida bastante intrusiva con el usuario, que se ve saturado de información y banners parpadeantes en Flash que nada tienen que envidiar a los GIFs animados de las páginas "En construcción" de la Web 0.11 ;) Si estás cansado de la publicidad al navegar, tal vez deberías "dar de comer" un poco a tu archivo hosts. La explicación de cómo hacerlo puedes encontrarla en aquella remota entrada, enlazada al principio de ésta. Y el nuevo archivo hosts, actualizado con más de 2.000 servidores de publicidad y malware listos para ser bloqueados, en la sección de descargas. ¡Que aproveche!


Puedes encontrar otros archivos hosts alternativos para complementar el que tengas actualmente en tu equipo en las direcciones:


lunes, 29 de septiembre de 2008

Gestión digital de derechos y medio ambiente

Cuando apareció Windows Vista, se criticó acertadamente a Microsoft por haber lanzando un producto extremadamente voraz con los recursos sobre los que se ejecutaba. Las mejoras visuales que incorpora (el modo Aero) no servían de justificación ya que GNU/Linux, con su Compiz Fusion, presentaba características similares ejecutándose de un modo fluido y elegante en un equipo, a priori, mucho más limitado técnicamente. Otra de las características de Vista que parecían ralentizarlo era la gestión de DRM que llevaba a cabo. No, no se trata de que Vista sea un Devorador de Recursos Magnífico (que también), sino que incorpora una Gestión de Derechos Digitales (Digital Rights Management en Gibraltar) que más la quisieran para sí los amigos de la SGAE. Esto, junto a un control radical del acceso de las aplicaciones a los recursos que ha dado más de un quebradero de cabeza a los desarrolladores, parece haber sido el causante del consumo de buena parte del tiempo de proceso que utiliza Vista cuando estamos ante el ordenador. Con esto no pretendo criticar al sistema operativo que, al fin y al cabo, es el que debe gestionar los recursos y ponerlos a disposición del usuario a través de las aplicaciones, pero sí es cierto que Vista no ha resultado todo lo óptimo que habríamos podido desear. En cualquier caso, lo cierto es que simplemente buscaba utilizar a Windows Vista como ejemplo ilustrador del verdadero tema que me gustaría abordar hoy: los DRM (y el medio ambiente).


Los DRM tienen una aplicación directa: gestionar y controlar la forma en que se difunde contenido protegido, o lo que es lo mismo, impedir la copia fraudulenta de material licenciado. Claro, que esto choca frontalmente con el derecho recogido por la ley (al menos en España) del derecho del usuario a la copia privada, y es por esto que diversos colectivos, como la FSF (Free Software Foundation), proponen denominarlos Digital Restriction Management, o Gestión de Restricciones Digitales. Si estáis interesados en este tema, en la Wikipedia existe un artículo muy completo e interesante sobre el tema.


Pero la limitación de los derechos de los usuarios frente a los de la industria no es el único problema ético que presentan los DRM. A éste han de sumársele los problemas medioambientales que provocan, ya que su uso provoca un incremento sustancial de energía en los dispositivos que los implementan que puede llegar hasta un 25% más respecto a la reproducción del mismo contenido sin incorporar esta protección digital (me refiero en particular a la reproducción de música y video). En el caso de Windows DRM el incremento en el consumo oscila entre un 20% y un 25%, y en el caso de Macintosh DRM queda en “sólo” un 8% de consumo respecto a medios digitales no protegidos, por lo que la duración de la batería podría reducirse entre 2 y 4 horas, aproximadamente, por cada recarga. Esto redunda, por un lado, en un claro incremento del consumo energético de los dispositivos implicados, y por otro, en una reducción de la vida útil de las baterías, que necesitan ser recargadas más a menudo y sufren un deterioro acelerado (por no hablar de dispositivos que utilicen pilas convencionales, que deban ser desechadas o reemplazadas por otras recargables, que presentarían el mismo problema mencionado para las baterías).



Una mala noticia que sumar a este hecho, es el cierre de servidores de licencias que ha anunciado Wal-Mart para el próximo 9 de octubre, por lo que recomienda a sus usuarios (y, de paso, a los de las compañías que hacen uso de estos servicios) que realicen copias de seguridad de su música en CDs de audio. Una limitación más que sumar a las impuestas por el uso de este tipo de mecanismos de restricción protección de derechos.

domingo, 28 de septiembre de 2008

Protección ante XSRF

Que la seguridad en las aplicaciones web debería ser un objetivo prioritario es algo que, a día de hoy, no puede resultar ajeno para nadie. Pero es habitual encontrar multitud de vulnerabilidades en el código de este tipo de aplicaciones que permanecen expuestas a millones de usuarios potenciales, y si entendemos a éstos como personas (otro caso será el de sistemas que actúen como usuarios de nuestros servicios) nos encontramos hablando de dos escenarios bien diferenciados pero complementarios: de un posible atacante y del usuario como eslabón más débil de la cadena.


Hoy quería traer al blog una pequeña introducción sobre XSRF (también conocido como CSRF o Cross Site Rereference Forgery), un modo de ataque basado en lo predecible de las invocaciones entre elementos en la Web y en la forma en que es procesada la información en los navegadores. XSRF actúa justo desde la perspectiva opuesta a los ataques XSS. Aquí es el sitio web “confiado” el que puede ser atacado con facilidad, ya que XSRF realiza una determinada petición a un sitio web que, si no es controlada por éste, puede desembocar en una actualización en la BD, la desconexión del usuario o llevar a cabo cualquier otro tipo de acción. La forma de conseguir que se ejecute la acción que pretende llevar a cabo el atacante es tan sencilla como incluir un determinado código aparentemente inocente en el servidor (mediante un ataque XSS, por ejemplo), o consiguiendo mediante ingeniería social que la víctima visite un sitio web del atacante que ejecutará automáticamente la acción.


Imaginemos que deseamos desconectar a nuestra víctima de un servicio, pongamos un ejemplo (y no quiero mirar a nadie…), de su cuenta de Google. Por poder, podemos hasta elegir la manera en que hacerlo: incluyendo una imagen rota/oculta, mediante un tag script, utilizando iframes o mediante un formulario (con peticiones tanto GET como POST). Para conseguir que se ejecute la acción, podemos enviar a la víctima un correo electrónico con una imagen incrustada, invitarle a visitar la presentación de un nuevo servicio, etc.


En el sitio web, que no requerirá de más tecnología que del HTML, podemos tener una página que incluya código como el siguiente (a elegir):




  • Un iframe con el src establecido a la URL de la acción a ejecutar:
    http://mivictima.com/logout

  • Un script:


  • Una simple imagen:

  • Un formulario:




  • Otro script:

    var img = new Image();
    img.src = " http://mivictima.com/logout ";




Todas estas técnicas funcionarán en webs que acepten parámetros mediante GET, siendo posible el ataque mediante POST utilizando el formulario (que, además, puede ser “lanzado” automáticamente mediante la inclusión del parámetro
OnLoad=”document.getElementById(miform).submit()”
en la etiqueta BODY de la web) o a través del último script presentado.


Como vemos resulta ser un método bueno, bonito y barato. Su potencial es mucho más alto, y podéis encontrar más información en el documento de Information Security Partners, o descargando los ejemplos de la entrada.


Visto esto, ¿cómo podemos proteger nuestro sitio web ASP.NET de este tipo de ataques? (Lo que veremos ahora, salvo excepciones, es válido para otro tipo de tecnologías, con ligeros cambios).




  • Evitar recuperar parámetros de la URL:
    Utilizar formularios que pasen los parámetros mediante POST. En ASP.NET deberíamos recuperarlos usando HTTPRequest.Form (Request.Form) en lugar del más común Request.Params["miparametro"];


  • Utilizar tokens de identificación:
    Es posible utilizar elementos que identifiquen a nuestro usuario, de manera que si la petición llega al servidor sin incluir dicho token (almacenado, por ejemplo, en sesión), no se llevará a cabo la acción solicitada. Incluso es posible asignar dicho token al par (usuario/acción), almacenando dicho token en nuestro servidor para mejorar incluso la seguridad del sitio web en lo concerniente a la autorización del uso de recursos. Lo ideal es que este token viaje entre el equipo del cliente y nuestro servidor vía POST, para que no sea visible en la URL (aunque podría viajar cifrado –y aquí poder es deber ;) -) y no llegue a otros sitios web a través del HTTP_REFERER.
    El uso de POST no nos inmuniza ante el XSRF, pero podríamos considerarla como una buena práctica de programación desde el punto de vista de la seguridad de nuestro código.
    También podemos utilizar el ViewState, utilizando la propiedad Page.ViewStateUserKey que proporciona un identificador único para el usuario que está visitando una página en concreto. La asignación de la propiedad se lleva a cabo durante el proceso de carga de la página, en concreto en el Page_Init de la misma.
    [csharp]void Page_Init(object sender, EventArgs e)
    {
    ViewStateUserKey = Session.SessionID;
    }[/csharp]

    La única pega de esta protección es el modo en que se comprueba el ViewState de la página, dependiendo de que exista un PostBack de la misma, por lo que no sería de mucha utilidad en aplicaciones que no lleven a cabo esta acción con frecuencia, como es el caso de las RIA’s que hacen uso intensivo de AJAX.


  • Limitar la duración de las sesiones de usuario:
    Si usamos la generación de un identificador único por usuario, podemos “forzar” la generación de más identificadores reduciendo (en un margen conveniente pero racional) la duración de la sesión en nuestro sitio web. Con esta acción únicamente ganamos algo de seguridad al reducir la ventana de exposición de los identificadores. Como contrapartida, algunas aplicaciones necesitan sesiones prolongadas, por lo que no sería factible llevarla a cabo en esos casos.


  • Controlar el HTTP_REFERER:
    Permitir únicamente solicitudes que provengan de nuestro dominio. Evitaremos así un posible ataque XSRF desde el exterior, aunque no nos protege de nosotros mismos: si un usuario es capaz de inyectar HTML en algún formulario que provoque la ejecución de la acción (y aquí uno de los mayores riesgos es la posibilidad de utilizar la etiqueta ), o sufrimos un ataque XSS de cualquier tipo, nuestra web estará expuesta también a XSRF.
    Al igual que el uso de POST, el control del HTTP_REFERER tampoco nos inmuniza frente al ataque de sitios ajenos a nuestro dominio, ya que el HTTP_REFERER puede ser simulado utilizando XmlHttpRequest o Flash, pero nos proporciona un poco más de seguridad que si no lo tenemos en cuenta, claro está.


  • Enviar una doble cookie:
    El XSRF se basa, como apuntaba al principio, en la posible ejecución de una acción en nuestra web desde un lugar (o dominio) ajeno a nosotros. Sin embargo, por la propia filosofía con la que se construyen los navegadores, las cookies pertenecientes a un dominio no pueden ser consultadas por otro. Por esto, podemos enviar el contenido de una cookie normalmente (usando la cabecera de la página) y otra vez como un valor oculto en un formulario, (leyendo la cookie mediante JavaScript e insertándola en el mismo). Si las dos cookies que nos llegan de este modo no coinciden, deberíamos ir planteándonos rechazar la petición ;) . La desventaja de este método es que no funcionaría en caso de que el usuario deshabilitase la ejecución de JavaScript en su navegador.

Para terminar, únicamente me gustaría insistir en la necesidad de formar a nuestro equipo de desarrolladores en metodologías adecuadas para lograr alcanzar un buen nivel de seguridad en nuestras aplicaciones. Esto es particularmente importante en aplicaciones web, que ya sea desde Internet o dentro de una Intranet, están expuestas a un gran número de posibles ataques. La seguridad, en programación, debería ser parte del diseño y no “algo” que implementar sobre la marcha, si hay tiempo…


Para saber más:


Una vieja máxima mía dice que...

...cuando has eliminado lo imposible, lo que queda, por muy improbable que parezca, tiene que ser la verdad.


Aunque no se trate de Holmes, sino de Roger Johnston, este PowerPoint suyo encontrado en Schneier on Security me ha arrancado algunas sonrisas con su ironía.


Arrogance Maxim: The ease of defeating a security device or system is proportional to how confident/arrogant the designer, manufacturer, or user is about it, and to how often they use words like “impossible” or “tamper-proof”.


Altamente recomendable.

sábado, 27 de septiembre de 2008

Cuesta abajo y sin frenos

Tras la indignación de ver cómo Google celebra su décimo aniversario actualizando el PageRank de algunas páginas (entre ellas Lobosoft) y bajo puntos, he estado repasando los motivos que suscitarían esa bajada de PageRank, y salvo el problema con los enlaces ocultos de mis amigos rusos y el consiguiente desensamblado del sitio web y vuelta a poner en marcha, no veo otros que puedan haber afectado al PageRank.


El caso es que el sitio recibe menos visitas que antes. Curiosamente, si busco “lobosoft” en Google.es el blog aparece en la tercera posición, igual que siempre (tuvo un pequeño bajón a la quinta posición en los resultados de búsqueda en el punto álgido de los ataques). Si consulto mediante “link:www.lobosoft.es” o “link:lobosoft.es”, siguen apareciendo los sitios web que apuntan al dominio. Incluso éste no parece estar baneado.



Por otro lado, recibe un interesante 7 (hay que mejorar, hay que mejorar) en características de posicionamiento SEO.



Total, que ante el misterio de a qué se debe la bajada del PageRank voy a escribirles un correíto a los chicos de Google a ver qué se cuentan :) .

Despecho

¿Por qué me tratas así? Deseaba únicamente felicitarte por tu cumpleaños y me haces esto… No sé si llegaré a perdonártelo, después de tanto tiempo juntos, permitiéndome hurgar en tu interior, buscar hasta lo más profundo de tu ser para desentrañar los misterios de la vida y la muerte… Sé que en ocasiones te he sido infiel, y he buscado en otras lo que tú no me dabas; también he dicho sobre ti palabras duras, aunque no por ello menos ciertas. Pero también he sido ser agradecido, alabar aquello que hacías bien e intentar mejorar lo que no, aunque eso sí, sin ocultar nunca aquello que, en un primer intento, tal vez no salió tan bien como habría sido deseable.


No esperaba esto de ti.


Vengo a felicitarte por tu décimo aniversario, Google, por tu página minimalista y siempre útil, y me encuentro con que me bajas el PageRank de 3 a 1. Como si no fuese nada para ti. Vale que con el ataque hacker del verano haya perdido visitas, estoy de acuerdo en que te volví un poco loco con mis actualizaciones del blog, pero en todo momento te hice saber la situación en que me encontraba, y te solicité que te hicieras cargo de ello. Para eso están los amigos, y las herramientas del webmaster que ofreces, ¿no? Esta visto que no. Así notaba yo este descenso pronunciado de las visitas…


¿Sabes lo que te digo? Que no me importa, que remontaré el blog, y que superaré el PageRank 3, te pese lo que te pese.


Y ahora, indéxate ésta.


:P

Charla para la "Microsoft Community"

Ayer estuve presente en la charla que Guillermo Som (“El Guille”) y David Salgado ofrecieron dentro de la serie de eventos que Microsoft promociona entre las comunidades de usuarios de .NET, y la verdad es que estuvo bastante interesante.


En primer lugar, el archiconocido Guille nos ofreció un repaso de las nuevas características que ofrece C# 3.0 a los desarrolladores. Así, nos habló de los tipos anónimos, de var y su uso más allá de LINQ que, a mi parecer, implica importantes riesgos de convertir el código C# en un nuevo VB repleto de variables tipo Variant si abusamos de esta característica(sí, sí, sé que no es lo mismo, pero si encontramos todo el código con variables declaradas con var…). Realmente var supone una interesante característica de cara al uso de LINQ, sin duda, pero no deja de ser azúcar sintáctico. También trató sobre los métodos de extensión y parciales, los operaciones ternarios (la doble interrogación) y las expresiones lambda. Aunque son características de interés para un desarrollador, lo cierto es que el tema de la charla me pareció un poco forzado, por un lado porque C# 3.0 lleva ya en el mercado 7 meses, y porque la charla estaba principalmente enfocada a desarrolladores VB.NET, como una introducción a C#, y se dejaba notar. En cualquier caso, el Guille resultó ameno y nunca viene de más un repaso en el que se aprenden algunas cositas nuevas.


Le siguió David Salgado, MVP C#, que tras un breve repaso a las tecnologías web, afrontó la dura tarea de desarrollar ante nuestros ojos un par de aplicaciones ASP.NET mediante el uso de ADO.NET Data Services y Entity Framework, AJAX (cuya Client Library viene ya incorporada se serie en el .NET Framework 3.5) y ASP.NET Web Services. Con un par de golpes de ratón y tras picar unas líneas de código teníamos ante nuestros ojos una aplicación web de gestión de un videoclub y su panel de control capaz de recibir consultas mediante REST instalados. Una interesante propuesta que estudiar, ahora que ando alejado del desarrollo web después de una buena cantidad de años inmerso en el mismo, y un punto de entrada de posibles atacantes que estudiar ;) .


En el turno de preguntas y respuestas, un poco de todo. El tema de seguridad que comentaba con esos ASP.NET Web Services, que inicialmente sólo puede controlarse mediante el uso de HTTPS y buenas prácticas de programación, un avance de que a finales de año posiblemente aparezcan nuevas versiones de IronPython y de IronRuby, y la tendencia de VB.NET 10.0 (sí existirá, señoras y señores) y C# 4.0 hacia la relajación de tipos, intentando adquirir características tanto de los lenguajes dinámicos como de los funcionales.


Así pues, una iniciativa que esperemos se repita pronto. Próximas citas, la Hackmeeting y la Conferencia Internacional de Software Libre, ambas en octubre.