Problemas De la Secuencia Del Formato
Los problemas de la secuencia del formato son uno de los pocos verdaderamente nuevos ataques a emerger en años recientes. Una de las primeras menciones de los insectos de la secuencia del formato era de junio el 23 de 2000, en un poste de Lamagra Argamal (www.securityfocus.com/archive/1/66842); El PASCAL Bouchareine casi los explicó más claramente un mes más adelante (www.securityfocus.com/archive/1/70552). Un poste anterior de Mark Slemko (www.securityfocus.com/archive/1/10383) observó los fundamentos del problema, pero faltó la capacidad de los insectos de la secuencia del formato de escribir memoria. Como con muchos problemas de la seguridad, la causa de la raíz de los insectos de la secuencia del formato está confiando en la entrada user-supplied sin la validación. En C/C++, los insectos de la secuencia del formato pueden ser utilizados para escribir a las posiciones de memoria arbitrarias, y el aspecto más peligroso es que éste puede suceder sin tratar de forzar con los bloques colindantes de la memoria. Esta capacidad de grano fino permite que un atacante puentee protecciones del apilado, e incluso modifica porciones muy pequeñas de la memoria. El problema puede también ocurrir cuando las secuencias del formato se leen en untrusted la localización que el atacante controla. Este último aspecto del problema tiende para ser más frecuente en los sistemas de UNIX y de Linux. En los sistemas de Windows, las tablas de cadena del uso se guardan generalmente dentro del programa ejecutable, o de las bibliotecas de acoplamiento dinámicas del recurso (DLLs). Si un atacante puede reescribir el ejecutable principal o el recurso DLLs, el atacante puede realizar muchos más ataques directos que insectos de la secuencia del formato. Incluso si usted’re no tratar de C/C++, ataques de la secuencia del formato puede todavía conducir a los problemas considerables. El más obvio es que los usuarios pueden ser engañados, pero bajo algunas condiciones, un atacante pudo también lanzar ataques el scripting del cruz-sitio o de la inyección del SQL. Éstos se pueden utilizar para corromper o para transformar datos también. Idiomas AfectadasLa lengua lo más fuertemente posible afectada es C/C++. Un ataque acertado puede conducir inmediatamente a la ejecución del código arbitrario, y al acceso de la información. El otro t ganado’las idiomas permite típicamente la ejecución del código arbitrario, pero otros tipos de ataques son posibles como observamos previamente. El isn t’del Perl directamente vulnerable a los specifiers que eran dados por la entrada del usuario, pero él podría ser vulnerables si las secuencias del formato se leen adentro en datos tratados de forzar. El Pecado ExplicadoLos datos del formato para la exhibición o el almacenaje pueden ser una tarea algo difícil. Así, muchos lenguajes de programación incluyen rutinas para cambiar formato fácilmente datos. En la mayoría de las idiomas, se describe la información del formato usando una cierta clase de una secuencia, llamada la secuencia del formato. La secuencia del formato se define realmente usando lengua de proceso de datos limitada que’s diseñó hacerla fácil describir formatos de la salida. Pero muchos reveladores incurren en una equivocación fácil que—utilizan datos de untrusted a usuarios como la secuencia del formato. Consecuentemente, los atacantes pueden escribir secuencias en la lengua de proceso de datos para causar muchos problemas. El diseño de C/C++ hace este especialmente peligroso: El diseño’de C/C++ s hace más duro detectar problemas de la secuencia del formato, y las secuencias del formato incluyen algunos comandos especialmente peligrosos (particularmente %n) que no existan en algunas otras idiomas’ de la secuencia del formato de las idiomas. En C/C++, una función se puede declarar para tomar un número variable de discusiones especificando puntos de suspensión (…) como (o solamente) la discusión pasada. El problema es que la función que es llamada no tiene ninguna manera de saber apenas cuántas discusiones se están pasando adentro. El sistema más común de funciones para tomar discusiones de la longitud variable es la familia del printf: printf, sprintf, snprintf, fprintf, vprintf, etcétera. Las funciones amplias del carácter que realizan la misma función tienen el mismo problema. Deje’la toma de s una mirada en una ilustración: # incluya < stdio.h > argc del main(int, carbón internos * argv[ ]) vuelta 0; Materia bastante simple. Ahora deje’s mirar qué puede ir mal. El programador está esperando que el usuario incorporara algo benigno, por ejemplo hola el mundo. Si usted le da un intento, usted’ll consigue detrás hola el mundo. Ahora deje’el cambio de s la entrada un poco—el intento %x %x. En un sistema de Windows.xp usando la línea de comando del defecto (cmd.exe), usted’ll ahora consigue el siguiente: E:\projects\19_sins\format_bug>format_bug.exe "%x %x" Observe que si usted’re el funcionamiento de un diverso sistema operativo, o está utilizando una diversa línea de comando intérprete, usted puede necesitar realizar algunos cambios para conseguir esta secuencia exacta alimentada en su programa, y los resultados serán probablemente diferentes. Para la facilidad de empleo, usted podría poner las discusiones en un shell script o un archivo de hornada. ¿Qué sucedió? La función del printf tomó una secuencia de la entrada que la hizo esperar que dos discusiones sean empujadas sobre el apilado antes de llamar la función. Los specifiers de %x le permitieron leer el apilado, cuatro octetos a la vez, hasta usted’d como. Él isn’t difícilmente para imaginarse que si usted tuviera una función más compleja que almacenó un secreto en una variable del apilado, el atacante entonces podría leer el secreto. La salida aquí es la dirección de la localización del apilado (0x12ffc0), seguida por la localización del código en la cual la función del main() volverá. Como usted puede imaginarse, both.of.these son los pedazos de información extremadamente importantes que se están escapando a un atacante. Usted puede ahora preguntarse apenas cómo el atacante utiliza un insecto de la secuencia del formato para escribir memoria. Uno de los menos specifiers usados del formato es %n, que escribe el número de los caracteres que se deben haber escrito hasta ahora en la dirección de la variable que usted dio como la discusión correspondiente. Aquí’s cómo debe ser utilizado: octetos internos sin firmar; La salida sería: E:\projects\19_sins\format_bug>format_bug2.exe una "cierta entrada al azar" Una cierta entrada al azar Su entrada era 17 caracteres largos En una plataforma con números enteros four-byte, el specifier de %n escribirá cuatro octetos inmediatamente, y %hn escribirá dos octetos. Ahora los atacantes tienen que calcular solamente fuera de cómo conseguirlos a la dirección’d como en la posición apropiada en el apilado, y pellizcan los specifiers de la anchura del campo hasta que el número de los octetos escritos es de lo que él’d tiene gusto. Para ahora, deje’s apenas asumir que si usted permite los atacantes controlen la secuencia del formato en un programa de C/C++, es una cuestión de tiempo antes de que calculen fuera de cómo hacer que usted funcione su código. Un aspecto especialmente repugnante de este tipo de ataque es ése antes de lanzar el ataque, pueden sondar el apilado y corregir el ataque en marcha. En hecho, la primera vez que el autor demostró este ataque en público, él utilizó una diversa línea de comando intérprete que él’d usada para crear la demostración, y la trabajo’del didn t. debido a la flexibilidad única de este ataque, era posible corregir el problema y explotar el uso de muestra con mirar de las audiencias. La mayoría de las otras idiomas ponen’la ayuda de t el equivalente de un specifier del formato de %n, y aren’t directamente vulnerable a la ejecución fácil del código atacante-provisto, pero usted puede funcionamiento inmóvil en problemas. Hay otro, variantes más complejas en esto ataque que otras idiomas son vulnerables a. Si los atacantes pueden especificar una secuencia del formato para la salida a un fichero de diario o a una base de datos, pueden causar registros incorrectos o engañosos. Además, el uso que lee los registros puede considerar los entrada confiada en, y una vez que se viole esta asunción, debilidades en que el programa de análisis’del uso s puede conducir a la ejecución del código arbitrario. Un problema relacionado está encajando caracteres de control en ficheros de diario que—las teclas de retroceso se pueden utilizar para borrar cosas; alinee los adaptadores puede ofuscar o aún eliminar los rastros’del atacante s. Esto debe ser evidente, pero si un atacante puede especificar la secuencia del formato alimentada al scanf o a las funciones similares, el desastre está en la manera. Sinful C/C++Desemejante de muchos otros defectos’ll examinamos, éste somos bastante fáciles de manchar como defecto del código. Él’s muy simple: printf(user_input); printf("%s", user_input); Una variante en el problema que la negligencia de muchos programadores es que no es suficiente hacer esto correctamente solamente una vez. Hay un número de construcciones comunes del código donde usted puede ser que utilice el sprintf para colocar una secuencia ajustada a formato en un almacenador intermediario, y después se desliza para arriba y hace esto: fprintf(STDOUT, err_msg); Pecados RelacionadosAunque el ataque más obvio se relaciona con un defecto del código, es una práctica común poner secuencias del uso en los archivos externos para los propósitos de la internacionalización. Si su uso tiene sinned no pudiendo proteger el archivo correctamente, después un atacante puede proveer secuencias del formato debido a una carencia del acceso apropiado del archivo. Otro pecado relacionado no está pudiendo validar correctamente la entrada del usuario. En algunos sistemas, una variable de entorno especifica la información del locale, y el locale, alternadamente, determina el directorio donde los archivos específicos a una lengua serán encontrados. En algunos sistemas, el atacante pudo incluso hacer el uso mirar en directorios arbitrarios. Manchar el patrón del pecadoCualquier uso que tome a usuario entre y los pasos a una función del formato está potencialmente en el riesgo. Un caso muy común de este pecado sucede conjuntamente con los usos que registran la entrada del usuario. Además, algunas funciones pueden poner ajustar a formato en ejecucio'n internamente. Manchar el pecado durante la revisión de códigoEn C/C++, busque las funciones de la familia del printf. Los problemas a buscar son printf(user_input); Si usted ve una función que parezca esto: fprintf(STDOUT, msg_format, arg1, arg2); entonces usted necesidad de verificar donde la secuencia referida por el msg_format se almacena y cómo esta' bien se protege. Hay muchas otras llamadas del sistema y APIs que es también syslog—vulnerable es un ejemplo. Cualquier momento usted ve una definición de la función que incluya … en la lista de la discusión, usted’re mirar algo que es probable ser un problema. Muchos exploradores de código de fuente, incluso los léxicos tienen gusto de RATAS y el flawfinder, puede detectar esto. Allí’s PScan uniforme (www.striker.ottawa.on.ca/~aland/pscan/), que fue diseñado específicamente para esto. También está contradiciendo el herramienta que se puede construir en el proceso de la compilación. Por ejemplo, allí’s Crispin Cowan’s FormatGuard: http://lists.nas.nasa.gov/archives/ext/linux-security-audit/2001/05/msg00030.html Técnicas de prueba para encontrar el pecadoPase los specifiers del formato en el uso y vea si se vuelven los valores hexadecimales. Por ejemplo, si usted tiene un uso que cuente con un nombre del archivo y vuelva un mensaje de error que contiene la entrada cuando el archivo no puede ser encontrado, después el intento que le da el archivo nombra como NotLikely%x%x.txt. Si usted consigue un mensaje de error a lo largo de las líneas de "NotLikely12fd234104587.txt no se puede encontrar," entonces usted acaba de encontrar una vulnerabilidad de la secuencia del formato. Esto es obviamente algo language-dependent; usted debe pasar en los specifiers del formato que son utilizados por la lengua de puesta en práctica usted’re usar por lo menos. Sin embargo, puesto que muchos tiempos de pasada de la lengua se ponen en ejecucio'n en C/C++, usted’d sea sabio también de enviar en comandos de la secuencia del formato de C/C++ de detectar los casos donde su biblioteca subyacente tiene una vulnerabilidad peligrosa. Observe que si el uso es tela basada y repite a su usuario entrado de nuevo a usted, otra preocupación sería ataques scripting del cruz-sitio Pecados Del EjemploLas entradas siguientes en las vulnerabilidades y las exposiciones comunes (CVE) en http:// cve.mitre.org son ejemplos de la inyección del SQL. Fuera de las 188 entradas de CVE que las secuencias del formato de referencia, ésta son justas un muestreo. CVE-2000-0573De la descripción de CVE: “Lreply la función en el wu-ftpd 2.6.0 y anterior no limpia correctamente untrusted la secuencia del formato, que permite que los atacantes alejados ejecuten comandos arbitrarios vía el comando del SITIO EXEC.” Ésta es la primera hazaña público sabida para un insecto de la secuencia del formato. El título del poste de BUGTRAQ subraya la severidad del problema: “Abastecimiento * telecontrol * arraigue desde por lo menos 1994.” CVE-2000-0844De la descripción de CVE: “Algunas funciones que ponen el subsistema del locale en ejecucio'n en UNIX no limpian correctamente secuencias usuario-inyectadas del formato, que permite que los atacantes locales ejecuten comandos arbitrarios vía funciones tales como gettext y catopen.” El texto completo del consultivo original se puede encontrar en www.securityfocus.com/archive/1/80154, y este problema es especialmente interesante porque afecta el sistema APIs de la base para la mayoría de las variantes de UNIX (Linux incluyendo), a excepción de las variantes del DEB debido al hecho de que la variable de NLSPATH está no hecha caso para el uso privilegiado del suid en el DEB. Este consultivo, como muchos advisories de la BASE SDI, es haber escrito especialmente e informativo bien y da una explicación muy cuidadosa del problema total Pasos Del RescateEl primer paso nunca es usuario del paso entrado directamente a una función del formato, y también sea seguro hacer esto a todos los niveles de manejar salida ajustada a formato. Como nota adicional, las funciones del formato tienen gastos indirectos significativos. Mire la fuente para _ hecho salir si usted’re interesado—él puede ser que sea conveniente de escribir: fprintf(STDOUT, buf); La línea precedente del isn t’del código apenas peligroso, pero él también consume muchos de ciclos adicionales de la CPU. El segundo paso a tomar es asegurarse de que las secuencias del formato sus aplicaciones del uso están leídas solamente en lugares confiados en, y de que las trayectorias a las secuencias no se pueden controlar por el atacante. Si usted’re el código de la escritura para UNIX y Linux, después del ejemplo de las variantes y de no hacer caso del DEB de la variable de NLSPATH, que se puede utilizar para especificar el archivo utilizó para los mensajes localizados, puede proporcionar una cierta defensa en profundidad. Rescate de C/C++Allí isn’t mucho más a él que esto: printf("%s", user_input);
Medidas Defensivas AdicionalesCompruebe y limite el locale a los valores válidos. (para más información, vea el rodador s’de David “escribirlo seguro: Ajuste a formato las secuencias y la filtración del locale” enumerada en “la otra sección” de los recursos abajo). Ponga’el uso de t la printf-familia de funciones si usted puede evitarla. Por ejemplo, si usted’re usar C++, operadores de la corriente del uso en lugar de otro: # incluya el < iostream > Otros Recursos
esto es un artículo agregado por Hendra Fang
|
|||
|