Actualización de Seguridad para Visual Studio .NET 2002 y Visual Studio .NET 2003 - Jorge Serrano - MVP Visual Developer - Visual Basic

Actualización de Seguridad para Visual Studio .NET 2002 y Visual Studio .NET 2003

Microsoft ha anunciado los parches o actualizaciones de seguridad que tienen que ver con el fichero MFC70.DLL de Visual Studio .NET 2002 y con el fichero MFC71.DLL de Visual Studio .NET 2003.

Si no se actualiza ese fichero, se corre el riesgo de que un atacante pudiera comprometer a la máquina que ejecuta Visual Studio .NET 2002 o Visual Studio .NET 2003.

Las actualizaciones son las siguientes (dependiendo de si se tiene el paquete de desarrollo con el Service Pack 1 instalado o no):

Published 13/2/2007 21:12 por Jorge Serrano
Archivado en:
Comparte este post:

Comentarios

Tuesday, March 06, 2007 5:18 AM por Ramón Sola [MVP Windows - Shell/User]

# re: Actualización de Seguridad para Visual Studio .NET 2002 y Visual Studio .NET 2003

Hola, Jorge.

Confirmo que ese bug está presente en las MFC por lo menos desde Visual C++ 2.0 (¿1993-94?). Se "expresa" sólo en las compilaciones para Unicode y me parece increíble que se haya destapado ahora, con Visual C++ 6.0 sin soporte técnico, siendo uno de esos descuidos tontos en los que se pasa como parámetro de una función el tamaño físico de un array en lugar de su número de elementos. O_o También es cierto que las condiciones para poder explotar el fallo son muy concretas.

Fragmento del archivo Oleui2.cpp del código fuente de las MFC:

[...]

void AFXAPI AfxOleSetEditMenu(COleClientItem* pItem, CMenu* pMenu,

UINT iMenuItem, UINT nIDVerbMin, UINT nIDVerbMax, UINT nIDConvert)

{

[...]

TCHAR szBuffer[256];

pMenu->GetMenuString(iMenuItem, szBuffer, sizeof szBuffer, MF_BYPOSITION);

[...]

En un momento dado puede crearse un buffer de 256 elementos. Si *no* se compila MFC para Unicode, TCHAR se sustituye por el tipo 'char' (1 byte) en tiempo de compilación. No existe riesgo de desbordamiento porque el número de elementos declarado (256) coincide con el tamaño del array (256 bytes). Pero cuando se compila para Unicode, TCHAR se reemplaza por el tipo 'wchar', por tanto se crea un array de 256 elementos de 2 bytes cada uno, en total 512 bytes. La función GetMenuString del objeto representado por el puntero pMenu espera el número de elementos del buffer, pero se le pasa su tamaño real, que es el doble. Ahí está el riesgo de desbordamiento.

Por supuesto, la solución es pasar el número de elementos del array en cualquier situación:

pMenu->GetMenuString(iMenuItem, szBuffer, sizeof (szBuffer) / sizeof (szBuffer[0]), MF_BYPOSITION);

La construcción sizeof(x)/sizeof(x[0]), donde x es un array (no un puntero que se utilice con notación de array), devuelve el número de elementos de x. ¿Por qué? sizeof(x) es el tamaño que ocupa el array x en memoria y sizeof(x[0]) es el tamaño del primer elemento de x. Tamaño total dividido por tamaño de un elemento igual a número de elementos.

En el parche para Visual Studio .NET 2003 SP1 olvidaron introducir el código fuente que variaba con respecto a la versión original. La siguiente descarga proporciona el archivo de código fuente que resuelve el fallo:

Visual Studio .NET 2003 Service Pack 1 MFC71.DLL Security Update

http://www.microsoft.com/downloads/details.aspx?FamilyID=48e4c8fa-7a8c-41dc-af1c-e9e3be107171&DisplayLang=en

El problema está totalmente resuelto en las MFC de Visual C++ 2005:

pMenu->GetMenuString(iMenuItem, szBuffer, _countof(szBuffer), MF_BYPOSITION);

Donde _countof es una macro de preprocesador, definida en afximpl.h, que encapsula la construcción descrita anteriormente:

// determine number of elements in an array (not bytes)

#ifndef _countof

#define _countof(array) (sizeof(array)/sizeof(array[0]))

#endif

Un saludo. :-)

Tuesday, July 03, 2007 5:26 PM por Jorge Serrano

# re: Actualización de Seguridad para Visual Studio .NET 2002 y Visual Studio .NET 2003

Fenomenal información Ramón (no había leído tu comentario hasta hoy). :-)

Gracias por compartirlo.