Asegure Las Prácticas De la Codificación

Este artículo cava en los aspectos más técnicos de la seguridad en el código usado para poner un uso en ejecucio'n, y proporciona pautas para desarrollar un proceso de la aplicación para la puesta en práctica segura. El potencial para las vulnerabilidades en un uso es reducido por un diseño fuerte, pero la puesta en práctica de los sellos del uso su sino. El trabajo duro vertió en un diseño seguro llega a ser inconsecuente si la puesta en práctica se hace mal. Es también importante entender que la inclusión de tecnologías o de métodos de diseño seguridad-relacionados no implica ni garantiza necesariamente ningún nivel de la seguridad dentro de un uso. La puesta en práctica de un uso y de cualquier tecnología de seguridad usados es uno de los componentes finales que trae un alto nivel de la confiabilidad.

El análisis en la fase de la puesta en práctica es la responsabilidad de reveladores y de encargados del desarrollo. Los reveladores son responsables de poner el diseño en ejecucio'n bien, mientras que los encargados son responsables de disponer el proceso que asegura una buena puesta en práctica. Esto se puede hacer vía los procedimientos estandardizados que incluyen revisiones documentadas del desarrollo y de los estándares, del diseño y de código de la codificación, y el entrenamiento del revelador con respecto a seguridad en el desarrollo del uso. Estos procedimientos benefician los reveladores y los usos sin importar los cuales se utilizan las idiomas o el tipo de uso se desarrolla.

Las idiomas lo más comúnmente posible usadas son hoy el lenguaje de programación de C, la Java, y las idiomas scripting tales como Perl y las cáscaras de UNIX. Cada uno de estas idiomas y ambientes se puede utilizar incorrectamente para comprometer la seguridad de un uso y del sistema en los cuales funcione. Sin embargo, este artículo no es una lista de comprobación para que los reveladores sigan. En lugar, el desarrollo de un proceso seguridad-enfocado del pensamiento permite una práctica discutible más fuerte de la codificación.

Trampas por la C

Los lenguajes de programación de C, que incluyen C, C++, y el objeto-C, son las idiomas lo más comúnmente posible usadas y pueden ser peligrosos en manos inseguras. Proveen del revelador la capacidad de manipular y de tener acceso a muchas piezas del sistema, tales como memoria, de archivos y de dispositivos. Ésta es una gran fuerza de las idiomas de C, pero el peligro se presenta cuando el revelador incurre en equivocaciones. C proporciona un alto nivel del acceso al sistema operativo subyacente, y hay pocos cheques y equilibrios para proteger el revelador. Si el revelador escribe equivocadamente datos al dispositivo o a la posición de memoria incorrecto, el programa de C hará lo que escribe el revelador, sin importar los datos o la destinación.

  

La primera área vulnerable asociada a menudo a C es el desbordamiento del almacenador intermediario. El código siguiente de la muestra demuestra un desbordamiento muy básico:

carbón string[10 ];
el strcpy(string, "AAAAAAAAAAAAAAA");  / * 15 
"caracteres de A" 

Aquí, 15 "los caracteres de A" se copian en el área de memoria para una secuencia variable, que se declara para ser un arsenal 10-character estático. La función del strcpy() hace exactamente según lo dirigido sin el respeto para el tamaño de los datos que son copiados o de la localización a los cuales va. Un desbordamiento del almacenador intermediario ocurre cuando el 11mo elemento se copia en la posición de memoria, inmediatamente después de la localización del 10mo elemento de la secuencia variable. Ahora aplique este principio a cualquier dato de entrada que venga de una fuente externa, substituyendo la cadena de caracteres de "A". Esto permite que los atacantes controlen los efectos del desbordamiento.

La función del strcpy() es una de varias funciones en C que no realicen ninguna límites que comprueban y no permitan que los almacenadores intermediarios arbitrariamente clasificados sean copiados. Otras funciones a evitar son gets(), strcat(), sprintf(), y la familia del scanf() de funciones. Hay versiones actualizadas de algunas de estas funciones que permitan las longitudes copiadas para ser especificado. Éstos son strncpy(), strncat(), snprintf(), y fgets(). Éstos las funciones modificadas copian solamente hasta el número de los caracteres especificados por el parámetro de la longitud. En la mayoría, los caracteres de la longitud se copian de fuente en la destinación:

strncpy(destination, fuente, longitud);

Extremidad

Al usar las versiones de "n" del strncpy() de las funciones de la manipulación—de secuencia, el strncat(), el snprintf(), y el fgets()—sean seguros que la longitud no es más grande que la secuencia de la destinación, más bien que la secuencia de la fuente. El almacenador intermediario puede ser sobrado si el valor de la longitud es más grande que el tamaño del almacenador intermediario de la destinación.

Al usar indicadores a los almacenadores intermediarios, en vez de almacenadores intermediarios estáticamente declarados, usted necesita asignar bastante memoria para almacenar los valores que son copiados. Utilice las funciones de la manipulación de la memoria, que permiten que usted especifique longitud.

Extremidad

Al asignar la memoria para los datos de la secuencia, no se olvide de agregar 1 a la longitud total, para acomodar para el carácter que termina NULO. Sin un adaptador NULO, los datos en memoria directamente después de que el carácter pasado de la secuencia se pudiera considerar parte de la secuencia.

Estas funciones no son los únicos lugares en donde ocurren los desbordamientos del almacenador intermediario. Sea seguro comprobar que la información leyó, copiado, o escrito a cualquier posición de memoria o asignado a una variable cabrá, o que la destinación asignada tiene bastante espacio de almacenaje.

Extremidad

Para evitar desbordamientos del almacenador intermediario en su código, sea seguro validar la entrada. Compruebe el tamaño de los datos y de la localización del almacenaje y utilice las funciones de la manipulación que generan cantidades de información revelador-especificadas en vez arbitrariamente de largo de pedazos de datos.

Las condiciones de la raza agregan un nivel de la complejidad a usar código de C. Las condiciones de la raza se pueden explotar en dos aspectos de ordenar y de la protección—de la creación del código de C.

El ordenar refiere a la orden en la cual los acontecimientos ocurren en un uso. Las condiciones de la raza pueden resultar de ordenar variaciones entre los acontecimientos dependientes, cuando no se hace ninguna comprobación entre los acontecimientos. Esto significa a menudo un defecto en cualquier rutina error-checking y de la validación usada. Si dos funciones funcionan normalmente secuencialmente y la segunda función asume que los resultados del primeros son válidos, entonces la posibilidad de una condición de la raza existe. Los privilegios elevados son a menudo blancos del ataque. La organización, combinada con el repaso el ordenar y de las faltas, reduce al mínimo la posibilidad de condiciones de la raza.

Ésta es una mala puesta en práctica que crea una condición de la raza:

increase_privs();
...
valor = special_app_function(); / * requiere
*/
de los privilegios
other_unreleted_function(); 
/ * no requiere */
de los privilegios
other_unreleated_function2(); 
/ * ídem */
special_dependent_function(value); / * 
requiere */
de los privilegios
...
exit();

Aquí, un par de prácticas inseguras ocurre. Los privilegios del uso se elevan temprano en el uso, pero no se utilizan hasta más adelante. También nunca se abandonan, la mayoría de la funcionalidad se ejecutan tan con los niveles alto-que-necesarios del privilegio. Finalmente, la condición de la raza se crea con la organización pobre que—las funciones dependientes no ocurren cerca de uno a. Un ejemplo que soluciona estos problemas es

increase_privs();
valor = special_app_function; / * requiere */
de los privilegios
si (!validate_function(value)/*
asegure la seguridad del */
del valor
{
    do_error_processing(value); / * haga algo 
inteligente con */
del error
}
special_dependent_function(value); / * 
requiere */
de los privilegios
decrease_privs(); / * 
ningún * más largo/
de los privilegios de la necesidad
 
other_unreleted_function(); / * no requiere */
de los privilegios
other_unreleated_function2(); 
/ * ídem */

Observe las rutinas especiales de la validación y de proceso de error que se utilizan antes de pasar el valor a otra función.

Extremidad

Organice la funcionalidad y combínela con la validación para asegurarse de que la información prevista no está comprometida entre los acontecimientos dependientes.

Muchas condiciones de la raza existen como resultado el uso pobre del fichero temporal. Cuando se crean estos archivos, deben ser protegidos contra ataque externo durante la operación. UNIX y Windows permiten que el revelador fije los pedacitos del permiso y las banderas operacionales al crear un archivo. Permisos si rechace el acceso a cualquier persona solamente el dueño del proceso. Al crear el archivo usando la llamada del open(), fije las banderas de O_EXCL y de O_CREAT, que hacen la función volver un error si existe el archivo que usted está procurando crear ya. Porque es un fichero temporal, no debe existir antes de la necesidad de él. Si existe el archivo, ésta es una muestra posible del ataque. Al usar estos métodos, es también importante comprobar los valores de vuelta de las funciones y limpiar encima de cualquier archivo en el acontecimiento de las condiciones de error. El ejemplo siguiente demuestra el sintaxis para abrir un archivo—o crear uno, si no existe ya—con los permisos que permiten que solamente el creador lea, escríbalo, y ejecute que usa la macro del modo de S_IRWXU.

open("filename", O_CREAT | O_EXCL | O_WRONLY, S_IRWXU);

La llamada fallará en caso que el archivo exista ya debido a la bandera de O_EXCL. También, observe el nombre de fichero del unsecure. La convención de nombramiento estática usada aumenta el riesgo del ataque dramáticamente porque un componente del ataque se proporciona ya.

debido a la presencia creciente de las condiciones de la raza del fichero temporal y de las inseguridades asociadas, varios sistemas operativos tienen funciones específicas para crear ficheros temporales de una manera segura.

Los reveladores pueden también utilizar las capacidades de archivo-fijacio'n incorporadas de un sistema operativo para controlar el acceso a los archivos. Estos métodos controlan el acceso en los componentes fundamentales del núcleo.

Extremidad

Al usar ficheros temporales, seleccione al azar los nombres de fichero, fije los permisos fuertes, y organice la creación, el uso, y el retiro de los archivos de reducir al mínimo la posibilidad de ataque.

Otro componente que aumenta confiabilidad y puede influenciar la seguridad de un uso es el valor de vuelta. Mientras que puede ser que se parezca obvio, es importante tensionar la necesidad de validar los valores de vuelta de funciones. Las funciones se ejecutan a menudo en serie y confían en los resultados o los datos de una función anterior. Comprobando el valor de vuelta de funciones anteriores, la función dependiente es protegida contra ejecutarse con datos inválidos. Incluso cuando los acontecimientos no son ataques, la recuperación de condiciones anómalas aumenta la robustez del uso.

Este ejemplo demuestra una puesta en práctica pobre que no pueda comprobar los valores de vuelta:

n = do_string_check (secuencia, valid_characters); /
* la función vuelve * interno/
si (== GOOD_RETURN de n)
{
    process_string(string);
}

Aquí, la puesta en práctica es débil porque el caso negativo, una mala vuelta, nunca se maneja. Una puesta en práctica mejor es

n = el do_string_check(string, valid_characters); 
/ * la función vuelve * interno/
si (n! = GOOD_RETURN)
{
    special_error_processing_routine(n); / * el 
mal valor, hace algo */
}
process_string(string);

La vuelta negativa es manejada por la rutina de proceso del-ERROR, que puede salir del programa, solicitar una secuencia nueva, o convertir el valor de vuelta en un parámetro válido. Si el valor de vuelta es bueno, va a la rutina de proceso.

Extremidad

La creación de las rutinas reutilizables del acontecimiento y del error proporciona un mecanismo estándar por el cual todos los usos reaccionen a los varios ataques y ediciones. Las ideas para estas rutinas incluyen los métodos comunes de la validación para la secuencia y los valores, las funciones de la envoltura para realizar cheques de la integridad, y los mecanismos numéricos de la protección que validan variables y posiciones de memoria. Compruebe y procese siempre el valor de vuelta de una función.

 

El pedacito siguiente del detalle implica el uso de la información sensible dentro del uso, incluyendo contraseñas, el cifrado, o cualquier otra información privada. Según lo mencionado previamente, toda la información del programa existe en áreas de la piscina común de la memoria que puede estar conforme a la lectura y a la modificación por procedimientos externos. Es beneficioso despejar la memoria cuando la información es no más larga en uso, para evitar de revelar la información durante un ataque. El método más común y más suficiente a los datos claros, éste se refiere típicamente como poniendo a cero fuera de memoria. Cuando la información almacenada es una necesaria no más largo, las localizaciones del almacenaje se deben sobreescribir con ceros o datos al azar para evitar que un atacante recupere la información vía memoria o vaciados de memoria. Este procedimiento llega a ser particularmente importante cuando el cifrado está en uso. Las llaves cifraban y los mensajes del decrypt son los pedazos más importantes de un sistema criptográfico, y de todo posible protegerlos las necesidades de ser hecho.

Estas pautas ejemplifican algunas de las ediciones comunes que se presentan en usos C-basados. C es una muy popular y la lengua de gran alcance que permite proporciona gran flexibilidad al revelador, y cuidado se debe tomar con su uso.

Un Perl de un uso

El Perl es una bestia interesante que combina muchas de las ventajas de un lenguaje de programación estructurado, como C, con la flexibilidad y la integración de una cáscara de UNIX. El Perl permite que el revelador cree procedimientos o subprogramas, defina variables, y utilice los usos y los comandos disponibles con el sistema operativo. Estas capacidades, y su fuerza con expresiones y análisis regulares, Perl de la elasticidad una presencia fuerte en usos del Web, administración del sistema, y automatización.

Los programas del Perl no son generalmente susceptibles a los desbordamientos del almacenador intermediario debido a la naturaleza débil mecanografiada de sus variables y declaraciones. Desemejante de C, en donde las variables y la memoria necesitan ser definidas como clase particular del almacenaje y la memoria se debe asignar para ellas, el Perl hace todo automáticamente y trata todo como datos de la secuencia. Tome el ejemplo siguiente:

#!/path/to/perl
$one = 1;
$one_s = "1";  # ningún diferente que $one
$two = $one + #; # el 
resultado es 2, o "2", que son equivalentes

En C, el $one variable probablemente sería declarado un número entero y #, una secuencia. La adición de los dos elementos también daría lugar a un valor erróneo. El Perl no distingue entre los diversos tipos, así que $two se asigna 2, o "2"—son equivalentes en el Perl. La lengua también no baja presa a los requisitos de la asignación de memoria que otras idiomas exhiben. El ejemplo siguiente es totalmente aceptable en el Perl:

#!/path/to/perl
$var1 = "AAAAA";
$var2 = "BBBB";
$var2 = #; # $var2 se convierte en 
"AAAAA";

$var2 adquiere el nuevo valor de cinco "los caracteres de A". Todas las variables se asignan dinámicamente; no hay concepto del espacio de almacenaje preestablecido que no podría ser desbordado.

El Perl es susceptible, sin embargo, a las condiciones de la raza y a las vulnerabilidades asociadas a la ejecución de programas externos. El cuidado se debe dar a ordenar de funciones. La validación de la entrada es igualmente importante en el Perl, para prevenir la explotación de usos externos.

El Perl apoya la capacidad para abrir archivos, semejantemente en C y otras idiomas, por lo tanto el uso de ficheros temporales debe incorporar permisos apropiados y banderas de la creación.

El uso del Perl en programas del cgi de Web-based es también extremadamente popular. Los riesgos más grandes se asociaron a su uso en este ambiente ocurren durante la validación de la entrada y la ejecución de los programas del sistema externos de dentro. Para proteger el uso, varias precauciones pueden ser tomadas. El usar corrupcio'n-comprueba mecanismos del Perl, cualquier sistema variable fuera del programa no será pasado a cualquier programa funcionado por el uso. Cualquier variable fijó por la variable corrompida se corrompe. Corrupcio'n-compruebe el modo es particularmente útil para evitar vulnerabilidades, en donde las variables desenfrenadas del usuario se pasan surreptitiously a los programas llamados del uso del Perl. Para inicializar la versión 5 del Perl en corrupcio'n-compruebe el modo, utilizan el jefe siguiente de la escritura:

#!/path/to/perl –T # funcionan en 
corrupcio'n-comprueban modo

La precaución siguiente es analizar valores de la entrada para quitar meta-characters y valores indeseados. Esto ayuda a proteger contra los ataques que explotan para'metro-pasar a las cáscaras y a otros usos. El ejemplo siguiente demuestra una rutina simple que explore una secuencia de la entrada para cualquier meta-characters que se pudiera interpretar por un programa:

$unclean_input = &get_HTML_forms_response();
if($unclean_input = ~  tr /;|`!$&*()[]{} :'"//)
{
    # impresión fuera de algún HTML aquí que 
indica falta
    &do_some_error_reporting();
}

En este caso, la rutina divulga un error si se encuentra un meta-character. Los métodos alternativos substituyen meta-characters, o continúan solamente si no se encuentra ningún meta-character.

Una precaución final es el uso de una cáscara de funcionar otros usos. Como con la llamada del system() de UNIX y la llamada del exec() de Windows, la llamada del system() en el Perl permite que el revelador funcione otro uso. La llamada del exec() en el Perl funciona como esa llamada en UNIX que—el proceso corriente es substituido por el programa indicó. Estas funciones pueden ser particularmente peligrosas cuando están utilizadas en los ambientes que permiten que el usuario entre, por ejemplo el cgi programan o utilidades de sistema. Si no ocurre la validación de la entrada, el uso se puede explotar para ejecutar los programas arbitrarios que pueden afectar el sistema. El ejemplo siguiente demuestra las inseguridades de usar el system() con nonvalidated la entrada. Asuma que el usuario proveió el username;/bin/rm rf –de la secuencia/que se asignó al variable #:

system("ecommerce_app # ");

Esto traduce con eficacia al username del ecommerce_app de /bin/sh; /bin/rm –rf/. si se asume que el programa está funcionando con privilegios, el programa ejecutará una cáscara para funcionar el uso del e-comercio; golpee el punto y coma de la cáscara, que es el separador de comando en una cáscara; y rm entonces funcionado –rf, que borra el sistema de ficheros entero.

Milla Java Es Su Java

Java es una invención relativamente reciente en el mundo de computar distribuido del Internet. Trae a la fruición el concepto del código de platform-independiente. Java trabaja escribiendo código y compilándolo en un formato especial que entonces se funcione en las máquinas virtuales de Java. La máquina virtual (VM) es específico de la plataforma, pero el código que los funcionamientos en él no son. Java permite que los browsers del Web y los sistemas alejados funcionen usos más complejos y más interactivos. El browser del Web tiene acceso a un sitio del Web y recibe un Java applet Del servidor. Este applet después funciona en el browser del Web y puede comunicarse con el servidor del Web que origina. Cuando estaba introducida, Java transformó las páginas estáticas del Web en usos dinámicos y que fluían. Desde los días tempranos, el uso de Java se ha ampliado en muchas diversas áreas de aplicación distribuidas tales como dirección de la red, aplicaciones encajadas del Internet, y otras funciones para uso general.

Java es un ejemplo fino de una lengua que reveladores consideraban seguridad en las etapas tempranas del diseño. Las versiones iniciales de Java tenían una arquitectura bien documentada de la seguridad, llamada el sandbox, que previno el Java applet o el uso De recursos de sistema que tenían acceso. Mientras que el uso de Java comenzó a ampliarse, la necesidad se presentó para el acceso a los recursos de sistema fuera del sandbox. La primera versión del kit del desarrollo de Java proporcionó el uso de applet firmados. El modelo describe un applet que digital se firme para verificar a su creador. Cuando se verifica la firma digital, el applet entonces es confiado en por el sistema local, que permite el acceso del applet a otros recursos de sistema. Este método digital de la firma implica una cantidad justa de complejo que programa para trabajar correctamente. Es también importante observar que este modelo de la seguridad de un Java applet Digital firmado es dañado. Cualquier persona puede firmar un applet. Un applet malévolo se puede firmar por el atacante y descargar por el browser del Web. El browser del Web verifica con eficacia que el applet malévolo sea escrito de hecho por el atacante, y después lo ejecuta feliz, a cualquier resultado se programa en él.

La iteración actual y segunda de la arquitectura de la seguridad de Java es mucho más de gran alcance y flexible que anterior versiones. Esto permite que Java incorpore muchas áreas del desarrollo del uso previamente más allá de sus capacidades. La nueva arquitectura de la seguridad de Java utiliza fácilmente las políticas de la seguridad y los métodos de control definibles de acceso que permiten que un applet o un uso tenga acceso a recursos específicos a los grados que varían. En lo referente a las pautas presentó aquí, los diseñadores de Java analizaban las varias interacciones y vulnerabilidades presentes con usos distribuidos del Internet, y llegaron un modelo que provee de alta seguridad flexibilidad extrema. Para la documentación completa en Java y su APIs, vea http://java.sun.com.

El juego y el UNIX de la cáscara

UNIX descasca la forma la base de la interacción del usuario con un sistema de UNIX. Las cáscaras son comando-li'nea intérpretes que apoyan un cierto nivel de la automatización y de la programación en la forma de shell scriptes. Estas escrituras se utilizan a menudo para automatizar tareas del sistema, realizar operaciones repetidoras, y usos funcionados del Web del cgi. Como con el Perl, las áreas del riesgo potencial son validación entrada, condiciones de la raza, interacción con los archivos externos y los programas, y la organización de la funcionalidad.

En UNIX, las operaciones privilegiadas se pueden funcionar por un usuario privilegiado, o pueden ser fijadas al funcionamiento como usuario privilegiado. Hay diferencias sutiles entre los dos métodos. Todos los archivos en un sistema de UNIX, incluyendo usos, tienen un sistema de las cualidades que incluyen a usuario y agrupan propiedad, y un sistema de banderas de los permisos. Combinados, permiten que el acceso del archivo sea controlado terminantemente. Los usos normales son poseídos por un usuario y, dependiendo de los permisos de acceso, puede ser que sean funcionados solamente por el dueño, por un grupo, o por cualquier persona en el sistema. Los usos heredan los privilegios del usuario que los funciona. Un uso que requiere privilegios de la raíz se puede funcionar por un usuario de la no-rai'z, pero, en esos puntos donde se requieren privilegios más altos, él fallará. Para superar esto y para permitir que los usuarios normales tengan acceso a ciertas funciones privilegiadas, UNIX proporciona las banderas de SetUID y de SetGID. Cuando están permitidos, hacen el uso funcionar como el dueño o el grupo para ese uso que—fijaron la identificación del usuario (UID) del uso a quienquiera lo posee.

Mucho los programas del cgi y del sistema requieren el acceso a los recursos de sistema y son raíz de SetUID. Esto se aplica a los programas compilados, tales como programas de C, y a las escrituras, incluyendo el Perl y las cáscaras de UNIX. Los usuarios y los reveladores experimentados de UNIX advierten a menudo sobre los peligros de los shell scriptes de SetUID que proporcionan privilegios de la raíz. Según lo discutido anterior, la validación y las condiciones entradas de la raza se explotan fácilmente cuando la escritura no se protege correctamente. Al funcionar una escritura como usuario privilegiado, no hay manera más fácil de entregar las llaves al castillo que un shell script débil. Tales escrituras son particularmente peligrosas cuando están programadas sin medidas de seguridad porque una cáscara es interactiva por la naturaleza. La entrada de la fuente de los usuarios, y la cáscara realiza una función. El Perl tiene muchos cheques incorporados y equilibrios que permitan un uso más seguro de SetUID.

Aplicaciones Del Internet

Las aplicaciones del Internet son esos sistemas y dispositivos que propósito entero es el computar del Internet. Todas las pautas del diseño, consideraciones del lenguaje de programación, vulnerabilidades, y paradigmas de funcionamiento son directamente relevantes a las aplicaciones del Internet. Las aplicaciones del Internet utilizan a menudo sistemas operativos, usos, y métodos comunes para lograr sus metas. Si el uso en el desarrollo sigue esta trayectoria, atención especial de la paga a toda la información presentada aquí. Algunas aplicaciones del Internet se desarrollan de rasguño, incorporando solamente diseños y tecnologías nuevamente desarrollados. La determinación del riesgo de la seguridad para estos sistemas requiere diligencia adicional. Es especialmente importante integrar seguridad en un proceso del diseño al salir de rasguño.

esto es un artículo agregado por Tamas Querolin


Negación: Nuestro Web site no es responsable de la información contenida por este artículo. Este artículo de ninguna manera refleja las vistas, las opiniones, los pensamientos o la creencia del personal del directorio de los artículos.

Aviso de la traducción: El artículo "prácticas seguras de la codificación" fue traducido usando un servicio de traducción automatizado. Nos disculpamos sinceramente por cualquier error de la traducción que ocurriera. Gracias por entender.

Online: 413 users browsing the articles directory