0% encontró este documento útil (0 votos)
61 vistas33 páginas

Desarrollo Seguro de Software - Códigos (v3)

El documento detalla diversas vulnerabilidades de seguridad en el código, incluyendo inyecciones SQL, desbordamientos de buffer y falta de validación de entradas. Se proponen soluciones como la validación y saneamiento de entradas, el uso de consultas parametrizadas y la implementación de listas blancas. Además, se enfatiza la importancia de manejar adecuadamente la memoria y evitar el uso de funciones inseguras.

Cargado por

20914942
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como XLSX, PDF, TXT o lee en línea desde Scribd

Temas abordados

  • prevención de ataques,
  • seguridad en bases de datos,
  • consultas parametrizadas,
  • manipulación de rutas,
  • desbordamiento de buffer,
  • prácticas de seguridad,
  • evitar desbordamientos,
  • uso de bibliotecas seguras,
  • análisis de código,
  • análisis de riesgos
0% encontró este documento útil (0 votos)
61 vistas33 páginas

Desarrollo Seguro de Software - Códigos (v3)

El documento detalla diversas vulnerabilidades de seguridad en el código, incluyendo inyecciones SQL, desbordamientos de buffer y falta de validación de entradas. Se proponen soluciones como la validación y saneamiento de entradas, el uso de consultas parametrizadas y la implementación de listas blancas. Además, se enfatiza la importancia de manejar adecuadamente la memoria y evitar el uso de funciones inseguras.

Cargado por

20914942
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como XLSX, PDF, TXT o lee en línea desde Scribd

Temas abordados

  • prevención de ataques,
  • seguridad en bases de datos,
  • consultas parametrizadas,
  • manipulación de rutas,
  • desbordamiento de buffer,
  • prácticas de seguridad,
  • evitar desbordamientos,
  • uso de bibliotecas seguras,
  • análisis de código,
  • análisis de riesgos

Código Problema Solución

Está mal en el
documento está
correcto en el
Powerpoint
Ejemplo de no
validación de la
entrada que puede Hay que validar los parámetros
1
ocasionar una de entrada
vulnerabilidad de
inyección SQL

Hay que validar que solo tenga


Ejemplo de violación
caracteres alfanuméricos y
2 Esto no de los límites de
sanear la entrada de status =
sirve de confianza
para evitar inyecciones
nada

Comprobación de la longitud de
3 No aplica
la entrada

El mejor modo de evitar


problemas de desbordamiento de
Comprobación de
un número entero
tipos /
es comprobar toda la entrada de
4 Desbordamiento del
este tipo de datos, tanto contra
entero (Integer
una cota
overflow)
superior como contra una cota
inferior
Código Problema Solución

Prevenir este tipo de ataques es


Inyección de SQL, utilizar consultas
5 que se forma parametrizadas que fuerzan a
concatenando strings la distinción entre estructuras
de control

No està en la Ejemplo de consulta


presentación de SQL construida con el
6 Powerpoint, uso de sentencias
asumo que no parametrizadas y
sale en el concatenadas
exàmen

Falta de validación para enviar


un valor de reportName que
7 Manipulación de rutas incluya secuencias como ../ para
navegar fuera del directorio
permitido y eliminar archivos

Para evitar la inyección de


Inyección de comandos, debes validar y
8 comandos, sanear las entradas del usuario
En btype antes de utilizarlas en comandos
del sistema.
Código Problema Solución

Validar y sanear siempre las


entradas del usuario es una
9 Falsificación de logs
buena práctica para mejorar la
seguridad

Desbordamiento de
buffer - Error de
seguridad de tipos - se Utilizar un lenguaje de
declara un puntero p programación que fuerce la
10 a un número entero comprobación de tipos y de
(int) y luego se utiliza memoria de forma que su
como un puntero a gestión sea segura
una
función

La JVM, en sí misma,
puede ser susceptible
a problemas de
11 Ver siguiente renglón (12)
desbordamiento.
- Llamada a un
método nativo JNI

El código es
vulnerable a buffer
fgets permite especificar el
overflow causada por
12 tamaño del buffer, evitando así el
una llamada ilimitada
desbordamiento.
a
gets()
Código Problema Solución

Ataque de Uso de una Variable de Entorno


desbordamiento de Controlada: Al ejecutar un shell,
13 buffer basado en el asegúrate de que las variables de
stack entorno sean controladas y
- Ejemplo de shellcode seguras.

Para evitar el desbordamiento de


Figura 18. Empleo buffer, se debe utilizar fgets en
incorrecto de gets() lugar de gets.fgets() permite
14 que puede incurrir en especificar un límite de
desbordamiento de caracteres para la entrada,
buffer. evitando sobreescrituras del
búfer.

Read overflow -
Si len es mayor que el
tamaño de buf (100),
No está en el acceso buf[i] puede
el Asegurarse de que len no sea
leer fuera del límite de
document mayor que el tamaño del buffer.
buf, lo que puede
o solo en causar un
el desbordamiento de
PowerPoint buffer.
Código Problema Solución

Liberar la memoria antes de salir


Heap de la función con
overflow - free(a);

15 La memoria asignada Para evitar fugas de memoria, es


con malloc dentro de importante asegurarse de que
function_which_allo cualquier memoria asignada con
cates no se libera malloc se libere adecuadamente
utilizando free

Reserva dinamica de
memória -
Use after free
Un
programa continúa
usando un puntero No usar el puntero ptr después
que ha sido de llamar a free(ptr). Una
previamente liberado. solución es mover la llamada a
16
Si esa logError antes de liberar ptr o
memoria se vuelve a asegurarte de que ptr no se
reservar, un atacante utilice después de ser liberado.
puede lanzar un
ataque de buffer
overflow catalogado
con el CWE-416
Código Problema Solución

Acceso a una variable


después de liberarla
(Dereference After
Free) -
El puntero a char No utilizar un puntero después de
17
buf2R1 es liberado, haberlo liberado
aunque más adelante
se vuelve a
referenciar desde la
función strncpy

Reserva dinâmica de
memoria - double
free Solo liberar la memoria una vez.
Una posible solución es utilizar
18
Liberar la memoria una bandera para controlar la
más de una vez liberación de memoria,
(double free)

El puntero p se
inicializa a NULL y
luego se desreferencia
Para evitar la desreferencia-ción
(null dereference)
de un puntero nulo, primero
en if (*p).
19 verifica si el puntero es NULL
Desreferenciar un
antes de intentar
puntero nulo (NULL)
desreferenciarlo.
generalmente
conduce a un fallo de
segmentación
Código Problema Solución

Llamada insegura a Evitar el uso de la funciòn gets()


gets() similar a la -
20
explotada por el
gusano Morris Nota: este codigo esta repetido

Manipulación de
strings -
Código de w3-msql Evitar el uso de la funciòn
2.0.11 vulnerable a un scanf()
21
desbordamiento de
búfer remoto causada similares: [fscanf(), wscanf()]
por una llamada
insegura a scanf()

Código del programa


php.cgi en PHP / FI
Evitar el uso de la funcion
2.0beta10 vulnerable
strcpy()
a un desbordamiento
22
de buffer remoto
similares: [wcscpy(), lstrcpy
causada por una
()]
llamada insegura para
strcpy()
Código Problema Solución

Código de la Versión
1.0 del daemon de
Telnet Kerberos 5 que Evitar el uso de la función
contiene un sprintf()
23 desbordamiento de
buffer debido a que la similares: [fprintf(), printf(),
longitud variable de swprintf()]
entorno TERM, que
nunca se valida

No està en la
presentación de Función ilimitada,
Powerpoint, Evitar el uso de las funciones
24 vulnerabilidad en
asumo que no strcpy() y strcat()
Kerberos 5.
sale en el
exàmen

Código del programa


php.cgi en PHP / FI
2.0beta10 vulnerable
No está en a un Evitar el uso de la funciòn
el desbordamiento de strcpy()
document búfer remoto
o solo en causada por una
el llamada insegura para
PowerPoint strcpy()
Código Problema Solución

No está en
el
Código de la Versión
document
1.0 del daemonde
o solo en
Telnet Kerberos5 que De nuevo sprintf(), Es mejor
el
contiene un usar snprintf, que permite
PowerPoint
desbordamiento de especificar el tamaño máximo del
búfer buffer y así evitar escribir más
debido a que la datos de los que el buffer puede
longitud de la variable contener.
de entorno TERM, que
nunca se valida.

No está en
el
document
o solo en
el Evitar el uso de las funciones
PowerPoint Desbordamiento de
strcpy() y strcat()
Buffer con strcat y
strcpy
Usar como strncat y strncpy

No està en la
presentación de
Powerpoint, Llamada a strncpy() Evitar el uso de la funciòn
25 asumo que no que podría causar strcpy()
sale en el error de truncado.
exàmen

No està en la
presentación de String no terminado
Es necesario agregar
Powerpoint, en carácter nulo
26 manualmente la terminación
asumo que no producido por
nula.
sale en el readlink()
exàmen
Código Problema Solución

Utilizar un especificador de
No está en El atacante controla la formato en printf
el cadena de formato
document printf(“%s”,texto);
o solo en
el
PowerPoint

Clásica vulnerabilidad
de
No está en format String en
el wuftpd No permitir que el usuario
document 2.6.0 controle la entrada de formato
o solo en fmt
el En vsnprintf, donde
PowerPoint fmt es controlado por
el usuario

Código Problema Solución

27 Integer overflow

28 Error aritmético.
Código Problema Solución

Integer overflow
causado por
29
conversión signo-sin
signo

No se comprueba el
30
código de retorno.

No se comprueba el
31 código de retorno del
método read()

Excepción con el
32
bloque catch relleno
Código Problema Solución

No se libera la
33
memoria de buff.

34 Password hardcoded

Función aleatoria no
35
segura

Código de un simple
36
FTP server

Ejemplo de código con


una vulnerabilidad
37
TOCTOU en el acceso
a un fichero
Código Problema Solución

Código vulnerable a
ataques a su
38
descriptor de ficheros
estándar

Ejemplo de ataque a
39 vulnerabilidad del
ejemplo anterior

Código que soluciona


vulnerabilidades de descriptor de
40 No aplica ficheros asegurando el uso de los
tres primeros descriptores de
ficheros
Clave Tipo Vulnerabilidad
Validación de entrada

Sin validación del contenido de delimiter:

La variable delimiter se asigna directamente del argumento proporcionado por el usuario


(args[i].substring(12)), sin validación o sanitización.
Esto permite que un atacante proporcione un valor malicioso como
delimeter Validación de entrada --delimiter=../../../../etc/passwd, que podría causar un Path Traversal o escribir datos en
ubicaciones no deseadas.
Uso inseguro de fileOutput.write:

Si formatted incluye entradas manipuladas (por ejemplo, con caracteres especiales o comandos
maliciosos), se podrían escribir contenidos no deseados en el archivo de salida.

status = Validación de entrada

Validación de entrada

malloc() Validación de entrada


Clave Tipo Vulnerabilidad

String query = Validación de entrada

Validación de entrada

reportName Validación de entrada

btype Validación de entrada


Clave Tipo Vulnerabilidad

log.info Validación de entrada

Desboramiento del buffer

Desbordamiento del
*p
buffer

Desbordamiento del
native
buffer

gets(), en este
Desbordamiento del
caso
buffer
gets(buf)
Clave Tipo Vulnerabilidad

Desbordamiento del
shellcode
buffer

gets(), en este
Desbordamiento del
caso
buffer
gets(line)

Desbordamiento del
char buf[100]
buffer
Clave Tipo Vulnerabilidad

function_which_a Desbordamiento del


llocates buffer

Desbordamiento del
free(ptr)
buffer
Clave Tipo Vulnerabilidad

BUFSIZER // Desbordamiento del


buf2R1 buffer

Desbordamiento del
free(ab)
buffer

Desbordamiento del
if (*p) k = *p;
buffer
Clave Tipo Vulnerabilidad

gets(), en este
Desbordamiento del
caso
buffer
gets(line)

Desbordamiento del
scanf()
buffer

Desboramiento del
strcpy()
buffer
Clave Tipo Vulnerabilidad

Desboramiento del
sprintf()
buffer

strcat() y Desboramiento del


strcpy() buffer

Desboramiento del
strcpy()
buffer
Clave Tipo Vulnerabilidad

Desboramiento del
TERM
buffer

strcat() y
strcpy()
Desboramiento del
Podrìamos decir buffer
que está
repetido

Desboramiento del
strncpy()
buffer

Desboramiento del
readlink()
buffer
Clave Tipo Vulnerabilidad

Desboramiento del
printf(texto);
buffer

Desboramiento del
vsnprintf
buffer

Capítulo 5

Clave Tipo
Clave Tipo Vulnerabilidad
Clave Tipo Vulnerabilidad
Clave Tipo Vulnerabilidad
Correccion Recomedaciones generales

Validar el argumento --delimiter


Implementar una lista blanca
Escapar o sanitizar entradas

Validar la entrada de usuario


Escapar o codificar las salidas
Implementar listas blancas

Validar el valor de entrada:


Asegúrate de que sz no sea negativo antes de pasarlo a malloc.
2. Usar un tipo compatible:
Cambia el tipo del parámetro sz para que sea size_t, que es el tipo esperado por
malloc.
3. Manejar casos de error:
Si el valor de sz es inválido, maneja el error adecuadamente en lugar de proceder
con la asignación. • Identificar las fuentes de entrada de
todo el programa; es el interfaz
principal de usuario o la conexión de
red.

• Usar una estrategia como la


selección indirecta o whitelisting que
se enfoca en la identificación de la
entrada
que se sabe está bien.

• Seguir la pista de qué valores han


sido validados y qué propiedades
aquella validación comprobó.

• Intentar no violar las fronteras de


confianza construyendo la validación
todo el programa; es el interfaz
principal de usuario o la conexión de
red.
Correccion Recomedaciones
• Usar generales
una estrategia como la
selección indirecta o whitelisting que
se enfoca en la identificación de la
entrada
que se sabe está bien.

• Seguir la pista de qué valores han


sido validados y qué propiedades
aquella validación comprobó.

• Intentar no violar las fronteras de


confianza construyendo la validación
de entrada en el código alrededor de
donde el programa suele mover
datos.

• No dejar pasar por alto el modo en


que los diferentes componentes
interpretan los datos que pasan por el
programa
Correccion Recomedaciones generales
Correccion Recomedaciones generales

Recomedaciones generales
Correccion Recomedaciones generales
Correccion Recomedaciones generales
Correccion Recomedaciones generales

Common questions

Con tecnología de IA

To prevent buffer overflow vulnerabilities, developers should avoid using functions like gets() and strcpy() that do not limit input size and are prone to buffer overflows. Instead, they should use fgets() and strncpy(), which allow specifying a maximum input size. Additionally, using snprintf() instead of sprintf() helps to ensure that data written into buffers does not exceed their capacity. Moreover, developers should conduct input length checks and parameter validations, ensuring that inputs do not exceed the designated buffer sizes .

Using functions like strcpy() and strcat() without length checks poses significant security risks due to their potential to cause buffer overflow, a common vulnerability that can be exploited for various attacks, such as remote code execution or denial of service. Since these functions do not check if the destination buffer can accommodate the source data, exceeding buffer boundaries can overwrite adjacent memory and potentially alter the program's execution path. Avoiding these functions or replacing them with safer alternatives like strncpy() and strncat(), which require specifying the size limit, is crucial to maintaining security .

An integer overflow vulnerability arises when an arithmetic operation attempts to create a numeric value outside the allowable range for its data type, such as exceeding the maximum value an integer can represent. When this occurs, the value wraps around, leading to unexpected results in calculations. These can be exploited by attackers to cause denial of service, bypass input validation, or execute arbitrary code by manipulating loop counters, buffer sizes, or memory allocations. Proper input validation and using types with a larger range, such as size_t for memory size calculations, are ways to mitigate these vulnerabilities .

Mitigating TOCTOU (Time-of-Check to Time-of-Use) vulnerabilities involves using atomic operations that do not separate the check and use phases, thereby preventing an attacker from altering the file between these operations. File operations should be performed using file descriptors obtained immediately after the check. Additionally, privilege separation, where critical operations are performed in a secure context, can also help manage the risk of TOCTOU vulnerabilities. Implementing proper locking mechanisms to ensure exclusive file access during critical operations is another strategy to minimize the risk .

Access controls and whitelisting play a crucial role in protecting against path traversal attacks by ensuring that only authorized files and directories are accessed by the application. By employing stringent access controls, the application can restrict file operations to only the allowed directories, minimizing the risk of unauthorized access. Whitelisting further strengthens this by explicitly allowing only specific files and resources to be accessed, thereby preventing attackers from exploiting path traversal sequences to navigate the filesystem maliciously. These measures limit the effectiveness of any malicious inputs attempting to manipulate file paths .

Using parameterized queries enhances SQL database security by separating the SQL code from the data being provided. This distinction ensures that user inputs are treated strictly as data and not as part of the SQL command. By forcing the database engine to treat input data as parameters, the risk of SQL injection attacks is minimized, since the input cannot alter the execution or logic of the SQL queries. This approach effectively blocks malicious strings that attackers might introduce to manipulate the database .

To avoid memory leaks in dynamic memory allocation, it is essential to ensure that all memory allocated with functions like malloc() is eventually freed using free() before the program terminates. Programmers should implement comprehensive error handling to free allocated memory in all code execution paths, including error conditions. Additionally, using flags or reference count mechanisms can assist in preventing double free errors, which can also lead to security vulnerabilities .

Input validation is crucial in preventing SQL injection attacks because it ensures that the parameters inserted into SQL queries do not contain harmful SQL code. By validating input, only alphanumeric characters are allowed, and any harmful sequences, such as those that could allow directory traversal or manipulation of SQL commands, are sanitized. This practice prevents attackers from injecting malicious SQL code through user inputs, thereby protecting the database from unauthorized access or data manipulation .

Verifying that a pointer is NULL before dereferencing it is critical because dereferencing a NULL pointer typically results in a segmentation fault, causing the program to crash. This checking prevents runtime errors and increases program stability. Additionally, failure to check for a NULL pointer can lead to undefined behavior, which malicious actors could exploit. Ensuring that a pointer is non-NULL before accessing its data is a fundamental practice in robust software development .

Improper validation of environmental variables can lead to security vulnerabilities by allowing attackers to manipulate the execution environment of an application. If an application reads an environmental variable, such as TERM, without verifying its length or content, it can lead to buffer overflows or path traversal vulnerabilities. This lack of validation can be exploited to inject or execute arbitrary code, escalate privileges, or trigger denial-of-service attacks. Ensuring that environmental variables are validated and sanitized is essential for secure application development .

También podría gustarte