Documento revisado el
01/01/2023
Seguridad en el desarrollo
Introducción
La interfaz de seguridad consiste en las actividades relacionadas propiamente con la seguridad tanto
del sistema de información como del desarrollo. Dicha interfaz incluye:
- Definición (o integración) de la política de seguridad
- Clasificación de los documentos generados
- Evaluación de riesgos de las arquitecturas
- Creación de recomendaciones y obligaciones
- Evaluación de seguridad de las posibles alternativas
- Selección de los controles de seguridad que se van a implementar
- Definir los criterios de aceptación de seguridad a la hora de hacer pruebas
- Elaborar un plan de formación de seguridad
- Revisar las medidas de seguridad del entorno de ejecución (lo más recomendable Docker)
- Estudiar los resultados de las pruebas
- Estudiar las peticiones de cambio en el proceso de mantenimiento
- ...
Principios
Los ocho principios de diseño vigentes (mirar OWASP) son los siguientes:
Economía Del Mecanismo
Seguridad simple y sin complicaciones innecesarias
Valores Predeterminados Seguros
Denegar por defecto
Mediación Completa
Comprobar la autorización de cada intento de acceso
Diseño Abierto
No buscar la “seguridad mediante la oscuridad”. Se asume que el atacante conoce todo el
sistema.
Separación De Privilegios
“Requerir dos llaves para abrir una puerta”. Distribuir las llaves a otras personas
Mínimo Privilegio
No damos más permisos de los necesarios para hacer una función
Mínimo Mecanismo Común
Reducir la cantidad de recursos compartidos
Aceptabilidad Psicológica o KISS (Keep It Simple and for Stupids)
Todos los principios no deben hacer que el sistema sea difícil de usar o molesto. Esto
incrementará los errores en usuarios.
Documento revisado el
01/01/2023
Principales vulnerabilidades
Las principales vulnerabilidades que podemos encontrar en un código son:
Buffer Overflow (Desbordamiento de búfer) - Sobre todo en C
El código lee una cantidad de datos superior a la que la variable en la que se debe almacenar es
capaz de soportar provocando que se sobrescriban zonas de memoria contiguas.
SQL Injection (Inyección SQL) - En SQL y cualquier campo de consulta
El código construye sentencias SQL a partir de argumentos que se les pasen. Emplean trucos en
la sintaxis para cambiar el significado de la sentencia SQL original permitiendo acceder a datos
de forma no autorizada, acceder sin claves correctas o borrar información de las BBDD entre
otros.
Path Traversal – En aplicaciones web fundamentalmente
Mediante la modificación de la URL y si no se tienen los filtros adecuados se permite el acceso
directo a un objeto del cual no se tiene autorización.
Remote File Inclusion (Inclusión de ficheros remotos) - Cualquier campo que
almacene ficheros
El fichero que se sube incluye y ejecuta un código de manera dinámica permitiendo tener acceso
al sistema desde el exterior.
XSS (Cross-site scripting) - Sobre todo en JavaScript
Se pasa como argumento a un campo con una función JS una cadena que pueda ser ejecutada
por el navegador siendo este argumento un código malicioso
XSRF (Cross-site request forgery) - Sobre todo en JavaScript y una vez logeado
En este ataque, un atacante usa la confianza que un sitio web tiene en un usuario para realizar
acciones no autorizadas en ese sitio web en su nombre. Se consigue incluyendo un enlace o un
formulario en una web maliciosa que, cuando accede un usuario autenticado en el sitio web
legítimo, realiza una acción no deseada en ese sitio web. Este tipo de ataque se puede emplear
para, por ejemplo, hacer que que se produzca una transferencia bancaria sin que el usuario lo
sepa
Demasiada información - En el código, sobre todo
El código da más información de la cuenta (pueden ser comentarios, mensajes de error muy
detallados o mensajes de información dependiendo de las entradas que se den). Por ejemplo, en
un formulario de login, en vez de indicar “usuario no encontrado” o “clave incorrecta” se debe
emplear “autenticación incorrecta”.
Mal uso de la criptografía - En el código, sobre todo
Esto puede suceder de muchas maneras siendo las principales:
- Almacenar datos sensibles en texto plano
- Mediante el uso de algoritmos inventados y no los estándares
- Confundir entre codificar y encriptar
- Mala gestión de claves
o Permitir que todo el mundo lea el fichero de configuración
o Backups sin cifrar