sábado, junio 27, 2015

Aplicaciones .NET con campos ViewState sin firmar o cifrar

Las aplicaciones web escritas en ASP.NET utilizan desde su concepción hace ya muchos años un campo oculto llamado ViewState que controla el flujo de datos y estados de la aplicación en todo momento. Este campo se utiliza para garantizar la privacidad y la integridad de la información en cada uno de los intercambios de información que se producen entre el servidor web y el cliente web. Es decir, para garantizar que la información no ha sido manipulada y que además se ha transferido de forma correcta en todos sus campos.

Figura 1: Aplicaciones ASP.NET con campos ViewState sin firmar o cifrar

Para poder conseguir estos objetivos con garantías, ViewState debe ir firmado y cifrado, pero esto no siempre es así, sobre todo en aplicaciones más antiguas que puedan estar aún en los servidores de muchas organizaciones.

Firmado de ViewState

Desde ASP.NET v.1.0 los campos ViewState van firmados por con un código MAC (Machine Authentication Check), que no es más que un CheckSum de toda la información que se encuentra almacenada dentro de ViewState. La idea es tan sencilla como que una vez que se decide qué se tiene que transferir, se hace una codificación en BASE64, se hace el CheckSUM de la misma y se calcula el valor MAC.

Figura 2: Flujo de utilización de ViewState

De esta forma, cuando se carga la página que se debe renderizar o cuando se envía de vuelta al servidor se puede comprobar si esta ha sido modificada verificándola con el valor de ViewState. Si no coincide, el servidor dará un error de aplicación.

Figura 3: Error .NET de fallo de validación de MAC en el campo ViewState

Esto está configurado a TRUE por defecto en la propiedad EnableViewStateMac desde la versión ASP.NET 1.0, por lo que es raro encontrar aplicaciones que no manejen el campo ViewState firmado, pero si esto sucediera entonces las funciones de integridad de la web aportadas por ASP.NET no serían robustas. 

Cifrado de ViewState

En cuanto al cifrado del campo ViewState no se activó por defecto hasta la versión ASP.NET 2.0. donde para configurar que se cifre el contenido almacenado - y no vaya solo codificado en BASE64 y con un código MAC - hay que configurar los valores decryptionKey y decrypt de las propiedades de MachineKey, tal y como se explica en este artículo de la MSDN

Figura 4: Generación de claves de MachineKey

La claves para algunas versiones de ASP.NET, como se puede ver en la imagen superior, se pueden crear y renovar desde el servidor IIS 7, tal y como se explica en este blog de MSDN.

Decodificar campos ViewState sin cifrar

No es demasiado común encontrar aplicaciones ASP.NET que tengan el campo ViewState sin cifrar, pero aún así, en nuestro sistema de Pentesting Persistente Faast, uno de los plugins que se centra en la seguridad y vulnerabilidades de este tipo de tecnologías, sí que lo revisa. En el siguiente ejemplo se puede ver una web localizada en producción con el campo ViewState sin cifrar.

Figura 5: Detección de aplicación ASP.NET con ViewState sin cifrar

Cuando el campo está sin cifrar, lo único que sucede es que se pueden acceder a todos los datos en tránsito, y entre ellos pueden ir las cookies de sesión que se estén intercambiando, o cualquier otra información sensible de la web.

Figura 6: El campo ViewState localizado sin cifrar en un decodificador

El código para decodificar un campo ViewState sin cifrar es conocido - tenéis uno disponible en esta pregunta de StackOverflow -, y es fácil localizar decodificadores online que te muestran todo el contenido dentro del mismo, tal y como se puede ver en la imagen siguiente.

Figura 7: Contenido decodificado de un ViewState sin cifrar

La firma y el cifrado de ViewState ayudan a hacer mucho más robustas las aplicaciones ASP.NET y a protegerlas frente a ataques avanzados, por lo que es una recomendación de seguridad básica en estos entornos. Además, los campos ViewState ayudan también a gestionar la seguridad frente a ataques CSRF, pero eso exige otras configuraciones de las que ya os contaré en otro artículo.

Saludos Malignos!

1 comentario:

Unknown dijo...

Que tal chema, este error es del servidor o del cliente, bueno en la pagina informatica64 me tiro un error similar, Espacio en disco insuficiente.. bueno es casi similar a este.... te envie correo con imagen :D

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares