Ataque Padding Oracle en ASP.NET


Durante la conferencia de seguridad ekoparty, el pasado 17 de septiembre, Juliano Rizzo (@julianor) y Thai Duong (@thaidn) demostraron cómo realizar ataques “Padding Oracle” a sitios web ASP.NET explotando una vulnerabilidad del framework. Con ello el atacante puede descifrar cualquier información sensible guardada del lado cliente, e incluso descargar archivos “prohibidos” como web.config y tener acceso a sus datos sensibles, por ejemplo: cadenas de conexión, credenciales de seguridad, etc.

En resumen, se puede descifrar las cookies, los “ViewState”, tickets de autenticación, contraseñas de membrecía, datos de usuario, y cualquier otra cosa cifrada usando la API del framework

– Juliano Rizzo

Ante ello Scott Guthrie escribió un post sobre dicha vulnerabilidad, mientras que Microsoft lanzó el Aviso de Seguridad (2416728) que describe la vulnerabilidad que afecta a todas las versiones de ASP.NET. La vulnerabilidad afecta a todas las versiones de ASP.NET desde 1.x hasta el 4.0 y afecta a todos los frameworks de desarrollo de ASP.NET (ASP.NET WebForms, ASP.NET MVC,  etc.). Por ende productos basados en ASP.NET, como SharePoint, Team Foundation Server, entre otros, se ven afectados también.

El “Padding Oracle”

Serge Vaudenay, profesor del Laboratorio de Seguridad y Criptografía (LASEC) del Instituto Federal Suizo de Tecnología (EPFL), publicó en 2002 el documento "Security Flaws Induced by CBC Padding Applications to SSL, IPSEC, WTLS…" [PDF], donde señala que varios sistemas de "relleno" (padding) de cifrado utilizados en sistemas de entrada de longitud variable pueden introducir grandes fallos de seguridad.

Cuando un mensaje cifrado de entrada de longitud variable se descifra basado en el algoritmo RFC 2040, el receptor tiene que determinar lo que es relleno, si el relleno es correcto, entonces lo descarta. Pero el RFC 2040 no especifica lo que el receptor debe hacer si el relleno no es correcto. Esto conduce a un ataque que utilice un oráculo para cualquier boque de secuencia que le diga si el relleno de la secuencia CBC-descifrada correspondiente es correcta de acuerdo al algoritmo RFC 2040.

Según Vaudenay, esta vulnerabilidad puede afectar a protocolos como SSL, IPSec, WTLS, SSH, existiendo la posibilidad de descifrar los datos cifrados sin tener la clave secreta. Él demuestra cómo funciona el ataque y sugiere una posible vía para solucionar la vulnerabilidad.

¿Como funciona?

Se puede consultar este artículo: Automated Padding Oracle Attacks with PadBuster, que también muestra cómo funcionan los algoritmos explotados.

En resumen, los algoritmos de cifrado trabajan sobre bloques de datos (de 8 o 16 bytes por lo general), los bytes restantes son de "relleno" (padding). Por ejemplo, una palabra de 6 letras "BANANA", se rellenará con dos bytes para convertirse en el bloque de 8 bytes.

Se le denomina "Oracle" al mecanismo dentro de un sistema de cifrado capaz de proporcionar una respuesta Válido o Inválido para un determinado texto cifrado. Por lo tanto, el "Padding Oracle" es un mecanismo, capaz de responder, si el relleno del texto cifrado es válido o no.

Los algoritmos de cifrado construidos en Microsoft .NET Framework, disparan un System.Security.Cryptography.CryptographicException con el mensaje "Padding is invalid and cannot be removed" en caso de que el relleno no sea válido. Así que ese es nuestro Padding Oracle a utilizar…

El ataque

El siguiente video muestra cómo se puede tirar una instalación de DotNetNuke, al obtener la clave de cifrado y cifrar sus propias cookies SuperUser:

Lo cual podríamos resumir a lo siguiente:

  • El atacante localiza una cadena Base64, que suele ser un texto cifrado. En ASP.NET podría obtenerse fácilmente de la URL del WebResource.axd o de una cookie de autenticación.

  • El atacante cambia un byte del texto cifrado y lo envía al oráculo, preguntando "¿es válido?", hasta que el byte es descifrado. Las respuestas "Vaildo / Invalido" son simplemente entendidas por el examen de las respuestas del servidor, por ejemplo, el código de error 500 significa que el texto no es válido y los 404 que es válido pero no se pudo descifrar.

    El ataque no está en función del código de error en sí, sino que basta vigilar cualquier comportamiento anormal. Incluso si el sitio web devuelve la misma página de error en todos los casos, el atacante podría hacer uso de las diferencias de tiempo, según lo declarado por Thai Duong.

  • Después de conseguir con éxito la clave secreta ASP.NET, la machineKey, el atacante puede crear sus propias "cookies" y comenzar a usar el sistema como administrador o bien podría descargar sus archivos sensibles, por ejemplo, web.config.

    Adicionalmente, el atacante podría utilizar la vulnerabilidad para cifrar su propio sistema de cifrado sin tener la clave de cifrado original.

Dado que HTTP es un protocolo sin estado, los desarrolladores web deben manejar los estados en el servidor, o empujarlos al cliente. Por motivos de rendimiento y escalabilidad, muchos desarrolladores web tienden a ir con este último método. Quieren mantener al estado como un secreto, y recurrir a la criptografía, que es la herramienta adecuada. Sin embargo, la usan indebidamente, es decir, sin aplicar un MAC para el texto cifrado, ni utilizar un modo de cifrado de bloque autenticado, haciendo sus sistemas vulnerables

– Juliano Rizzo

NOTA: Si bien este post se centra en el ataque dirigido a la plataforma ASP.NET, el ataque Padding Oracle no es exclusivo de dicha plataforma, de hecho un primer ataque fue dirigido hacia la plataforma JSF, específicamente a MyFaces, cuyo video se puede ver a continuación:

Así mismo se la lanzado otra implementación en JavaScript y nada descarta que en el futuro se implementen otros exploits para otros objetivos…

Protegiéndose

Scott Guthrie a dicho que su equipo está trabajando en un nuevo parche de seguridad que se publicará como parte de la actualización Windows lo más pronto posible. Mientras tanto los profesionales de TI y desarrolladores necesitan proteger sus propias aplicaciones mediante las siguientes medidas.

  • Nunca permita que su aplicación devuelva la página amarilla de error (aka YSOD) cuando se produzca una excepción, esto es de por sí malo ya que permitirá a los usuarios finales examinar las excepciones al detalle. Por ello, el solo encender la opción <customeErrors> no es suficiente si solo enviará un mensaje YSOD

  • Nunca guarde información sensible en cookies, ViewState o cualquier otro estado del lado cliente, porque siempre habrá una oportunidad que sea filtrado a usuarios malintencionados. Considere la posibilidad de almacenar datos en el servidor

  • Lea y aplique el paseo descrito en el post de Scott Guthrie: Important: ASP.NET Security Vulnerability, que muestra cómo redirigir todos los errores de página y añadir un tiempo de retraso al azar; si bien no es suficiente, hará las cosas más difíciles para el atacante y lo confundirá más. Así mismo lea la actualización: Update on ASP.NET Vulnerability y las P&R: Frequently Asked Questions about the ASP.NET Security Vulnerability

  • Adicionalmente asegúrese que el servidor de su aplicación se puede defender contra ataques DoS. La vulnerabilidad expuesta inunda el servidor con miles de peticiones. La defensa de los servidores web y sus aplicaciones contra ataques de denegación de servicio es siempre un requisito a tener en cuenta cuando se implementa un servidor web. Para ello puede utilizar cortafuegos, routers, ISA o el IIS, así mismo a nivel de hardware. Consulte al respecto con el soporte técnico de su servicio de host

[Actualización – 28 de Septiembre]

Microsoft acaba de publicar el boletín de seguridad MS10-070 anunciando el lanzamiento de la actualización de seguridad para hacer frente a la vulnerabilidad de seguridad de ASP.NET. La actualización de seguridad está programada para ser lanzada hoy martes 28 de septiembre a través del Centro de descarga de Microsoft, y en unos días a través de Windows Update y Windows Server Update Services.

El boletín tiene por objeto que los administradores estén mejor preparados una vez que la actualización sea liberada. Puede aprender más acerca de la actualización de seguridad en el Microsoft Security Response Center. También se llevará a cabo una transmisión especial hoy a las 1:00 PM PDT (3:00 PM México), donde se presentará información sobre el boletín; si está interesado en asistir, haga clic aquí para registrarse.

 

Mas Info:

Acerca de Willy Mejia

Developer, Techie, Human... http://about.me/willyxoft
Esta entrada fue publicada en ASP.NET, Seguridad. Guarda el enlace permanente.

Deja un comentario