Categories
.NET ASP.NET Firefox Internet Explorer Seguridad Web XSS

Mitigar el robo de cookies a través del atributo HttpOnly

El Service Pack 1 y las versiones posteriores de Microsoft Internet Explorer 6 admiten la propiedad HttpOnly para las cookies, que puede ayudar a mitigar las amenazas a las secuencias de comandos entre sitios que originan cookies robadas. Las cookies robadas pueden contener información confidencial que identifique al usuario en el sitio, como el id. de sesión de ASP.NET o el vale de autenticación mediante formularios, que el atacante puede reproducir para hacerse pasar por el usuario u obtener información confidencial. Cuando un explorador compatible recibe una cookie HttpOnly, ésta resulta inaccesible para la secuencia de comandos de cliente.

Establecer la propiedad HttpOnly no evita que un atacante con acceso al canal de la red obtenga acceso a la cookie directamente.

Tal como se puede observar en la cita, al usar este tipo de cookies se ofrece más protección para evitar robo de los mismos a través de ataques XSS, puesto que no es posible acceder a los valores marcados con este atributo desde javascript.

En ASP.NET 2, para habilitar esta característica, se puede hacer a nivel individual o para todas las cookies de la aplicación.

Para el primer caso, sólo es necesario asignar en true la propiedad Secure del cookie.

csharp:

Response.Cookies["test"].Secure = true;

Para que esta característica englobe a todas las cookies de la aplicación, simplemente hay que cambiar la propiedad httpOnlyCookies de la sección httpCookies del Web.config

xml:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="false"/>
    <authentication mode="Forms">
      <forms name="__auth" defaultUrl="default2.aspx" cookieless="AutoDetect" path="/" loginUrl="default.aspx">
      </forms>
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>
    <httpCookies httpOnlyCookies="true"/>
  </system.web>
</configuration>

Al hacer estos cambios, las cabeceras que se envían al cliente son las siguientes:

code:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/8.0.0.0
Date: Tue, 13 Feb 2007 13:03:29 GMT
X-AspNet-Version: 2.0.50727
Set-Cookie: test=foo; path=/; secure; HttpOnly     ---> el atributo secure es por Response.Cookies["test"].Secure = true;
Set-Cookie: demo=5; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html; charset=utf-8
Connection: Close

Si se quisiera utilizar este tipo de cookies desde otros lenguajes que no dan soporte para esta característica, lo único que se tiene que agregar en las cabeceras es el texto HttpOnly luego de definir nuevas cookies, por ejemplo en PHP podríamos hacer algo como lo que sigue*.

php:

setcookie('foo', 'test', null, '/;HttpOnly');

Por el momento esta característica está disponible de manera nativa sólo en Internet Explorer, para Firefox tenemos que hacer uso de extensiones como las de Stefan Esser, que en realidad sólo renombra las cookies y encripta el contenido de éstas.

* Al parecer en PHP 5.2 ya hay un soporte para esta característica.

Categories
.NET ASP.NET Desarrollo de Software Microsoft Web XSS

Cross Site Scripting en ASP.NET y la respuesta de Microsoft

Luego de haber reportado el pequeño bug sobre XSS en asp.net a través de Microsoft Connect, finalmente dijeron que no corregirán ese bug para la siguiente versión de .NET Framework (orcas) por motivos de compatibilidad con versiones anteriores.

En la respuesta -bastante común por cierto- hacen referencia a esta entrada escrita por S. Somasegar en la que se comenta que se realizarán cambios mínimos para la siguiente versión.

Entonces, por lo pronto queda a responsabilidad de los desarrolladores tomar las medidas necesarias para evitar el problema descrito en una entrada anterior.

Nota: el bug necesita intervención del usuario y -me parece que- sólo funciona en Firefox.

Categories
.NET ASP.NET Windows Forms

Variables por referencia

Ayer mientras publicaba un ejemplo sobre variables por referencia y comparación de objetos -como respuesta a una pregunta hecha en un foro, me surgió el siguiente problema:

csharp:

using System;

class Program
{
    static void Main(string[] args)
    {
        object a = new object();
        object b = a; // [1]

        a = "test"; // [2]

        Console.WriteLine(a == b);
    }
}

Por algún motivo la expresión a == b evalúa a falso, aún cuando se sabe que en [1] a y b deberían tener la misma referencia para el objeto creado en el paso anterior. En [2] asigno un string para evitar problemas con el boxing/unboxing entre variables por referencia y por valor, he probado asignando otros objetos también pero sin ningún efecto sobre el resultado final.

Lo curioso de esto es que si se comenta [2], esta vez la expresión evalúa a verdadero, resultado que confirma que a y b tienen la misma referencia -cabe recordar que tanto el operador = como el método Equals sólo comparan referencias.

No sé si esto es un bug o feature, en todo caso, estaré muy agradecido si alguien me ahorra tiempo de búsqueda para absolver esta pequeña duda.

Nota: sé que es difícil que el código mostrado pueda aparecer en una determinada aplicación.

Categories
.NET ASP.NET Microsoft Windows Forms

The Quality Code Handbook

Este es un pequeño ebook, distribuido al parecer de manera gratuita incluye los siguientes temas:

  • Desarrollo orientado a pruebas, hace una breve y básica introducción al Desarrollo Orientado a Pruebas, para el ejemplo hace uso del entorno de pruebas de Visual Studio Team System -hubiera sido mejor con algún xUnit pero bueno...
  • Como mejorar el rendimiento de aplicaciones administradas, nuevamente hace referencia a una herramienta (profiler) de Team System, para detectar cuellos de botella en nuestras aplicaciones.
  • Herramientas de análisis de código para desarrolladores de aplicaciones nativas, en realidad no he leído este capítulo puesto que no uso C++ 😀
  • Modelado de amenazas: este apartado es un pequeño manual de uso de la aplicación Threat Analysis and Modeling Tool, que permite modelar las amenazas desde el diseño de la aplicación -gran parte de las funcionalidades de esta herramienta están basadas en el libro Writing Secure Code
  • Análisis de código con FxCop, FxCop es una herramienta que permite analizar ensamblados para determinar si el código sigue las buenas prácticas definidas para el BCL.
  • Pruebas de stress para aplicaciones web, comenta la importancia de este tipo de pruebas en aplicaciones Web
  • Personalización de check-ins en Visual Studio Team System, tampoco he leído este capítulo puesto que subversion cubre todas nuestras necesidades en el trabajo :).

Como se habrán dado cuenta, en este ebook se pone énfasis en herramientas de Microsoft -en realidad no existe casi referencia a otras alternativas. Si desean descargarlo pueden hacerlo desde esta dirección, pero para poder visualizar el documento de este software.

Fuente: Blog de Dave Glover

Categories
.NET ASP.NET

Versión final de ASP.NET AJAX

Hoy liberaron la versión final de ASP.NET AJAX, entre los cambios
que trae esta versión, están:

  • Mejora de rendimiento y escalabilidad para hostings compartidos.
  • Corrección de ScriptManager y ScriptResource para el soporte de fechas en diferentes culturas
  • Posibilidad de habilitar/deshabilitar la compresión de javascript a través de ScriptResource
  • Correcciones de otros bugs

Pueden descargar esta versión desde el sitio oficial, adicionalmente
también está disponible una nueva versión de ASP.NET AJAX Control Toolkit