Identificación de Etapas Del Ciclo de Desarrollo de Software Donde La Implementación de Medidas de Seguridad Es Crítica
Identificación de Etapas Del Ciclo de Desarrollo de Software Donde La Implementación de Medidas de Seguridad Es Crítica
Identificación de Etapas Del Ciclo de Desarrollo de Software Donde La Implementación de Medidas de Seguridad Es Crítica
net/publication/336425433
CITATIONS READS
0 3,249
1 author:
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Peter Fernandez Graf on 11 October 2019.
Master in Cybersecurity
2
Abstract
El propósito de la tesis es brindar una solución de seguridad informática sencilla
al proceso de desarrollo del software que los programadores utilizan diariamente.
3
Índice
1. Introducción ................................................................................................. 5
2. Presentación del problema .......................................................................... 6
3. Objetivos ...................................................................................................... 9
4. Alcances y limitaciones ................................................................................ 9
5. Ciclo de desarrollo tradicional .................................................................... 10
6. Ciclo seguro ............................................................................................... 15
Requerimientos de seguridad para el SDLC ............................................ 19
¿Cuáles son las desventajas de no incluir seguridad en el análisis? ....... 20
Diseño seguro para el SDLC.................................................................... 21
¿Cuáles son las ventajas de un software diseñado de forma segura? .... 31
Codificación e implementación segura ..................................................... 32
Revisiones de código seguro ................................................................... 36
Penetration testing ................................................................................... 37
7. Herramienta web de seguridad en cada etapa .......................................... 40
8. Conclusiones ............................................................................................. 41
9. Anexos ....................................................................................................... 44
10. Glosario...................................................................................................... 66
11. Bibliografía utilizada ................................................................................... 69
4
1. Introducción
El presente trabajo corresponde al tema de seguridad en el ciclo de desarrollo
de aplicaciones que se utiliza en la actualidad. La inclusión de seguridad al
desarrollar software es una parte fundamental de cada etapa que no siempre se
respeta, sino que por lo general se realizan tests de seguridad al finalizar el
proceso de desarrollo durante la fase de implementación. Esto implica que los
costos para reparar una vulnerabilidad dentro del sistema sean muy elevados en
tiempo y por consecuencia, en dinero.
El propósito de este trabajo es brindar una solución sencilla y eficiente para que
sea utilizada desde el comienzo de cada proyecto y lo acompañe en las
diferentes etapas. A su vez, proveer herramientas para que los usuarios de las
aplicaciones puedan validar mínimos estándares de seguridad.
5
2. Presentación del problema
Distintos informes realizados a nivel mundial destacan a los riesgos de
ciberseguridad como uno de los principales riesgos operativos que enfrentan las
empresas a nivel global.
Con esta definición veamos un ejemplo: un cliente nos solicita la creación de una
aplicación debido a una necesidad específica la cual será solucionada con el
desarrollo de un software. Lo que realiza un programador o una empresa es
trasladar esta necesidad a una lista de requerimientos, esta etapa es la más
importante y es conocida como análisis.
6
día a día? También necesita saber cómo utilizarán el software, qué tipo de
información necesitan poner en él, así como los resultados que obtendrán de
este.
7
solucionar los errores de seguridad detectados. Esto provocaría un retraso en
los tiempos de entrega. Una vez creados los parches de seguridad la aplicación
deberá ser probada de nuevo hasta que presente un nivel de vulnerabilidad
aceptable o muy bajo. Todo esto sin hablar de la calidad del código que se ha
creado.
8
3. Objetivos
Crear una herramienta web online para desarrolladores de software que les
permita tener a modo de tips lo impresindible para cada fase del ciclo de vida del
software desde el punto de vista de la seguridad.
4. Alcances y limitaciones
Alcances
Limitaciones
9
5. Ciclo de desarrollo tradicional
10
Otras estadísticas muestran que 70% de las organizaciones cree que su riesgo
de seguridad creció considerablemente en el 2017. (Ponemon Institute, 2017)
En el año 2015, 230.000 nuevos malware fueron producidos cada día. (Panda
Security, 2015).
Mundialmente China es uno de los países más infectados con malware en 2015:
11
Imagen 4. SDLC tradicional sin considerar la seguridad
13
• ¿Quién puede estar interesado en atacar nuestra aplicación? (Existen
millones de bots o sistemas automáticos escaneando constantemente
en busca de deficiencias de seguridad)
• La aplicación es segura porque corre detrás de un firewall. (Obviamente
si tiene un elemento hardware de seguridad es más segura, pero este
hecho no implicará nunca que sea segura)
• La aplicación es segura porque usa https. (En este caso la comunicación
es segura pero el desarrollo no tiene porqué serlo)
• Si no corre como administrador, no puedes hacer nada peligroso.
(Obviamente esto es una buena práctica de seguridad, pero que el
usuario tenga pocos privilegios no indica que la aplicación sea segura)
En la mayoría de los casos los clientes están apurados para salir al mercado o
poner algo en producción y se suele escuchar: “No hay tiempo para incluir la
seguridad”.
14
6. Ciclo seguro
Teniendo en cuenta la cantidad de vulnerabilidades descubiertas diariamente y
que en el ciclo vida del desarrollo de software o Systems Development Life Cycle
(SDLC) la seguridad informática no es considerada una parte fundamental o no
es reconocida como una parte imprescindible del proceso del SDLC se plantea
una sistematización de la información disponible en Internet con una visión
general de la solución propuesta al SDLC.
15
Imagen 7. Principios de seguridad informática. Fuente: ticsalborada1. (s.f.)
Es importante que los equipos de desarrollo web entiendan que los controles
desde el lado del cliente, tales como la validación de lo que ingresa el cliente,
campos ocultos y controles en la interfaz (por ejemplo: menús desplegables y
botones de opción) brindan poco, si acaso algún beneficio, desde el punto de
vista de la seguridad. Un atacante puede utilizar herramientas intermediarias
entre las acciones del usuario y el servidor (llamado proxies del lado del cliente,
por ejemplo: OWASP ZAP) o herramientas (como WireShark) de capturas de
paquetes de red (cada uno de los bloques en que se divide la información para
enviar, en el nivel de red) para analizar el tráfico de la aplicación y enviar
solicitudes hechas a medida, sin siquiera pasar por la interfaz. Además de esto,
Flash, Applets de Java y otros objetos del lado del cliente pueden ser
descompilados y analizados en busca de fallas.
17
• El software y su información asociada.
• Los sistemas operativos de los servidores asociados.
• La base de datos del backend.
• Otras aplicaciones en el entorno compartido.
• El sistema del usuario.
• Otro software con el que interactúe el usuario.
18
Imagen 8. Seguridad en el SDLC
19
software. Desde el principio es necesario definir claramente los requerimientos
de seguridad. Algunos ejemplos podrían ser los siguientes:
20
Diseño seguro para el SDLC
Algunos ejemplos a tener en cuenta para el diseño seguro son los siguientes:
Como se puede observar en las líneas que comienzan con doble barra (//) son
comentarios de ayuda para comprender el código.
21
//En la siguiente línea de código se realiza la conexión a la base de datos
$con = mysqli_connect("localhost", "root", "", "densidad");
mysqli_close($con);
22
¿Cómo solucionar el error anterior y que el sistema no muestre datos sensibles
como nombre de tablas y base de datos?
23
El siguiente ejemplo es la demostración del código en la aplicación y cómo
quedaría alterada la sentencia SQL:
return $this->result;
}
SELECT * FROM members WHERE email = ''or '1'='1' and password = ''or '1'='1'
24
La solución al problema de SQL injection se encuentra en el apartado
Codificación e implementación segura (utilizar declaraciones preparadas o
PreparedStatement).
• Diseño de login (utilizar un diseño centrado en usabilidad, pero sin dejar
acceder sin contraseña a los servicios).
Cifrar significa que un texto entendible por las personas será alterado de tal
forma que no sea posible descifrar lo que dice. En la siguiente imagen se puede
apreciar visualmente cómo funcionaría:
//En la siguiente línea se envía el texto a la función encrypt para que sea
cifrado
$encryptado = encrypt($string, $key);
//A continuación imprime el texto cifrado
echo $encryptado;
echo "<br><br>";
//Por último se imprime el texto descifrado
echo decrypt($encryptado, $key);
26
Como ejemplo inseguro de cifrado de la información podemos ver mcrypt. NO
es recomendable utilizar la extensión mcrypt por más que sea compatible con
diferentes algoritmos criptográficos.
El encriptado y desencriptado de datos se realiza mediante el uso de las
funciones mcrypt_encrypt( ) y mcrypt_decrypt( ), respectivamente. En los
comentarios con doble barra (//) se explica el código:
27
Se debe aclarar que es un ejemplo inseguro de funciones de un lenguaje de
programación porque ocasiona un error de software que se produce cuando un
programa no controla adecuadamente la cantidad de datos que se copian
sobre un área de memoria reservada a tal efecto (buffer), de forma que si dicha
cantidad es superior a la capacidad preasignada los bytes sobrantes se
almacenan en zonas de memoria adyacentes, sobrescribiendo su contenido
original. Esto constituye un fallo de programación. Su nombre es conocido
como buffer overflow o desbordamiento de búfer basado en la pila y afecta a
mcrypt 2.6.8 y versiones anteriores, permitiendo a los atacantes remotos
asistidos por el usuario causar una denegación de servicio (bloqueo) y
posiblemente ejecutar código arbitrario a través de un nombre de archivo largo.
Fuente CVE Details (2012).
28
Por ejemplo, los ataques de denegación de servicio son "habituales" para los
piratas informáticos y, en muchos escenarios, pueden activar una cadena de
efectos desastrosa, quebrando uno de los principios de seguridad:
“disponibilidad”.
La integridad en base de datos se refiere a la completitud, la exactitud y la
coherencia del conjunto de datos de una base de datos. Podemos tener una
percepción de esta integridad en base de datos cuando vemos que entre dos
actualizaciones de un registro de datos, no hay ninguna alteración, lo que
significa que los datos están intactos y sin cambios.
En el siguiente ejemplo podemos ver una tabla de base de datos mal diseñada
desde el punto de vista de la seguridad ya que contiene información sensible
como cédula de identidad, datos personales, usuario y contraseña sin cifrar.
29
En consecuencia, si un atacante accede a nuestra base de datos y da un simple
vistazo se puede dar cuenta que tiene toda la información almacenada al alcance
de sus manos de forma sencilla sin necesidad de descifrar los datos.
Continuando con el diseño seguro de una base de datos se debe tener en cuenta
los usuarios que accederán a la información y los privilegios correspondientes
para cada uno. Es muy importante definir los privilegios necesarios para cada
uno de ellos. En el siguiente ejemplo podemos ver cómo crear un usuario:
Por último y necesario será refrescar los permisos con el siguiente comando:
FLUSH PRIVILEGES;
30
¿Cuáles son las ventajas de un software diseñado de
forma segura?
31
Codificación e implementación segura
32
además de prevenir automáticamente ataques de inyección SQL mediante el
escape integrado de comillas y otros caracteres especiales.
//Función en PHP que trae una lista de miembros cuyo nombre contiene el texto
ingresado por el usuario
public function lista($texto)
{
// En la siguiente línea se prepara la sentencia SQL de plantilla para
ejecutarla más tarde
$stmt = $this->getHandle()->prepare('select * from members where nombre
like ? order by nombre;');
// La siguiente línea simplemente agrega los símbolos de porcentaje delante
del texto a buscar y al final.
$texto = '%' . $texto . '%';
// A continuación se vincula la sentencia SQL con el texto a buscar
$stmt->bind_param('s', $texto); // 's' especifica el tipo de variable =>
'string' en este caso. Si se utiliza para números sería 'i' de integer.
// Por último ejecutamos la búsqueda
$stmt->execute();
// $resulta almacena el resultado obtenido de la búsqueda
$result = $stmt->get_result();
return $result;
}
33
• Prohibir funciones no seguras. Investigar el lenguaje de programación en
cuestión y no utilizar funciones que puedan ocasionar un buffer overflow
o desbordamiento de búfer (error de software que se produce cuando un
programa no controla adecuadamente la cantidad de datos que se copian
sobre un área de memoria reservada a tal efecto).
// Hace el hash de la contraseña con una sal única. Esto demuestra buenas
prácticas para el uso de contraseñas cifradas.
$password = hash('sha512', $password . $salt);
if ($stmt->num_rows == 1) {
// Si el usuario existe, revisa si la cuenta está bloqueada por muchos
intentos de conexión. Esto permite evitar ataques de fuerza bruta. La función
utilizada se llama checkbrute:
// La contraseña no es correcta.
// Se graba este intento en la base de datos.
$now = time();
$mysqli->query("INSERT INTO login_attempts(user_id, time)
VALUES ('$user_id', '$now')");
return false;
}
}
} else {
// El usuario no existe.
return false;
}
}
}
35
Revisiones de código seguro
Análisis de código estático y dinámico que trataría, tal y como su nombre indica,
de un análisis del código en estático (mirando el código sin que la aplicación se
esté ejecutando) y un análisis con la aplicación ejecutándose.
36
Penetration testing
Por último, el test de penetración y seguridad que trataría de realizar una
auditoría de hacking ético de seguridad con la finalidad de detectar las
vulnerabilidades y subsanarlas realizando al final una configuración de
seguridad. Este test consiste en pruebas ofensivas contra los mecanismos de
defensa existentes en el sistema y la plataforma en donde se ejecuta (servidor).
Kali Linux
Aunque no es la única, Kali Linux ofrece una distribución de Linux completa
orientada a la auditoría de seguridad informática y el hacking ético. Es una de
las mejores herramientas de intrusión.
37
Nmap (network mapper)
Es un escáner de puertos y nos ofrece respuestas a preguntas como: ¿qué
puerto están abiertos en una máquina? ¿qué es lo que hay detrás de esos
puertos?
Metasploit
Su objetivo es encontrar agujeros de seguridad en todo tipo de redes,
aplicaciones y dispositivos. El uso de Metasploit suele seguir al de nmap (o
similar), una vez el investigador ha accedido a más información sobre tipo de
sistema operativo, aplicación o dispositivo de hardware que se encuentra “al otro
lado”. En caso de querer defender una red corporativa, el uso de Metasploit
puede ser fundamental a la hora de entender dónde se encuentran los eslabones
más débiles.
Wireshark
La herramienta captura tráfico en tiempo real y analiza a nivel “microscópico” qué
es lo que está pasando. Aunque los pentatesters lo utilizan fundamentalmente
para analizar el tráfico a nivel TCP/IP, la herramienta es capaz de analizar
cientos de protocolos, de modo que el investigador pueda conocer qué es
exactamente lo que se está moviendo dentro de una red.
sqlmap
Automatiza el proceso de detectar y explotar fallos y brechas de seguridad en
servidores de base de datos SQL. Permite realizar inyección de código SQL
automáticamente (lo ya mencionado como “SQL Injection”).
38
John the Ripper
Es un programa de criptografía que aplica fuerza bruta para descifrar
contraseñas.
Hydra
Esta herramienta se encarga de descifrar las contraseñas de cualquier servicio
on-line. Para ello tiene soporte para protocolos como SSH, FTP, IMAP, IRC entre
otros.
aircrack-ng
Aircrack-ng es una suite de software de seguridad inalámbrica. Consiste en un
analizador de paquetes de redes, recupera contraseñas WEP y WPA/WPA2-
PSK y otro conjunto de herramientas de auditoría inalámbrica.
Burp Suite
Permite realizar pruebas de seguridad de aplicaciones web. Entre las funciones
básicas se encuentra el servidor proxy que permite inspeccionar y modificar el
tráfico haciendo de intermediario entre el navegador y la aplicación destino, el
escáner de vulnerabilidades que automatiza la detección de varios tipos de
vulnerabilidades de aplicaciones web, el repetidor se utiliza para modificar y
reenviar solicitudes individuales al servidor, y muchas otras funcionalidades.
39
7. Herramienta web de seguridad en cada
etapa
Una forma de contribuir a la implementación de un ciclo seguro del SDLC es
publicando información como tips o ejemplos que evidencien las buenas
prácticas para un software seguro en la actualidad. Una herramienta web
accesible por muchos usuarios es ideal para este fin.
El principal objetivo es que los usuarios de esta web puedan ver también los
ejemplos demostrados en esta documentación más otros que se vallan
publicando a medida que pase el tiempo. Siempre actualizando la web con las
mejores prácticas de seguridad.
40
8. Conclusiones
Como conclusiones generales de la tesis observamos que las compañías de
software actuales están comenzando a comprender que la identificación y
remediación temprana de problemas posee un costo inversamente proporcional
al tiempo que la vulnerabilidad permanece en el sistema.
Evitará que la información del cliente sea robada o que la red sea comprometida
lo que resultaría en un desastre para su negocio.
41
Todos los empleados, en todos los niveles organizacionales, deben tener
entrenamiento, deben tener conocimiento de los programas de seguridad
existentes en la organización y colaborar, en el marco de sus funciones y
habilidades para mantenerla.
El análisis del código fuente también es muy importante. Los entornos ágiles que
buscan actualizarse a un SDLC seguro son el lugar perfecto para implementar el
análisis del código fuente. Una sólida herramienta de análisis de código fuente
ofrece las ventajas de escaneo incremental de código, escaneo de múltiples
idiomas, informes rápidos y asistencia a desarrolladores para mitigar
vulnerabilidades en su código. Con el análisis del código fuente, las aplicaciones
pueden ser protegidas incluso antes de estar en producción, aunque después de
la producción, la seguridad continúa siendo muy importante.
El siguiente paso sería la implementación del SDLC seguro junto con el uso de
herramientas que automaticen el análisis del código estático y dinámico para
cumplir con todo el proceso de buenas prácticas, sin olvidar la mejora continua
de la seguridad.
43
9. Anexos
Guía de referencia para prácticas de codificación segura de OWASP: esta
guía se integra como anexo ya que es muy importante y abarca muchos aspectos
técnicos que permitirán a un desarrollador de software la utilización de las
buenas prácticas en todos los aspectos del desarrollo de software. La misma se
orienta al ambiente web, pero es fácilmente aplicable a otras plataformas como
por ejemplo aplicaciones de escritorio (Windows).
Validación de entradas
44
10. Validar datos redireccionados (un atacante puede enviar contenido malicioso
directamente en el destino de la redirección, eludiendo entonces la lógica de
la aplicación y cualquier otra validación realizada antes de la redirección).
11. Validar tipos de datos no esperados.
12. Validar rangos de datos.
13. Validar largos de datos.
14. Validar toda entrada con una lista “blanca” que contenga una lista de
caracteres aceptados, siempre que sea posible.
15. Si es necesario, permitir el ingreso de algún carácter considerado peligroso,
asegúrese de implementar controles adicionales tales como la codificación
de la salida, API de seguridad y el registro del uso de tales datos a lo largo
de la aplicación. Entre los ejemplos de caracteres peligrosos podemos
encontrar: < > ” ’ % ( ) & + \ / \’ \”.
16. Si su rutina estándar de validación no contempla el ingreso de los ejemplos
de datos anteriormente ejemplificados, entonces deberán verificarse de
forma puntual.
17. Compruebe si hay bytes nulos (%00).
18. Compruebe si hay caracteres de nueva línea (%0d, %0a, \r, \n).
19. Compruebe si hay caracteres de alteraciones de ruta “punto, punto, barra (../
o ..\). En los casos en que se soportan sets de caracteres UTF-8 extendidos,
implemente representaciones alternativas tales como: %c0%ae%c0%ae/
(utilice la canonicalización como forma de implementar la doble codificación
u otras formas de ofuscación de ataques).
45
Codificación de salidas
46
Administración de autenticación y contraseñas
26. Requerir autenticación para todos los recursos y páginas excepto aquellas
específicamente clasificadas como públicas.
27. Todos los controles de autenticación deben ser efectuados en un sistema en
el cual se confíe. (por ejemplo: el servidor).
28. Establecer y utilizar servicios de autenticación estándares y probados cuando
sea posible.
29. Utilizar una implementación centralizada para todos los controles de
autenticación, incluyendo librerías que llamen a servicios externos de
autenticación.
30. Segregar la lógica de la autenticación del recurso solicitado y utilizar
redirección desde y hacia el control centralizado de autenticación.
31. Todos los controles de autenticación deben fallar de una forma segura.
32. Todas las funciones administrativas y de administración de cuentas deben
ser al menos tan seguras como el mecanismo primario de autenticación.
33. Si la aplicación administra un almacenamiento de credenciales, se debe
asegurar que únicamente se almacena el hash con sal (salty hash) de las
contraseñas y que el archivo/tabla que guarda las contraseñas y claves solo
puede ser escrito por la aplicación (si es posible, no utilizar el algoritmo de
hash MD5).
34. El hash de las contraseñas debe ser implementado en un sistema en el cual
se confíe. (por ejemplo: el servidor).
35. Validar los datos de autenticación únicamente luego haber completado todos
los datos de entrada, especialmente en implementaciones de autenticación
secuencial.
36. Las respuestas a los fallos en la autenticación no deben indicar cual parte de
la autenticación fue incorrecta. A modo de ejemplo, en lugar de “usuario
invalido” o “contraseña invalida”, utilizar “usuario y/o contraseña inválidos” en
ambos casos. Las repuestas a los errores deben ser idénticas tanto a nivel
de lo desplegado como a nivel de código fuente.
37. Utilizar autenticación para conexiones a sistemas externos que involucren
información o funciones sensibles.
47
38. Las credenciales de autenticación para acceder a servicios externos a la
aplicación deben ser encriptados y almacenados en ubicaciones protegidas
en un sistema en el cual se confíe (ejemplo: el servidor). El código fuente NO
es una ubicación segura.
39. Utilizar únicamente pedidos del tipo HTTP POST para la transmisión de
credenciales de autenticación.
40. Utilizar únicamente conexiones encriptadas o datos encriptados para el envío
de contraseñas que no sean temporales (por ejemplo: correo encriptado).
Contraseñas temporales como aquellas asociadas con reseteos por correo
electrónico, pueden ser una excepción.
41. Hacer cumplir por medio de una política o regulación los requerimientos de
complejidad de la contraseña. Las credenciales de autenticación deben ser
suficientes como para resistir aquellos ataques típicos de las amenazas en el
entorno del sistema. Ej.: obligar el uso de combinaciones de caracteres
numéricos/alfanuméricos y/o caracteres especiales.
42. Hacer cumplir por medio de una política o regulación los requerimientos de
longitud de la contraseña. Comúnmente se utilizan ocho caracteres, pero
dieciséis es mejor, adicionalmente considerar el uso de frases de varias
palabras.
43. No se debe desplegar en la pantalla la contraseña ingresada. A modo de
ejemplo, en formularios web, utilizar el tipo de entrada “password” (input type
“password”).
44. Deshabilitar las cuentas luego de un número establecido de intentos inválidos
de ingreso al sistema. A modo de ejemplo, cinco intentos fallidos es lo común.
La deshabilitación de la cuenta debe ser por un periodo de tiempo suficiente
como para desalentar una inferencia de credenciales por fuerza bruta, pero
no tan alto como para permitir un ataque de negación de servicio.
45. El cambio y reinicio de contraseñas requieren los mismos niveles de control
como aquellos asociados a la creación y autenticación de cuentas.
46. Las preguntas para el reinicio de contraseñas deben contemplar un amplio
rango de respuestas aleatorias. A modo de ejemplo: “libro favorito?” es una
mala pregunta dado que “la biblia” es una respuesta muy común.
48
47. Si se utiliza un reinicio de contraseña por correo electrónico, únicamente
enviar un link o contraseñas temporales a casillas previamente registradas
en el sistema.
48. Las contraseñas y links temporales deben tener un corto periodo de validez.
49. Forzar el cambio de contraseñas temporales luego de su utilización.
50. Notificar a los usuarios cada vez que se produce un reinicio de contraseña.
51. Prevenir la reutilización de contraseñas.
52. Las contraseñas deben tener al menos un día de antigüedad antes de poder
ser cambiadas, de forma de evitar ataques de reutilización de contraseñas.
53. Hacer cumplir por medio de una política o regulación los requerimientos de
cambio de contraseña. Los sistemas críticos pueden requerir cambios más
frecuentes que otros sistemas. El tiempo entre cada reseteo debe ser
controlado administrativamente.
54. Deshabilitar la funcionalidad de “recordar” campos de contraseñas.
55. El último acceso (fallido o exitoso) debe ser reportado al usuario en su
siguiente acceso exitoso.
56. Implementar un monitoreo para identificar ataques a múltiples cuentas
utilizando la misma contraseña. Este patrón de ataque es utilizado para
superar bloqueos estándar cuando los nombres de usuario pueden ser
obtenidos o adivinados de alguna forma.
57. Cambiar todos los usuarios y contraseñas por defecto o deshabilitar las
cuentas asociadas.
58. Re autenticar usuarios antes de la realización de operaciones críticas.
59. Utilizar autenticación multi-factor para las cuentas más sensibles o de mayor
valor.
60. Si se utiliza un código de una tercera parte para la autenticación,
inspeccionarlo minuciosamente para asegurar que no se encuentre afectado
por cualquier código malicioso.
49
Administración de sesiones
61. Utilizar los controles del servidor o del framework para la administración de
sesiones. La aplicación solo debe reconocer estos identificadores como
válidos.
62. La creación de identificadores de sesión solo debe ser realizada en un
sistema en cual se confíe (por ejemplo: el servidor).
63. Los controles de administración de sesiones deben utilizar algoritmos que
generen identificadores suficientemente aleatorios.
64. Definir el dominio y ruta para las cookies que contienen identificadores de
sesión autenticados con un valor apropiadamente estricto para el sitio.
65. La función de logout debe terminar completamente con la sesión o conexión
asociada.
66. La función de logout debe estar disponible en todas las páginas protegidas
por autenticación.
67. Establecer un tiempo de vida de la sesión lo más corto posible, balanceando
los riesgos con los requerimientos del negocio. En la mayoría de los casos,
nunca debería ser superior a varias horas.
68. Deshabilitar logeos persistentes y efectuar finalizaciones periódicas de
sesiones, incluso cuando la sesión se encuentra activa.
69. Si una sesión fue establecida antes del login, cerrar dicha sesión y establecer
una nueva luego de un login exitoso.
70. Generar un nuevo identificador de sesión luego de cada re-autenticación.
71. No permitir logeos concurrentes con el mismo usuario.
72. No exponer identificadores de sesión en URLs, mensajes de error ni logs. Los
identificadores de sesión solo deben ser ubicados en la cabecera de la cookie
HTTP. A modo de ejemplo, no transmitir el identificador de sesión como un
parámetro GET.
73. Proteger la información sobre las sesiones del lado del servidor
implementando los controles de acceso apropiados.
74. Generar un nuevo identificador de sesión y desactivar el anterior de forma
periódica. De esta forma se pueden mitigar algunos escenarios de robo de
sesiones donde el identificador se compromete.
50
75. Generar un nuevo identificador de sesión si la seguridad cambia de HTTP a
HTTPS, como puede suceder durante la autenticación. Dentro de la
aplicación es recomendable usar siempre HTTPS en lugar de cambiar entre
HTTP y HTTPS.
76. Manejo de sesión complementario para operaciones sensible del lado del
servidor, como pueden ser: gestión de cuentas o utilizando tokens o
parámetros por sesión. Este método puede ser utilizado para prevenir
ataques de Cross Site Request Forgery Attacks (Falsificación de petición en
sitios cruzados, conocido por sus siglas CSRF).
77. Manejo de sesión complementario para operaciones sensible o críticas
utilizando tokens o parámetros por pedido (per request) en lugar de por
sesión.
78. Configurar el atributo “seguro” para las cookies transmitidas sobre una
conexión TLS.
79. Configurar las cookies con el atributo HttpOnly, salvo que se requiera
específicamente scripts del lado del cliente en la aplicación, para leer o
configurar una cookie.
51
Control de Acceso
80. Utilizar únicamente objetos confiables del sistema. (por ejemplo: objetos de
sesión del servidor para la toma de decisiones de autorización).
81. Utilizar un único componente para el chequeo de autorizaciones para todo el
sitio. Esto incluye librerías que llamen a servicios de autorización externos.
82. Los controles de acceso en caso de falla deben actuar en forma segura.
83. Denegar todos los accesos en caso de que la aplicación no pueda acceder a
la información de configuración de seguridad.
84. Requerir controles de autorización en cada solicitud o pedido, incluyendo
aquellos creados por scripts en el servidor, “includes” y pedidos desde AJAX
o Flash desde el lado del cliente.
85. Separar lógica privilegiada de otro código de la aplicación.
86. Restringir acceso a ficheros u otros recursos, incluyendo aquellos fuera del
control directo de la aplicación, únicamente a usuarios autorizados.
87. Restringir el acceso a URLs protegidas, solo a usuarios autorizados.
88. Restringir el acceso a funciones protegidas, solo a usuarios autorizados.
89. Restringir las referencias directas a objetos, solo a usuarios autorizados.
90. Restringir el acceso a servicios, solo a usuarios autorizados.
91. Restringir el acceso a información de la aplicación, solo a usuarios
autorizados.
92. Restringir el acceso a usuario, atributos y política de información utilizada por
los controles de acceso.
93. Restringir el acceso a información relevante de la configuración, solo a
usuarios autorizados.
94. Las reglas de control de acceso implementadas del lado del servidor y en la
capa de presentación, deben coincidir.
95. Si existen datos de estado que deben ser guardados en el cliente, use cifrado
y chequeos de integridad del lado del servidor para poder evaluar el estado.
96. Requerir flujos de aplicación que cumplan con las reglas del negocio.
97. Limitar el número de transacciones que un usuario común o un dispositivo
puede desarrollar en un cierto período de tiempo.
52
98. Utilizar el header “referer” solo como un chequeo complementario. Nunca
debe ser utilizado como chequeo de autorización, ya que es posible
modificarlo.
99. Si sesiones de autenticación extensas son permitidas, periódicamente hay
que revalidar la autorización de los usuarios y asegurar que sus privilegios no
han sido modificados.
100. Implementar auditorías de cuentas y requerir que se deshabiliten las
contraseñas de las cuentas.
101. La aplicación debe permitir deshabilitar y terminar cuentas una vez que se
termina la autorización (cambio de rol, estatus de empleo, etc.).
102. Cuentas de servicio o cuentas soportando conectividad deben tener el
mínimo privilegio.
103. Crear una política de control de acceso para documentar las reglas del
negocio de la aplicación, los tipos de datos, criterios para autorización de
acceso y los controles asociados para otorgarlos y controlarlos. Esto incluye
la identificación de accesos requeridos tanto para los datos como para los
sistemas.
53
Prácticas Criptográficas
54
Manejo de errores y Logs
55
128. Registrar en un log todos los intentos de conexión con tokens inválidos o
vencidos.
129. Registrar en un log todas las excepciones del sistema.
130. Registrar en un log todas las funciones administrativas, incluyendo
cambios en la configuración de seguridad.
131. Registrar en un log, todas las fallas de conexión de TLS.
132. Registrar en un log las fallas de los módulos criptográficos.
133. Utilizar una función de hash para validar la integridad de los logs.
56
Protección de datos
57
144. La aplicación debe de soportar la eliminación de datos sensibles cuando
los datos ya no son requeridos (por ejemplo: información personal o ciertos
datos financieros).
145. Implementar controles de accesos apropiados para los datos sensibles
almacenados en el servidor. Esto incluye memoria temporal, archivos
temporales y datos que solamente puedan ser accedidos por usuarios
específicos del sistema.
58
Configuración de los sistemas
154. Asegurarse de que los servidores, los frameworks y los componentes del
sistema están corriendo la última versión aprobada.
155. Hay que asegurar que los servidores, los frameworks y los componentes
del sistema están actualizados con todos los parches emitidos para las
versiones en uso.
156. Deshabilitar el listado de directorio.
157. Restringir el servidor web, los procesos y las cuentas de servicios con el
mínimo privilegio posible.
158. Cuando ocurra una excepción, se debe de fallar seguro.
159. Remover todas las funcionalidades y archivos que no sean necesarios.
160. Remover código de testeo o cualquier funcionalidad que no sea tenida en
cuenta en producción, previo a realizar la puesta en producción.
161. Prevenir la revelación de la estructura de directorios en el archivo
robots.txt colocando directorios que estén disponibles para el índice público
en un directorio raíz aislado. Luego “Deshabilitar” el directorio raíz en el
archivo robots.txt en vez de “Deshabilitar” cada directorio individual.
162. Definir cuáles de los métodos HTTP, GET o POST, la aplicación va a
soportar y si deben de ser manejados de forma diferente en las distintas
páginas de la aplicación.
163. Deshabilitar métodos HTTP innecesarios como extensiones WebDAV. Si
una extensión del método HTTP que soporte manejo de archivos es
necesaria, utilice un mecanismo de autenticación bien comprobado.
164. Si el servidor web maneja HTTP 1.0 y HTTP 1.1, asegurarse que ambos
están configurados de manera similar o asegurarse de entender bien las
diferencias que puedan existir (por ejemplo: el manejo de métodos
extendidos de HTTP).
165. Remover información innecesaria en los cabezales de HTTP de respuesta
referidas al SO, versión del servidor web y frameworks de aplicación.
166. La configuración de seguridad de donde se encuentra almacenada la
aplicación debe de ser listada en un formato legible para su auditoría.
59
167. Implementar un Sistema de Manejo de Activos y registrar los
componentes del sistema en él.
168. Aislar los ambientes de desarrollo de los ambientes de producción y
permitir el acceso solamente a los grupos de desarrollo y testeo
específicamente autorizados. Los ambientes de desarrollo a menudo son
configurados de forma menos segura que los ambientes de producción y los
atacantes pueden utilizar estas diferencias para descubrir vulnerabilidades o
como un camino para poder explotarlas.
169. Implementar un Sistema de Control de Cambios del Software para
manejar y registrar los cambios al código tanto para los ambientes de
desarrollo como para los de producción.
60
Seguridad de Base de Datos
61
Manejo de Archivos
62
195. Asegúrese que los archivos y recursos de la aplicación sean de solo
lectura.
196. Revise los archivos transferidos por los clientes en busca de virus y
malware.
Manejo de Memoria
63
Practicas Generales para la Codificación
206. Para las tareas habituales, utilice código probado y verificado en lugar de
crear códigos específicos.
207. Utilice las APIs previstas para el acceso a funciones específicas del
sistema operativo. No permita que la aplicación ejecute comandos
directamente en el sistema operativo, menos aún mediante la invocación de
una shell.
208. Utilizar funciones de control de integridad (hash, CRC o checksum) para
verificar la integridad del código interpretado, bibliotecas, ejecutables y
archivos de configuración previo a su utilización.
209. Utilice locks para evitar múltiples accesos simultáneos a los recursos o
mecanismos de sincronización (por ejemplo: semáforos) para evitar
condiciones de borde (race conditions).
210. Proteja las variables y recursos compartidos de accesos concurrentes
inadecuados.
211. Explícitamente inicialice todas las variables y mecanismos de
almacenamiento de información (por ejemplo: buffers), durante su
declaración o antes de usarlos por primera vez.
212. Las aplicaciones que requieran privilegios especiales deberán elevar los
privilegios solo cuando sea necesario y devolverlos (bajar privilegios) lo antes
posible. Mantener los privilegios especiales únicamente cuando sea
estrictamente necesario.
213. Evitar errores de cálculo comprendiendo la forma en que el lenguaje de
programación maneja las operaciones matemáticas y las representaciones
numéricas. Prestar especial atención a las discrepancias en la cantidad de
bytes utilizados para la representación, la precisión, diferencias entre valores
con y sin signo, truncamiento, conversiones y casting entre tipos de variables,
cálculos “no-numéricos” y como el lenguaje maneja los números demasiado
grandes o demasiado pequeños para su representación.
214. No utilizar datos provistos por el usuario para ninguna función dinámica.
215. Evite que los usuarios introduzcan o modifiquen código de la aplicación.
64
216. Revisar todas las aplicaciones secundarias, código provisto por terceros
y bibliotecas para determinar la necesidad del negocio para su utilización y
validar el funcionamiento seguro, ya que estos pueden introducir nuevas
vulnerabilidades.
217. Implementar mecanismos seguros para las actualizaciones. Si la
aplicación realiza actualizaciones automáticas, utilizar firmas criptográficas
para el código y asegurarse que el cliente que descarga la aplicación verifique
dichas firmas. Utilizar canales encriptados para las transferencias de código
desde el servidor de actualización.
65
10. Glosario
66
Consultas parametrizadas (prepared statements): Mantiene la consulta y los
datos separados a través del uso de marcadores. La estructura de la consulta es
definida utilizando marcadores, la consulta SQL es enviada a la base de datos y
preparada, para luego ser combinada con los valores de los parámetros. Esto
previene a las consultas de ser alteradas debido a que los valores de los
parámetros son combinados con la consulta compilada y con el string de SQL.
Control de Acceso: Un conjunto de controles que permiten o niegan el acceso
a un recurso de un usuario o entidad dado.
Datos del registro de log o logs: Debe incluir lo siguiente:
• Time stamp obtenida de un componente confiable del sistema
• Nivel de severidad para cada evento
• Marcado de eventos relevantes a la seguridad, si se encuentran
mezclados con otras entradas de la bitácora
• Identidad de la cuenta/usuario que ha causado el evento
• Dirección IP del origen asociado con el pedido
• Resultado del evento (suceso o falla)
• Descripción del evento
Disponibilidad: Medida de Accesibilidad y Usabilidad del sistema.
Falsificación de petición en sitios cruzados (CSRF): Una aplicación externa
o sitio web fuerza a un cliente a realizar un pedido a otra aplicación en la que el
cliente posee una sesión activa. Las Aplicaciones son vulnerables cuando
utilizan parámetros o URLs predecibles o conocidas y cuando el navegador
transmite automáticamente toda la información de sesión con cada pedido a la
aplicación vulnerable.
Gestión de sesión: Conjunto de controles que ayudan a asegurar que la
aplicación web maneja las sesiones HTTP de forma segura.
Mitigar: Pasos tomados para reducir la severidad de una vulnerabilidad. Estos
pueden incluir remover una vulnerabilidad, hacer una vulnerabilidad más difícil
de explotar, o reducir el impacto negativo de una explotación exitosa.
Prácticas Criptográficas: Conjunto de controles que aseguran que las
operaciones de criptografía dentro de la aplicación son manejadas de manera
segura.
67
Protección de datos: Conjunto de controles que ayudan a asegurar que el
software maneja de forma segura el almacenamiento de la información.
Requerimiento de Seguridad: Conjunto de requerimientos funcionales y de
diseño que ayudan a asegurar que el software se construye y despliega de forma
segura.
Sanitizar: El proceso de hacer seguros datos potencialmente peligrosos a través
de la utilización de remoción, reemplazo, codificación o "escaping" de los
caracteres que lo componen.
Seguridad de Base de Datos: Conjunto de controles que aseguran la
interacción del software con la base de datos de una forma segura y que la base
de datos se encuentra configurada de forma segura.
Seguridad de Comunicaciones: Conjunto de controles que ayudan a asegurar
que el software maneja de forma segura el envío y la recepción de datos.
Sistema: Término genérico que cubre sistemas operativos, servidores web,
frameworks de aplicaciones e infraestructura relacionada.
Validación de entrada: Conjunto de controles que verifican que las propiedades
de los datos ingresados coinciden con las esperadas por la aplicación,
incluyendo tipos, largos, rangos, conjuntos de caracteres aceptados excluyendo
caracteres peligrosos conocidos.
Vulnerabilidad: Debilidad en un sistema que lo hace susceptible a ataque o
daño.
Inyección SQL: método de infiltración de código intruso que se vale de una
vulnerabilidad informática presente en una aplicación en el nivel de validación de
las entradas para realizar operaciones sobre una base de datos.
68
11. Bibliografía utilizada
69
PHP: Manual de PHP – Manual (2019, Sep 30) [Online]. Disponible:
http://www.php.net/manual/es/index.php.
Créditos:
Para el desarrollo de pruebas donde se ejemplifica el código utilizado más
diagramas realizados, se utilizaron las siguientes herramientas:
Creately: https://creately.com/
PHPStorm: https://www.jetbrains.com/phpstorm/
WampServer: http://www.wampserver.com/en/
70