WillyXoft

Software, Servicios, Seguridad y más…

Felices Fiestas

dejar un comentario »

holydays

Que en éstas fechas se encienda y brille en nuestros hogares la luz del espíritu fraterno. Que nazca el deseo de dar, sobretodo calidad humana a los demás… Y que ese mismo espíritu se mantenga durante todo el año.

Deseo sinceramente que tod@s pasen unas excelentes fiestas de fin de año, de modo que nos recarguen de esperanza y de buenos propósitos para el siguiente.

Sin duda en éstos años hubo de todo, tanto tecnológica como personalmente hablando. Lamentablemente por diversos motivos estuve desconectado y he abandonado mucho este blog. Espero que en el próximo no se vuelva a repetir…

¡Felices fiestas de invierno y un muy próspero y saludable 2012!

Finalmente, les dejo este video ad-hoc que anda rondando en la red desde hace dos años:

Escrito por Willy Mejia

diciembre 7, 2011 a 10:30

Escrito en Personal

Ataque Padding Oracle en ASP.NET

dejar un comentario »

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:

Escrito por Willy Mejia

septiembre 22, 2010 a 22:49

Escrito en ASP.NET, Seguridad

Oracle + Sun

dejar un comentario »

Sun CustomersEl día de ayer, Enero 27 de 2010, Oracle anunció terminada su adquisición de Sun.

Oracle nos invita a ver su serie de Webcast sobre la estrategia de productos Oracle + Sun, en los cuales podremos conocer mas acerca de la combinación Sun y Oracle y de lo que ello significará para nosotros.

Mayor información en: oracle.com/us/sun

 

SOFTWARE STRATEGY WEBCASTS

HARDWARE STRATEGY WEBCASTS

SYSTEMS STRATEGY WEBCASTS

SOLUTIONS STRATEGY WEBCASTS

PARTNER STRATEGY WEBCASTS

 

Otros Links:

 

So long, old friend…

The rise and fall of Sun Microsystems new!

Escrito por Willy Mejia

enero 28, 2010 a 09:00

Ejecutar solo una instancia (C#)

con 2 comentarios

Para prevenir que sea ejecutada más de una instancia de una aplicación Windows o WPF con C# (incluso cuando se realice una copia del archivo ejecutable) podríamos utilizar algo como lo siguiente:

private static bool FirstInstance
{
    get
    {
        bool created;
        string name = Assembly.GetEntryAssembly().FullName;
        // created will be True if the current thread creates and owns the mutex.
        // Otherwise created will be False if a previous instance already exists.
        Mutex mutex = new Mutex(true, name, out created);
        return created;
    }
}

Nota: Para una mayor certidumbre se podría hacer uso de una cadena GUID en ‘name’.

Cuando la primera instancia crea el Mutex pasa a ser su propietario y la variable created se le asigna el valor True. Cuando una nueva instancia se ejecuta intenta tomar posesión del Mutex, pero dado que solo un hilo puede ser propietario de mismo (y primera instancia ya lo es) la nueva no puede tomar posesión del Mutex, por lo cual el valor de created permanece en False, misma que se regresa para indicar si existe (o no) una instancia de la aplicación en ejecución.

Así pues la propiedad FirstInstance la colocaremos en la clase principal de nuestra aplicación WinForm (“Program.cs”) o bien de nuestra aplicación WPF (“App.xaml.cs”) para ser utilizada según corresponda:

WinForm (Program.cs):

[STAThread]
static void Main()
{
    if (FirstInstance)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    else
    {
        MessageBox.Show("Application is already running.");
        Application.Exit();
    }
}

WPF (App.xaml.cs):

protected override void OnStartup(StartupEventArgs e)
{
    if (FirstInstance)
        base.OnStartup(e);
    else
    {
        MessageBox.Show("Application is already running.");
        Application.Current.Shutdown();
    }
}

Adicionalmente, usando la clase System.Diagnostics.Process se puede obtener la ventana principal y activarla mediante una llamada a la API SetForegroundWindow, tal como se muestra en: Comprobar si hay una instancia previa de nuestra aplicación, escrito en VB.NET por Eduardo Morcillo.

 

Usando WindowsFormsApplicationBase de VB

Otra opción sería recurrir al Modelo de Aplicaciones de Visual Basic (aka My) para crear un gestor de instancias mediante el WindowsFormsApplicationBase (el cual además nos ofrece el evento OnStartupNextInstance) tal como se muestra a continuación para Windows Forms con C#:

Nota: No es necesario traducir el siguiente código para una aplicación Windows Forms con VB. En ese caso solo basta seguir las instrucciones de la segunda mitad del post: Ejecutar solamente una instancia (VB 2005+).

Program.cs

using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;

namespace WinForm1
{
    public static class Program
    {
        [STAThread]
        public static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            SingleInstanceManager manager = new SingleInstanceManager();
            manager.Run(args);
        }
    }

    // Using VB bits to detect single instances and process accordingly:
    //  * OnStartup is fired when the first instance loads
    //  * OnStartupNextInstance is fired when the application is re-run again
    //    NOTE: it is redirected to this instance thanks to IsSingleInstance
    public class SingleInstanceManager : WindowsFormsApplicationBase
    {
        SingleInstanceApplication app;

        public SingleInstanceManager()
        {
            this.IsSingleInstance = true;
        }

        protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
        {
            // First time app is launched
            app = new SingleInstanceApplication();
            app.Run();
            return false;
        }

        protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
        {
            // Subsequent launches
            base.OnStartupNextInstance(eventArgs);
            app.Activate();
        }
    }

    public class SingleInstanceApplication
    {
        protected Form mainForm;

        public void Activate()
        {
            // Reactivate application's main window
            mainForm.Activate();
        }    

        public void Run()
        {
            Application.Run(mainForm = new Form1());
        }
    }
}

Para un ejemplo con WPF usando WindowsFormsApplicationBase tanto con VB como con C# ver: WPF: Single Instance Detection Sample.

Escrito por Willy Mejia

enero 27, 2010 a 20:06

Escrito en .NET

Etiquetado con ,

Añeja Vulnerabilidad en el Kernel de Windows

con un comentario

Cuando leí los primeros reportes pensé que se trataba de hoax, por lo que no hice caso al principio. Mas sin embargo resulta que es verdad. Se trata de una vulnerabilidad hecha pública el martes pasado en seclists.org y firmado por Tavis Ormandy, quien además facilita un exploit. Por su parte Microsoft ha publicado el aviso de seguridad al respecto:

Microsoft Security Advisory (979682)
Vulnerability in Windows Kernel Could Allow Elevation of Privilege

La vulnerabilidad se encuentra específicamente en el subsistema Virtual DOS Machine de Windows NT (NTVDM). Por lo que dicha vulnerabilidad afecta a toda la familia de sistemas operativos NT de 32 bits, desde el extinto NT 3.5, pasando por Windows 2000 y hasta el reciente Windows 7, estando exentos sólo los sistemas de 64-bits. De hecho eso es lo que ha incendiado la web, pero sobretodo porque el problema tiene su buena cantidad de años.

A su favor MS afirma que la vulnerabilidad es difícil de explotar, ya que requiere que sea explotada con una cuenta local y no puede hacerse remotamente. Empero no obstante la mayoría de los usuarios no son muy cuidadosos al abrir/ejecutar archivos, por lo que fácilmente podrían abrir/ejecutar un archivo adjunto o bien descargado desde las redes P2P.

En el aviso MS señala que aún esta bajo investigación por lo que aún no existe parche (fix) para mitigar la vulnerabilidad. Por lo mientras solo recomiendan “bloquear” la ejecución de programas de 16 bits mediante el deshabilitado del subsistema NTVDM vía la consola de políticas de grupo (gpedit.msc), el cual no obstante no está presente en las ediciones “básicas” (aka Home y Started) de Windows XP/Vista/7. Por lo que ciertos blogs proponen la siguiente medida alterna, la cual he comprobado y (aparentemente) funciona:

1. Cree un archivo de texto con la extensión *.reg, por ejemplo: “VDMDisallowed.reg” (y asegúrese que tiene dicha extensión y no *.reg.txt).

2. Introduzca en el archivo el siguiente texto:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\AppCompat]
"VDMDisallowed"=dword:00000001

3. Guarde el archivo.

4. De click derecho sobre el archivo y en el menú contextual elija la opción “Combinar”.

Nota: Para poder combinar el archivo con el Registro de Windows se requieren privilegios de administrador. Si no sabe de que hablo pregunte a su administrador local o su amigo geek pro-MS mas cercano.

5. De Aceptar en el cuadro de dialogo que aparece.

Eso es todo, de ahora en adelante sus viejos programas y juegos de MS-DOS/Win16 ya no se ejecutarán mas, al menos hasta que MS publique el parche que solucione correctamente el problema.

Para volver habilitar VDM cree otro archivo *.reg (“VDMAllowed.reg”) con lo siguiente:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\AppCompat]
"VDMDisallowed"=dword:00000000

Guarde el archivo y combínelo.

ADVERTENCIA Y RENUNCIA: La manipulación del Registro de Windows puede llegar a ocasionar efectos adversos al sistema si no se realiza adecuadamente. Tenga en cuenta que si lo realiza es bajo su propio riesgo, por lo que no me hago responsable por cualquier daño que pueda sufrir su sistema/equipo y/o persona, ni por el mal uso que se le pueda dar a ésta información.

Escrito por Willy Mejia

enero 22, 2010 a 01:00

Seguir

Get every new post delivered to your Inbox.