Sobrantes Del Almacenador intermediario


  Share  
|


Los sobrantes del almacenador intermediario se han reconocido de largo como problema en lenguajes de bajo nivel. El problema de la base es que la información de control de flujo de los datos y de programa del usuario está mezclada para el motivo del funcionamiento, y las lenguajes de bajo nivel permiten acceso directa a la memoria del uso. C y C++ son las dos idiomas más populares afligidas con sobrantes del almacenador intermediario.

En sentido estricto, un sobrante del almacenador intermediario ocurre cuando un programa permite que la entrada escriba más allá del extremo del almacenador intermediario asignado, pero hay varios problemas asociados que tienen a menudo el mismo efecto. Uno del más interesante es insectos de la secuencia del formato. Otra encarnación del problema ocurre cuando se permite a un atacante escribir en una posición de memoria arbitraria fuera de un arsenal en el uso, y mientras que, en sentido estricto, este isn’t un sobrante clásico del almacenador intermediario, nosotros’la cubierta del ll que aquí también.

El efecto de un sobrante del almacenador intermediario es cualquier cosa de un desplome al atacante que gana el control completo del uso, y si el uso está funcionando como usuario de alto nivel (raíz, administrador, o sistema local), después el control del sistema operativo entero y de cualquier otro usuario que se entren actualmente, o entra, está en las manos del atacante. Si el uso en la pregunta es un servicio de red, el resultado del defecto podría ser un gusano. El primer gusano bien conocido del Internet explotó un almacenador intermediario sobrante en el servidor del dedo, y era conocido como el gusano del dedo de Roberto T. Morris (o Morris justo). Aunque se parecería como si’d hayamos aprendido cómo evitar los sobrantes del almacenador intermediario puesto que uno traído casi abajo el Internet en 1988, nosotros continúa viendo informes frecuentes de los sobrantes del almacenador intermediario en muchos tipos de software.

Aunque uno pudo pensar que la solamente presa descuidada, descuidada de la caída de los programadores al almacenador intermediario sobra, el problema es complejo, muchas de las soluciones no son simples, y cualquier persona que ha escrito bastante código de C/C++ ha incurrido en casi ciertamente esta equivocación. Los programadores incluso muy buenos, muy cuidadosos incurren en equivocaciones, y los programadores muy mejores saben fácil debe deslizarse para arriba y poner prácticas de prueba sólidas en lugar de coger errores.

Idiomas Afectadas

C es el lenguaje más común usado para crear los sobrantes del almacenador intermediario, seguidos de cerca por C++. Él’s fácil crear los sobrantes del almacenador intermediario cuando el escribir en el ensamblador dado lo no tiene ninguna salvaguardia en todos. Aunque C++ es intrínsecamente tan peligroso como C, porque es un sobreconjunto de C, usar la biblioteca estándar de la plantilla (STL) con cuidado puede reducir grandemente el potencial de manejar mal secuencias. La exactitud creciente del recopilador de C++ ayudará a un programador a evitar algunos errores. Nuestro consejo es que incluso si usted está escribiendo código puro de C, usar el recopilador de C++ dará lugar a un código más limpio.

Las idiomas de alto nivel más recientemente inventadas abstraen el acceso directo de memoria lejos del programador, generalmente en un coste substancial del funcionamiento. Las idiomas tales como Java, C #, y básico visual tienen tipos nativos de la secuencia, órdenes limitar-comprobados, y prohíben generalmente el acceso directo de memoria. Aunque algunos dirían que éste hace los sobrantes del almacenador intermediario imposibles, él’s más exacto para decir que los sobrantes del almacenador intermediario son mucho menos probables. En realidad, la mayoría de estas idiomas se ponen en ejecucio'n en C/C++, y los defectos de la puesta en práctica pueden dar lugar a sobrantes del almacenador intermediario. Otra fuente potencial de los sobrantes del almacenador intermediario en código de alto nivel existe porque el código debe interconectar en última instancia con un sistema operativo, y ese sistema operativo se escribe casi ciertamente en C/C++. C # le permite realizarse sin una red declarando secciones inseguras; sin embargo, mientras que provee de una interoperabilidad más fácil el sistema operativo y las bibliotecas subyacentes escritos en C/C++, usted puede incurrir en las mismas equivocaciones que usted puede en C/C++. Si usted programa sobre todo en idiomas de alto nivel, el artículo de acción principal para usted es continuar validando los datos pasados a las bibliotecas externas, o usted puede actuar como el conducto a sus defectos.

Aunque’re no ir a proporcionar una lista exhaustiva de idiomas afectadas, la mayoría de las más viejas idiomas somos vulnerables proteger los sobrantes

El Pecado Explicado

La encarnación clásica de un sobrante del almacenador intermediario se conoce como “romper el apilado.” En un programa compilado, el apilado se utiliza a la información de control de asimiento, tal como discusiones, donde el uso necesita volverle se hace una vez con la función y debido a the.small.number.of registros disponibles en los procesadores x86, los registros consiguen absolutamente a menudo almacenados temporalmente en el apilado. Desafortunadamente, las variables que localmente se asignan también se almacenan en el apilado. Estas variables del apilado se refieren a veces inexacto como estáticamente siendo asignado, en comparación con ser memoria dinámicamente asignada del montón. Si usted oye a alguien el hablar de un sobrante del buffer estático, qué él realmente significa es un sobrante del almacenador intermediario del apilado. La raíz del problema es que si el uso escribe más allá de los límites de un arsenal asignado en el apilado, el atacante consigue especificar la información de control. Y esto es crítico al éxito; el atacante desea modificar datos de control a los valores de su hacer una oferta.

Uno pudo preguntar porqué continuamos utilizando un sistema tan obviamente peligroso. Teníamos una oportunidad de escapar el problema, por lo menos en parte, con una migración a la viruta’64-bit de Intel s Itanium, donde los remites se almacenan en un registro. El problema es que’d tenemos que tolerar una pérdida significativa de la compatibilidad hacia atrás, y en fecha esta escritura, aparece que la viruta x64 terminará probablemente encima de la viruta más popular.

Usted puede también preguntar porqué apenas ponemos’t que todos emigran al código que realiza el arsenal terminante que comprueba y que rechazan el acceso directo de memoria. El problema es ése para muchos tipos de usos, las características de funcionamiento de idiomas de alto nivel no es adecuado. Una tierra de en medio es utilizar las idiomas de alto nivel para los interfaces a nivel superior que obran recíprocamente con cosas peligrosas (como usuarios!), e idiomas de nivel inferior para el código de la base. Otra solución es utilizar completamente las capacidades de C++, y utiliza bibliotecas de la secuencia y clases de la colección. Por ejemplo, el web server 6.0 del servidor de información del Internet (IIS) cambiado enteramente a una clase de la secuencia de C++ para manejar la entrada, y un revelador valiente lo demandó que’d amputa su pequeño dedo si algunos sobrantes del almacenador intermediario fueron encontrados en su código. En fecha esta escritura, el revelador todavía tiene su dedo y no se ha publicado ningunos boletines de la seguridad contra el web server en los casi dos años desde su lanzamiento. Los recopiladores modernos tratan de templatized bien clases, y es posible escribir código muy de alto rendimiento de C++.

Bastante teoría—dejó’s considerar un ejemplo:

# incluya < stdio.h >

anule DontDoThis(char * entrada)
{
socarre buf[16 ];

strcpy(buf, entrada);

printf("%s\n", buf);
}

argc del main(int, carbón internos * argv[ ])
{
//so no estamos comprobando discusiones
¿//what usted espera de un app que utilice strcpy?
DontDoThis(argv[1 ]);
vuelta 0;
}

Ahora deje’s compilar el uso y hechar una ojeada qué sucede. Para esta demostración, el autor utilizó una estructura del lanzamiento con los símbolos el eliminar errores permitidos y la comprobación del apilado inhabilitada. Un buen recopilador también deseará en línea a una función tan pequeña como DontDoThis, especialmente si se llama solamente una vez, él también inhabilitó tan optimizaciones. Aquí’s qué el apilado parece en su sistema inmediatamente antes de llamar strcpy:

FE 12 de 0x0012FEC0 c8 00 Èþ. < - dirección de la discusión del buf
0x0012FEC4 c4 18 32 00 Ä.2. < - dirección de la discusión de la entrada
0x0012FEC8} FE 12 00 Ðþ. < - comienzo del buf
0x0012FECC 04 <<Unicode 80 40 00: 80>>@.
0x0012FED0 e7 02 3f 4f ç.?O
0x0012FED4 66 00 00 00 f... < - extremo del buf
ä 00 del FE 12 de 0x0012FED8 e4þ. < - contenido del registro de EBP
0x0012FEDC 3f 10 40 00?. @. < - remite
0x0012FEE0 c4 18 32 00 Ä.2. < - dirección de la discusión a DontDoThis
0x0012FEE4 c0 FF 12 00 Àÿ..
0x0012FEE8 10 13 40 00.. @. < - el main() de la dirección volverá a

Recuerde que todos los valores en el apilado están al revés. Este ejemplo es de un sistema de Intel, que es “pequeño-endian.” Esto significa que viene el menos octeto significativo de un valor primero, así que si usted ve un remite en memoria como “3f104000,” él’de s la dirección 0x0040103f realmente.

Ahora deje’s mirar qué sucede cuando se sobreescribe el buf. La primera información de control sobre el apilado es el contenido del registro bajo extendido del indicador (EBP). EBP contiene el indicador del marco, y si apagado-por-uno desbordamiento sucede, EBP será truncado. Si el atacante puede controlar la memoria en 0x0012fe00 (apagado-por-uno ceros fuera del octeto pasado), el programa salta a esa localización y ejecuta código atacante-provisto.

Si se obliga vaya’al isn t del sobrante a un octeto, el artículo siguiente que es el remite. Si el atacante puede controlar este valor, y puede poner a bastante asamblea en un almacenador intermediario que ella conoce la localización de, usted’re mirar un sobrante explotable clásico del almacenador intermediario. Observe que el doesn t del código de la asamblea (conocido a menudo como código de la cáscara porque la hazaña más común es invocar una cáscara del comando’) tiene que ser puesto en el almacenador intermediario ese’s que es sobreescrito.’S el caso clásico, pero en general, el código arbitrario que el atacante ha puesto en su programa podría ser localizado a otra parte. Ponga’la toma de t cualquier comodidad de pensar que el sobrante está confinado a un área pequeña.

Una vez que se haya sobreescrito el remite, el atacante consigue jugar con las discusiones de la función explotable. Si el programa escribe a cualesquiera de estas discusiones antes de volver, representa una oportunidad para la mutilación adicional. Este punto llega a ser importante cuando en vista de la eficacia de las contramedidas que tratan de forzar del apilado tales como Crispin Cowan’s Stackguard, IBM’s ProPolice, y bandera’del recopilador de Microsoft s /GS.

Como usted puede ver, nosotros’ve apenas dado el atacante por lo menos tres maneras de tomar control de nuestro uso, y éste estamos solamente en una función muy simple. Si una clase de C++ con funciones virtuales se declara en el apilado, después la tabla virtual del indicador de la función estará disponible, y ésta puede conducir fácilmente a las hazañas. Si una de las discusiones a la función sucede ser un indicador de la función, que es absolutamente común en cualquier sistema del windowing (por ejemplo, sistema o Microsoft Windows de la ventana de X), después sobreescribir el indicador de la función antes del uso es una manera obvia de divertir el control del uso.

Muchos, muchas más maneras listas de agarrar control de un uso existen que nuestros cerebros débiles pueden pensar en. Hay un desequilibrio entre nuestras capacidades como reveladores y las capacidades y los recursos del atacante. Usted’re no dado un plazo una cantidad de hora infinita de escribir su uso, sino los atacantes no puede tener cualquier cosa hacer con su tiempo de repuesto copioso que la figura fuera de cómo hacer su código hace lo que él desea. Su código puede proteger un activo ese’objeto de valor de s bastante para justificar meses del esfuerzo de derribar su uso. Los atacantes pasan tiempo mucho que aprenden sobre los progresos más últimos de causar la mutilación, y tienen recursos como www.metasploit.com donde pueden señalar y chascar su manera de descascar el código que hace casi cualquier cosa ellos desean mientras que funcionan dentro de un juego de caracteres obligado.

Si usted intenta determinarse si algo es explotable, es altamente probable que usted lo consiga incorrecto. En la mayoría de los casos, es solamente posible probar que algo es o explotable o que usted no es bastante elegante (o no haber pasado posiblemente bastante tiempo) determinarse cómo escribir una hazaña. Es extremadamente raro poder probar con cualquier confianza en todos que un sobrante no es explotable.

¡El punto de este diatribe es que la cosa elegante a hacer es apenas fijar los insectos! Ha habido las épocas múltiples que “cifran mejoras de calidad” han resultado ser arreglos de la seguridad en la retrospección. Este autor acaba de pasar más de tres horas que discutían con un equipo del desarrollo alrededor si ought fijar un insecto. El hilo de rosca del E-mail tenía un total de ocho personas en él, y pasamos fácilmente 20 horas (mitad de la persona-semana) que discutían si fijar el problema o no porque el equipo del desarrollo deseó la prueba que el código fuera explotable. Una vez que los expertos de la seguridad probaran el insecto era realmente un problema, el arreglo era estimado en una hora de tiempo del revelador y de algunas horas del tiempo de la prueba. Ese’s una pérdida de tiempo increíble.

El un tiempo cuando usted desea ser analítico está inmediatamente antes de enviar un uso. Si un uso está en las etapas finales, usted’d tiene gusto de poder hacer una buena conjetura si el problema es explotable justificar el riesgo de regresiones y de desestabilizar el producto.

’S una idea falsa común que sobre en almacenadores intermediarios del montón sea menos explotable que los sobrantes, pero éste resulta no ser el caso. La mayoría de las puestas en práctica del montón sufren del mismo defecto básico que el apilado—los datos del usuario y los datos de control está mezclado. Dependiendo de la puesta en práctica del allocator de la memoria, es a menudo posible conseguir al encargado del montón poner cuatro octetos de la opción’del atacante s en la localización especificada por el atacante. Los detalles de cómo atacar un montón son algo arcane. Una presentación reciente y claramente escrita en el asunto, “las hazañas confiables del montón de Windows” por el shok “Conover” de Matthew y un Oded Horovitz, se pueden encontrar en http://cansecwest.com/ csw04/csw04-Oded+Connover.ppt. Incluso si el encargado del montón no puede ser derribado para hacer un atacante’s que hace una oferta, los datos en las asignaciones colindantes pueden contener indicadores de la función, o los indicadores que serán utilizados para escribir la información. Contemporáneamente, explotando desbordamientos del montón era considerado exótico y los desbordamientos—duros del montón ahora son algunos de los tipos más frecuentes de errores explotados.

Sinful C/C++

Hay muchos, muchas maneras de sobrar un almacenador intermediario en C/C++. Aquí’s qué causó el gusano del dedo de Morris:

carbón buf[20 ];

gets(buf);

No hay absolutamente manera de utilizar consigue leer para entrar de stdin sin arriesgar un desbordamiento de los fgets—del uso del almacenador intermediario en lugar de otro. Quizás la segunda manera popular de desbordar los almacenadores intermediarios es utilizar strcpy (véase el ejemplo anterior). Ésta es otra manera de causar problemas:

carbón buf[20 ];
prefix[ del carbón ] = "HTTP://";

strcpy(buf, prefijo);
strncat(buf, trayectoria, sizeof(buf));

¿Qué fue mal? El problema aquí es que el strncat tiene un interfaz mal diseñado. La función desea el número de caracteres del almacenador intermediario disponible, o el espacio a la izquierda, no el tamaño total del almacenador intermediario de la destinación. Aquí’s otra manera preferida de causar desbordamientos:

buf[MAX_PATH del carbón ];

sprintf(buf, "%s - %d\n", trayectoria, errno);

Él’s casi imposible, a excepción en de algunos casos de la esquina, utilizar el sprintf con seguridad. Un boletín crítico de la seguridad para Microsoft Windows fue lanzado porque el sprintf fue utilizado en una función de registración del eliminar errores. Refiera al boletín MS04-011 para más información (véase el acoplamiento en “la otra sección” de los recursos).

Aquí’s otro favorito:

carbón buf[32 ];
strncpy(buf, datos, strlen(data));
¿Tan qué’mal de s con esto? ¡La discusión pasada es la longitud del almacenador intermediario entrante, no el tamaño del almacenador intermediario de la destinación!

Otra manera de causar problemas está confundiendo la cuenta de carácter desde cuenta de octeto. Si usted’re ocuparse de los caracteres de ASCII, éstos es igual, pero si usted’re tratar de Unicode, allí es dos octetos a un carácter. Aquí’s un ejemplo:

_ snwprintf(wbuf, sizeof(wbuf), "%s\n", entrada);
El sobrante siguiente es poco un más interesante:

bool cuenta larga pInFile, sin firmar de CopyStructs(InputFile *)
{
i largo sin firmar;

m_pStructs = Structs[count nuevo ];

for(i = 0; i < cuenta; i++)
{
if(!ReadFromFile(pInFile, &(m_pStructs[i ])))
rotura;
}
}

¿Cómo puede este fall? Considere que cuando usted llama a operador del new[ de C++ ], es similar al código siguiente:

PTR = malloc(sizeof(type) * cuenta);
Si el usuario provee la cuenta, él el isn’t difícilmente para especificar un valor que desborda la operación de la multiplicación internamente. Usted’ll entonces asigna un almacenador intermediario mucho más pequeño que usted necesidad, y el atacante puede escribir sobre su almacenador intermediario. El recopilador próximo de C++ en el estudio visual 2005 de Microsoft contiene un cheque interno para prevenir este problema. El mismo problema puede suceder internamente en muchas puestas en práctica del calloc, que realiza la misma operación. Éste es el quid de muchos insectos del desbordamiento del número entero: Él’s no el desbordamiento del número entero que causa el problema de la seguridad;’s el almacenador intermediario sobrante que sigue rápidamente eso causa los dolores de cabeza. Pero más sobre esto en el pecado 3.

Aquí’s otra manera que un sobrante del almacenador intermediario puede conseguir creado:

# defina MAX_BUF 256
anule BadCode(char * entrada)
{
el cortocircuito len;
buf[MAX_BUF del carbón ];

len = strlen(input);

curso de //of podemos utilizar strcpy con seguridad
if(len < MAX_BUF)
strcpy(buf, entrada);
}

¿Esto mira como si ought trabajar, derecho? El código se acribilla realmente con problemas.’Ll conseguimos en esto más detalladamente cuando discutimos desbordamientos del número entero en el pecado 3, pero primero consideramos que los literales estén siempre de tipo interno firmada. Una entrada que 32K moverá de un tirón más de largo len a un número negativo; conseguirá el pozo de ventilación ascendente a un interno y mantendrá la muestra; y es siempre más pequeña ahora que MAX_BUF, causando un desbordamiento. Una segunda manera usted’los problemas del encuentro del ll es si la secuencia es más grande que 64K. Ahora usted tiene un error de truncamiento: len será un número positivo pequeño. El arreglo principal es recordar que el size_t está definido en la lengua como el tipo correcto para utilizar para las variables que representan tamaños por la especificación de la lengua. Otro problema que’s que está al acecho es que la entrada no puede nulo-ser terminada. Aquí’s qué código mejor parece:

size_t del const MAX_BUF = 256;
LessBadCode(char vacío * entrada)
{
el size_t len;
buf[MAX_BUF del carbón ];

len = strlen(input);

curso de //of podemos utilizar strcpy con seguridad
if(len < MAX_BUF)
strcpy(buf, entrada);
}

Pecados Relacionados

Un pecado de cerca relacionado es desbordamientos del número entero. Si usted elige atenuar los sobrantes del almacenador intermediario usando la secuencia contada que maneja llamadas, o está intentando determinarse cuánto sitio de asignar en el montón, llega a ser crítica la aritmética a la seguridad del uso.

Los insectos de la secuencia del formato pueden ser utilizados para lograr el mismo efecto que un sobrante del almacenador intermediario, pero aren’los sobrantes de t verdad. Un insecto de la secuencia del formato se logra normalmente sin el sobrante de ningunos almacenadores intermediarios en todos.

Una variante en un sobrante del almacenador intermediario es una ilimitada escribe a un arsenal. Si el atacante puede proveer el índice de su arsenal, y le ponga’t validan correctamente si’s dentro de los límites correctos del arsenal, apuntado escribe a una posición de memoria del atacante que’el elegir de s será realizado. Pueden toda la misma diversión del flujo de programa suceder no sólo, sino que también el atacante puede no tener que interrumpir la memoria adyacente, que obstaculiza cualquier contramedida que usted puede ser que tenga en lugar contra los sobrantes del almacenador intermediario.

Manchar el patrón del pecado

Aquí están los componentes a buscar:

  • Entrada, está leído en la red, un archivo, o en la línea de comando

  • Transferencia de datos de la entrada dicha a las estructuras internas

  • Uso de la secuencia insegura que maneja llamadas

  • Uso de la aritmética de calcular un tamaño de la asignación o tamaño de almacenador intermediario restante

Manchar el pecado durante la revisión de código

Manchar este pecado durante la revisión de código se extiende de ser muy fácil a extremadamente difícil. Las cosas fáciles a buscar son uso de la secuencia insegura que maneja funciones. Una edición a estar enterada de es que usted puede encontrar muchos casos del uso seguro, solamente él’s sido nuestra experiencia que hay problemas que ocultan entre las llamadas correctas. El código que convierte a las llamadas seguras del uso solamente tiene una tarifa muy baja de la regresión (dondequiera a partir de la a/10o al a/100o del normal insecto-fije la tarifa de la regresión), y quitará hazañas de su código.

Una buena manera de hacer esto es dejó a recopilador encontrar las llamadas de función peligrosas para usted. Si usted strcpy indefinido, strcat, sprintf, y funciones similares, el recopilador encuentra todos para usted. Un problema a estar enterado de es que algunos apps re-han puesto toda la o una porción en ejecucio'n biblioteca run-time de C internamente.

Una tarea más difícil está buscando los sobrantes del montón. Básicamente, usted desea a primero busca asignaciones, y después examina la aritmética usada para calcular el tamaño de almacenador intermediario.

El mejor acercamiento total es remontar al usuario entrado de los puntos de entrada de su uso con todas las llamadas de función. Estando enterado de lo que controla el atacante marcas una diferencia grande

Técnicas de prueba para encontrar el pecado

La pelusa que prueba, que sujeta su uso a las entradas semi-random, es una de las técnicas de prueba mejores a utilizar. Intente aumentar la longitud de las secuencias de la entrada mientras que observa el comportamiento del app. Algo mirar hacia fuera para es que las uniones mal hechas entre la comprobación de la entrada darán lugar a veces a ventanas relativamente pequeñas del código vulnerable. Por ejemplo, alguien pudo poner un cheque en un lugar que la entrada debe ser menos de 260 caracteres, y después asigna un almacenador intermediario de 256 octetos. Si usted prueba una entrada muy larga, será rechazada simplemente, pero si usted golpea el desbordamiento exactamente, usted puede encontrar una hazaña. Las longitudes que son múltiplos de dos y los múltiplos de dos más o menos uno encontrarán a menudo problemas.

Otros trucos a intentar están buscando cualquier lugar en la entrada donde está usuario la longitud algo especificado. Cambie la longitud de modo que no empareje la longitud de la secuencia, y busque especialmente las condiciones de las posibilidades del desbordamiento—del número entero donde está a menudo peligrosa la longitud + 1 = 0.

Algo que usted debe hacer cuando la prueba de la pelusa es crear una estructura especializada de la prueba. Elimine errores de las estructuras tienen a menudo afirma ese flujo de programa del cambio y le guardará de golpear condiciones explotables. Por otra parte, elimine errores de las estructuras en recopiladores modernos contienen típicamente una detección más avanzada de la corrupción del apilado. Dependiendo de su montón y sistema operativo, usted puede también permitir una comprobación más rigurosa de la corrupción del montón.

Un cambio que usted puede desear para realizar en su código es que si una afirmación está comprobando la entrada del usuario, cambie el siguiente de

assert(len < MAX_PATH);

a

if(len > = MAX_PATH)
{
assert(false);
falso de vuelta;
}

Usted debe probar siempre su código bajo cierta forma de herramienta de la detección de error de la memoria, tal como AppVerifier en Windows

Pecados Del Ejemplo

Las entradas siguientes, que vienen directamente de las vulnerabilidades comunes y las exposiciones enumeran, o CVE (http://cve.mitre.org), son ejemplos de los sobrantes del almacenador intermediario. Un pedacito interesante del trivia es ése en fecha esta escritura, 1.734 entradas de CVE que exista “el sobrante del almacenador intermediario” del fósforo. Una búsqueda de los advisories del CERT, que documentan solamente las vulnerabilidades más extensas y más serias, rinde 107 golpes en “el sobrante del almacenador intermediario.”

CVE-1999-0042

De la descripción de CVE: “Proteja el desbordamiento en la universidad de la puesta en práctica’de Washington s del IMAP y HAGA ESTALLAR los servidores.“

Esta entrada de CVE se documenta a fondo en CERT CA-1997-09 consultivo, e implicó un sobrante del almacenador intermediario en la secuencia de la autentificación de la universidad de los servidores’del protocolo de acceso de mensaje del Post Office Protocol (ESTALLIDO) y de Internet de Washington s (IMAP). Una vulnerabilidad relacionada era que el servidor del E-mail no pudo poner menos privilegio en ejecucio'n, y la hazaña concedió el acceso de la raíz a los atacantes. El desbordamiento condujo a la explotación extensa de sistemas vulnerables.

Los cheques de la vulnerabilidad de la red diseñaron encontrar versiones vulnerables de este servidor encontraron defectos similares en los laboratorios SLMail 2.5 de Seattle según lo divulgado en www.winnetmag.com/Article/ArticleID/9223/9223.html.

CVE-2000-0389–CVE-2000-0392

De CVE-2000-0389: “El desbordamiento del almacenador intermediario en la función del krb_rd_req en Kerberos 4 y 5 permite que los atacantes alejados ganen privilegios de la raíz.”

De CVE-2000-0390: “El desbordamiento del almacenador intermediario en la función de krb425_conv_principal en Kerberos 5 permite que los atacantes alejados ganen privilegios de la raíz.“

De CVE-2000-0391: “El desbordamiento del almacenador intermediario en krshd en Kerberos 5 permite que los atacantes alejados ganen privilegios de la raíz.“

De CVE-2000-0392: “El desbordamiento del almacenador intermediario en ksu en Kerberos 5 permite que los usuarios locales ganen privilegios de la raíz.“

Esta serie de problemas en la puesta en práctica del MIT del Kerberos se documenta como CERT CA-2000-06 consultivo, encontró en www.cert.org/advisories/CA-2000-06.html. Aunque el código de fuente había estado disponible para el público por varios años, y el problema provino el uso de la secuencia peligrosa que manejaba las funciones (strcat), fue divulgado solamente en 2000.

CVE-2002-0842, CVE-2003-0095, CAN-2003-0096

De CVE-2002-0842:

La vulnerabilidad de la secuencia del formato en ciertas modificaciones de tercera persona al mod_dav para registrar los malos mensajes de la entrada (e.g., servidor 9.0.2 del uso de Oracle9i) permite que los atacantes alejados ejecuten código arbitrario vía una destinación URI que fuerce “una respuesta de la entrada del malo” 502, que hace los specifiers de la secuencia del formato ser vuelta de dav_lookup_uri() en mod_dav.c, que entonces se utiliza en una llamada al ap_log_rerror().

De CVE-2003-0095:

Proteja el desbordamiento en ORACLE.EXE para el servidor 9i, 8i, 8.1.7 de la base de datos del oráculo, y 8.0.6 permite que los atacantes alejados ejecuten código arbitrario vía un username largo que se proporcione durante la conexión como usos directos explotables del cliente que realicen su propia autentificación, como LOADPSP que usa demostrado.

De CAN-2003-0096:

Los desbordamientos múltiples del almacenador intermediario en el lanzamiento 2 de la base de datos del oráculo 9i, el lanzamiento 1, 8i, 8.1.7, y 8.0.6 permiten que los atacantes alejados ejecuten código arbitrario vía (1) una discusión larga de la secuencia de la conversión a la función de TO_TIMESTAMP_TZ, (2) una discusión larga de la zona de tiempo a la función de TZ_OFFSET, o (3) un parámetro largo del DIRECTORIO a la función de BFILENAME.

Estas vulnerabilidades se documentan en CERT CA-2003-05 consultivo, situado en www.cert.org/advisories/CA-2003-05.html. Los problemas son un sistema de varios encontrados por David Litchfield y su equipo en software Ltd de la seguridad de la generación siguiente. Como aparte, esto demuestra eso que anuncia un’uso de s como “irrompible” puede no ser la mejor cosa a hacer mientras que Sr. Litchfield está investigando sus usos.

CAN-2003-0352

De la descripción de CVE:

Proteja el desbordamiento en cierto interfaz de DCOM para el RPC en NT 4.0, 2000, XP de Microsoft Windows, y el servidor 2003 permite que los atacantes alejados ejecuten código arbitrario vía un mensaje malformado, según lo explotado por los gusanos de Blaster/MSblast/ LovSAN y de Nachi/ Welchia.

Este desbordamiento es interesante porque condujo a la explotación extensa por dos gusanos muy destructivos esos que ambos causaron la interrupción significativa en el Internet. El desbordamiento estaba en el montón, y fue evidenciado por el hecho de que era posible construir un gusano que era muy estable. Un factor que contribuía era una falta del principio de menos privilegio: el interfaz no debe haber estado disponible para los usuarios anónimos. Otra nota interesante es que las contramedidas del desbordamiento en Windows 2003 degradaron el ataque de la escalada del privilegio a la negación del servicio.

Más información sobre este problema se puede encontrar en www.cert.org/advisories/ CA-2003-23.html, y www.microsoft.com/technet/security/bulletin/MS03-039.asp

Pasos Del Rescate

El camino para proteger el rescate del sobrante es largo y llenado de los potholes. Discutimos una variedad amplia de técnicas que le ayuden a evitar los sobrantes del almacenador intermediario, y un número de otras técnicas que reducen los sobrantes del almacenador intermediario del daños pueden causar. Deje’s mirar cómo usted puede mejorar su código.

Substituya La Secuencia Peligrosa Que maneja Funciones

Usted debe, en el mínimo, substituir funciones inseguras como strcpy, el strcat, y el sprintf por las versiones contadas de cada uno de estas funciones. Usted tiene un número de opciones por qué para substituirlo. Tenga presente que más viejas funciones contadas tienen problemas del interfaz, y piden que usted haga aritmética en muchos casos para determinar parámetros. Las computadoras aren’t tan bueno en la matemáticas como usted puede ser que espere. Bibliotecas más nuevas tienen gusto del strsafe, de la CRT segura (biblioteca run-time de C) que será enviado en el estudio visual de Microsoft (y está en una pista rápida a convertirse la parte del estándar del ANSI C/C++), y de strlcat/strlcpy para * nix. Usted también necesita tomar cuidado con cómo cada uno de estas funciones maneja la terminación y el truncamiento de secuencias. Algunas funciones garantizan la terminación nula, pero de las más viejas funciones contadas no más. La experiencia del grupo’s de Microsoft Office con substituir la secuencia insegura que manejaba las funciones para el lanzamiento de la oficina 2003 era que la tarifa de la regresión (nuevos insectos causados por arreglo) era extremadamente baja, así que pone’t dejó el miedo de la parada de las regresiones usted.

Asignaciones De la Intervención

Otra fuente de los sobrantes del almacenador intermediario viene de errores aritméticos.

Compruebe los lazos y ponga en orden los accesos

Se causa una tercera manera que el almacenador intermediario sobra no está comprobando correctamente la terminación en lazos, y no correctamente comprobando los límites de arsenal antes de escriba el acceso. Éste es una de las áreas más difíciles, y usted encontrará que, en algunos casos, el problema y el tierra-romper -kaboom están en módulos totalmente diversos.

Substituya los almacenadores intermediarios de la secuencia de C por las secuencias de C++

Esto es más eficaz que apenas substituyendo las llamadas generalmente de C, pero puede causar enormes cantidades de cambio en código existente, particularmente si el isn t’del código compilado ya como C++. Usted debe también estar enterado de y entender las características de funcionamiento de las clases del envase de STL. Es muy posible escribir código de alto rendimiento de STL, pero como muchos otros aspectos de la programación, una falta de leer el manual fino (RTFM) dará lugar a menudo a resultados menos que óptimos. El reemplazo más común es utilizar las clases de la plantilla de STL std::string o de std:wstring.

Substituya los órdenes estáticos por los envases de STL

Todos los problemas conocidos arriba se aplican a los envases de STL como vector, pero un problema adicional es que no todas las puestas en práctica de la construcción de vector::iterator comprueban para saber si hay fuera de acceso de los límites. Esta medida puede ayudar, y el autor encuentra eso el usar del STL permite para que él escriba código correcto más rápidamente, pero esté enterado que este isn’t una bala de plata.

Utilice Las Herramientas Del Análisis

Hay algunas buenas herramientas que vienen en el mercado que analizan el código de C/C++ para los defectos de la seguridad; los ejemplos incluyen Coverity, PREfast, y Klocwork. El NET visual 2005 del estudio incluirá PREfast y otra herramienta llamados lengua de la anotación del código de fuente (SAL) para ayudar a seguir abajo defectos de la seguridad tales como sobrantes del almacenador intermediario. La mejor manera de describir SAL está por código.

En el ejemplo (tonto) que sigue, usted sabe la relación entre los datos y las discusiones de la cuenta: los datos son octetos de la cuenta largos. Pero el doesn t’del recopilador sabe; apenas ve un carbón * y un size_t.

vacío * DoStuff(char * datos, cuenta del size_t) {
carbón estático buf[32 ];
memcpy(buf, datos, cuenta de vuelta);
}

Este código parece ACEPTABLE (no haciendo caso del hecho los bufferes estáticos que vuelven reacios, pero humor nos). Sin embargo, si la cuenta es más grande que 32, después usted tiene un sobrante del almacenador intermediario. Una versión anotada SAL de esto cogería el insecto:

vacío * carbón de DoStuff(__in_ecount(count) * datos, cuenta del size_t) {
carbón estático buf[32 ];
memcpy(buf, datos, cuenta de vuelta);
}

Esto es porque el recopilador y/o el PREfast ahora sabe que los datos y la cuenta están relacionados firmemente.

Medidas Defensivas Adicionales

Considere las medidas adicionales de la defensiva la misma manera que usted piensa en las correas de asiento en su coche. Las correas de asiento reducirán a menudo la severidad de un desplome, pero usted todavía no desea conseguir en un accidente.’S importante observar que para cada clase importante del almacenador intermediario sobre la mitigación, las condiciones previamente explotables que son explotables no más largo en todo existe; y para cualquier técnica dada de la mitigación, un ataque suficientemente complejo puede superar la técnica totalmente. Deje’s mirar a algunos de ellos.

Apile La Protección

La protección del apilado fue iniciada por Crispin Cowan en su producto de Stackguard, y puesta en ejecucio'n independientemente por Microsoft como el interruptor del recopilador de /GS. En su más básico, apile los lugares de la protección un valor conocido como canario en el apilado entre las variables locales y el remite. Más nuevas puestas en práctica pueden también reordenar las variables para la eficacia creciente. La ventaja de este acercamiento es que es barata, tiene gastos indirectos mínimos del funcionamiento, y tiene la ventaja adicional de hacer insectos de la corrupción del apilado el eliminar errores más fáciles. Otro ejemplo es ProPolice, una extensión de la colección del recopilador del gnu (GCC) creada por IBM. Cualquier producto actual debe utilizar la protección del apilado.

Usted debe estar enterado que la protección del apilado se puede superar por una variedad de técnicas. Si se sobreescribe una tabla virtual del indicador de la función y la función se llama antes de vuelta de la función que—los destructores virtuales son buenos candidatos—entonces ocurrirá la hazaña antes de que la protección del apilado pueda venir en juego.

Apilado y montón non-executable

Este las contramedidas ofrecen la protección considerable contra un atacante, pero puede tener un impacto significativo de la compatibilidad del uso. Algunos usos compilan y ejecutan legítimo código en marcha, por ejemplo muchos usos escritos en Java y C #. él’s también importante observar que si el atacante puede hacer su uso bajar presa a una vuelta en el ataque del libc, donde una llamada de función legítima se hace para lograr extremos infames, después la protección del ejecutar en la página de la memoria puede ser quitada.

Desafortunadamente, la mayoría del hardware actualmente disponible no puede apoyar esta opción, y la ayuda varía con CPU-type, el sistema operativo, y la versión del sistema operativo también. Consecuentemente, usted no puede contar en esta protección que está presente en el campo, sino que usted debe probar con él permitió asegurarse de que su uso es compatible con un apilado y un montón non-executable, funcionando su uso en el hardware que apoya la protección del hardware, y el sistema operativo de la blanco fijado para utilizar la protección. Por ejemplo, si usted está apuntando Windows.xp, entonces cerciórese de que usted funcione todas sus pruebas en una computadora de Windows.xp SP2 usando un procesador de AMD Athlon 64 FX. En Windows, esta tecnología se llama la protección de Data Execution (DEP); era conocido una vez como ningún se ejecuta (NX).

El servidor 2003 SP1 de Windows también apoya esta capacidad. Los PaX para Linux y OpenBSD también apoyan memoria non-executable

Otros Recursos

esto es un artículo agregado por Hendra Fang


Share  

© 2005-2010 E-articles.info All Rights Reserved - Terms and conditions