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):
2 Responsesso far
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. 🙂
Fenomenal información Ramón (no había leído tu comentario hasta hoy). 🙂
Gracias por compartirlo.