stringtranslate.com

Codificación segura

La codificación segura es la práctica de desarrollar software informático de tal manera que se evite la introducción accidental de vulnerabilidades de seguridad . Los defectos, errores y fallas lógicas son sistemáticamente la causa principal de las vulnerabilidades de software comúnmente explotadas. [1] A través del análisis de miles de vulnerabilidades reportadas, los profesionales de seguridad han descubierto que la mayoría de las vulnerabilidades se derivan de un número relativamente pequeño de errores comunes de programación de software. Al identificar las prácticas de codificación inseguras que conducen a estos errores y educar a los desarrolladores sobre alternativas seguras, las organizaciones pueden tomar medidas proactivas para ayudar a reducir o eliminar significativamente las vulnerabilidades en el software antes de la implementación. [2]

Algunos académicos han sugerido que, para enfrentar de manera efectiva las amenazas relacionadas con la ciberseguridad , se debe codificar o “integrar” una seguridad adecuada en los sistemas. Al diseñar la seguridad en el software, se garantiza que habrá protección contra ataques internos y se reduce la amenaza a la seguridad de las aplicaciones. [3]

Prevención de desbordamiento de búfer

Los desbordamientos de búfer , una vulnerabilidad de seguridad de software común, ocurren cuando un proceso intenta almacenar datos más allá de un búfer de longitud fija. Por ejemplo, si hay 8 ranuras para almacenar elementos, habrá un problema si se intenta almacenar 9 elementos. En la memoria de la computadora, los datos desbordados pueden sobrescribir los datos en la siguiente ubicación, lo que puede resultar en una vulnerabilidad de seguridad (ruptura de pila) o la finalización del programa (error de segmentación). [1]

Un ejemplo de un programa en C propenso a un desbordamiento de búfer es

int función_vulnerable ( char * entrada_de_usuario_grande ) { char dst [ PEQUEÑO ]; strcpy ( dst , entrada_de_usuario_grande ); }        

Si la entrada del usuario es mayor que el búfer de destino, se producirá un desbordamiento del búfer. Para solucionar este programa inseguro, utilice strncpy para evitar un posible desbordamiento del búfer.

int secure_function ( char * user_input ) { char dst [ BUF_SIZE ]; // copia un máximo de BUF_SIZE bytes strncpy ( dst , user_input , BUF_SIZE ); // establece el último carácter en el búfer en NUL. dst [ BUF_SIZE -1 ] = '\0' ; }               

Otra alternativa segura es asignar memoria dinámicamente en el montón usando malloc .

char * secure_copy ( char * src ) { size_t len ​​= strlen ( src ); char * dst = ( char * ) malloc ( len + 1 ); if ( dst != NULL ) { strncpy ( dst , src , len ); // añadir terminador nulo dst [ len ] = '\0' ; } return dst ; }                                 

En el fragmento de código anterior, el programa intenta copiar el contenido de src en dst , mientras también verifica el valor de retorno de malloc para garantizar que se haya podido asignar suficiente memoria para el búfer de destino.

Prevención de ataques de cadenas de formato

Un ataque de formato de cadena se produce cuando un usuario malintencionado proporciona datos específicos que, con el tiempo, se utilizarán como argumento para una función que realiza el formato, como printf() . El ataque implica que el adversario lea o escriba en la pila .

La función printf de C escribe la salida en la salida estándar. Si el parámetro de la función printf no está formateado correctamente, pueden producirse varios errores de seguridad. A continuación se muestra un programa que es vulnerable a un ataque de formato de cadena.

int vulnerable_print ( char * entrada_maliciosa ) { printf ( entrada_maliciosa ); }    

Un argumento malicioso pasado al programa podría ser "%s%s%s%s%s%s%s%s", lo que puede hacer que el programa se bloquee debido a lecturas de memoria incorrectas.

Prevención de desbordamiento de enteros

El desbordamiento de números enteros se produce cuando una operación aritmética da como resultado un número entero demasiado grande para ser representado en el espacio disponible. Un programa que no comprueba correctamente el desbordamiento de números enteros introduce posibles errores de software y vulnerabilidades.

A continuación se muestra una función en C++ que intenta confirmar que la suma de x e y es menor o igual a un valor definido MAX:

bool sumIsValid_flawed ( entero sin signo x , entero sin signo y ) { entero sin signo suma = x + y ; devuelve suma <= MAX ; }                

El problema con el código es que no comprueba si hay un desbordamiento de enteros en la operación de suma. Si la suma de x e y es mayor que el valor máximo posible de un unsigned int, la operación de suma se desbordará y tal vez dé como resultado un valor menor o igual a MAX, aunque la suma de x e y sea mayor que MAX.

A continuación se muestra una función que verifica si hay desbordamiento al confirmar que la suma es mayor o igual que x e y. Si la suma se desbordara, sería menor que x o menor que y.

bool sumIsValid_secure ( entero sin signo x , entero sin signo y ) { entero sin signo suma = x + y ; devolver suma >= x && suma >= y && suma <= MAX ; }                        

Prevención de cruce de ruta

El recorrido de ruta es una vulnerabilidad por la cual las rutas proporcionadas desde una fuente no confiable se interpretan de tal manera que es posible el acceso no autorizado a archivos.

Por ejemplo, considere un script que recupera un artículo tomando un nombre de archivo, que luego es leído por el script y analizado . Un script de este tipo podría usar la siguiente URL hipotética para recuperar un artículo sobre comida para perros :

https://www.example.net/cgi-bin/article.sh?name=dogfood.html

Si el script no tiene verificación de entrada y en su lugar confía en que el nombre del archivo siempre es válido, un usuario malintencionado podría falsificar una URL para recuperar archivos de configuración del servidor web:

https://www.example.net/cgi-bin/article.sh?name=../../../../../etc/passwd

Dependiendo del script, esto puede exponer el archivo /etc/passwd , que en sistemas tipo Unix contiene (entre otros) los identificadores de usuario , sus nombres de inicio de sesión , las rutas del directorio de inicio y los shells . (Consulte la inyección SQL para ver un ataque similar).

Véase también

Notas

  1. ^ ab Viega, John; Gary McGraw (2001). Creación de software seguro: cómo evitar problemas de seguridad de la manera correcta . MAddison-Wesley Professional. pág. 528. ISBN 978-0201721522.
  2. ^ Taylor, Blair; Azadegan, Shiva (22 de septiembre de 2006). "Incorporación de principios de codificación segura y análisis de riesgos en el plan de estudios de informática y sistemas de información para estudiantes de grado". Actas de la 3.ª conferencia anual sobre desarrollo de planes de estudios de seguridad de la información . InfoSecCD '06. Kennesaw, Georgia: Association for Computing Machinery. págs. 24–29. doi :10.1145/1231047.1231053. ISBN 978-1-59593-437-6. Número de identificación del sujeto  2452783.
  3. ^ Russell L, Jones (diciembre de 2004). "Codificación segura: Incorporar la seguridad en el ciclo de vida del desarrollo de software". Seguridad de sistemas de información . ProQuest  229507883.

Referencias